当前位置: 首页 > news >正文

移动端1px-从基本原理到开源解决方案介绍

 1px 不够准确,应该说成 1 物理像素

  • 为什么有 1px 这个问题?
  • 实现 1px 有哪些方法?这些方法分别有哪些优缺点?
  • 开源项目中使用的哪些解决方案?
  • 如何在项目中处理 1px 的相关问题?

基本概念

首先,我们要了解两个概念,一个是像素(pixel)可以简写为px,另外一个是设备像素比(DPR)

像素 :指在由一个数字序列表示的图像中的一个最小单元,单位是 px,不可再次分割了。设备像素比(DPR): 设备像素比 = 设备像素 / 设备独立像素。
复制代码

下面我来简单解释下几个概念

  • CSS 像素 (虚拟像素):指的是 CSS 样式代码中使用的逻辑像素,在 CSS 规范中,长度单位可以分为两类,绝对单位以及相对单位。px 是一个相对单位,相对的是设备像素。
  • 设备像素 (物理像素):指设备能控制显示的最小物理单位,意指显示器上一个个的点。从屏幕在工厂生产出的那天起,它上面设备像素点就固定不变了,和屏幕尺寸大小有关。
  • 设备独立像素 (逻辑像素):可以认为是计算机坐标系统中的一个点,这个点代表一个可以由程序使用的虚拟像素(比如: CSS 像素),这个点是没有固定大小的,越小越清晰,然后由相关系统转换为物理像素。

也就是说,当逻辑像素是 1pt 时,在 DPR 为 2 的 设备上显示为 2px 的物理像素

参考数据

各种类型的 iphone 手机屏幕设备的参数

吃透移动端 1px,从基本原理到开源解决方案

注:这里的缩放因子呢,就是 DRP 的值

设计稿对比数据

吃透移动端 1px,从基本原理到开源解决方案

会有人好奇,为什么设计稿上显示是 750x1334 呢,这是因为设计稿是显示的物理像素

而我们 css 中的像素是逻辑像素应该为 375x 667,在编写代码时要将自定义宽度设置成 375px

吃透移动端 1px,从基本原理到开源解决方案

那么此时设计稿上的 1px 宽度实际代表的 css 参数应该是 0.5px 对应物理像素 1px,那么怎么实现这个物理像素为 1px 呢

实践

归根结底有两种方案,一种是利用 css 中的transfrom:scaleY(0.5),另一种是设置 媒体查询根据不同 DPR 缩放

解决方案一

原理

利用 css 的 伪元素::after + transfrom 进行缩放

为什么用伪元素? 因为伪元素::after或::before是独立于当前元素,可以单独对其缩放而不影响元素本身的缩放

伪元素大多数浏览器默认单引号也可以使用,和伪类一样形式,而且单引号兼容性(ie)更好些

实现

<div class="cell border-1px"> cell <div><style>
.cell {width: 100px;height: 100px;
}
<!--全部边框-->
.border-1px:after {content: '';position: absolute;box-sizing: border-box;top: 0;left: 0;width: 200%;height: 200%;border: 1px solid #000;border-radius: 4px;-webkit-transform: scale(0.5);transform: scale(0.5);-webkit-transform-origin: top left;
}<!--单边框,以上边框为例-->
.border-1px-top:before {content: "";position: absolute;top: 0;left: 0;right: 0;border-top: 1px solid red;transform: scaleY(.5);transform-origin: left top;
}
</style>

解决方案二(升级方案一)

原理

使用 less 对公共代码(方案一)封装,同时增加媒体查询分别对不同 DPR 的设备,进行不同的缩放

.border(@borderWidth: 1px; @borderStyle: solid; @borderColor: @lignt-gray-color; @borderRadius: 0) {position: relative;&:before {content: '';position: absolute;width: 98%;height: 98%;top: 0;left: 0;transform-origin: left top;-webkit-transform-origin: left top;box-sizing: border-box;pointer-events: none;}@media (-webkit-min-device-pixel-ratio: 2) {&:before {width: 200%;height: 200%;-webkit-transform: scale(.5);}}@media (-webkit-min-device-pixel-ratio: 2.5) {&:before {width: 250%;height: 250%;-webkit-transform: scale(.4);}}@media (-webkit-min-device-pixel-ratio: 2.75) {&:before {width: 275%;height: 275%;-webkit-transform: scale(1 / 2.75);}}@media (-webkit-min-device-pixel-ratio: 3) {&:before {width: 300%;height: 300%;transform: scale(1 / 3);-webkit-transform: scale(1 / 3);}}.border-radius(@borderRadius);&:before {border-width: @borderWidth;border-style: @borderStyle;border-color: @borderColor;}
}.border-all(@borderWidth: 1px; @borderStyle: solid; @borderColor: @lignt-gray-color; @borderRadius: 0) {.border(@borderWidth; @borderStyle; @borderColor; @borderRadius);
}

其他方案:

  • 使用图片:兼容性最好,灵活行最差,不能改变颜色、长度
  • 使用 viewport 和 rem,js 动态改变 viewport 中 scale 缩放,缺点在于不适用于已有的项目,例如:使用 vh 和 vw 布局的
<meta name="viewport" id="WebViewport" 
content="initial-scale=1, maximum-scale=1, 
minimum-scale=1, user-scalable=no"> 
  • 使用 css 渐变linear-gradient或者box-shadow

上述 3 种方案均有致命缺陷暂不推荐使用

兼容性

最后看一下兼容性如何,主要是伪元素、transform:scale 和min-device-pixel-ratio 这几个关键词的兼容性

吃透移动端 1px,从基本原理到开源解决方案

开源库的解决方案

vant 组件库

使用less写的


.hairline-common() {position: absolute;box-sizing: border-box;content: ' ';pointer-events: none;
}.hairline(@color: @border-color) {.hairline-common();top: -50%;right: -50%;bottom: -50%;left: -50%;border: 0 solid @color;transform: scale(0.5);
}

也是采用第一种解决方案

ant-design-mobile 组件库

.scale-hairline-common(@color, @top, @right, @bottom, @left) {content: '';position: absolute;background-color: @color;display: block;z-index: 1;top: @top;right: @right;bottom: @bottom;left: @left;
}.hairline(@direction, @color: @border-color-base) when (@direction = 'top') {border-top: 1PX solid @color;html:not([data-scale]) & {@media (min-resolution: 2dppx) {border-top: none;&::before {.scale-hairline-common(@color, 0, auto, auto, 0);width: 100%;height: 1PX;transform-origin: 50% 50%;transform: scaleY(0.5);@media (min-resolution: 3dppx) {transform: scaleY(0.33);}}}}
}.hairline(@direction, @color: @border-color-base) when (@direction = 'right') {border-right: 1PX solid @color;html:not([data-scale]) & {@media (min-resolution: 2dppx) {border-right: none;&::after {.scale-hairline-common(@color, 0, 0, auto, auto);width: 1PX;height: 100%;background: @color;transform-origin: 100% 50%;transform: scaleX(0.5);@media (min-resolution: 3dppx) {transform: scaleX(0.33);}}}}
}
.hairline(@direction, @color: @border-color-base) when (@direction = 'bottom') {border-bottom: 1PX solid @color;html:not([data-scale]) & {@media (min-resolution: 2dppx) {border-bottom: none;&::after {.scale-hairline-common(@color, auto, auto, 0, 0);width: 100%;height: 1PX;transform-origin: 50% 100%;transform: scaleY(0.5);@media (min-resolution: 3dppx) {transform: scaleY(0.33);}}}}
}.hairline(@direction, @color: @border-color-base) when (@direction = 'left') {border-left: 1PX solid @color;html:not([data-scale]) & {@media (min-resolution: 2dppx) {border-left: none;&::before {.scale-hairline-common(@color, 0, auto, auto, 0);width: 1PX;height: 100%;transform-origin: 100% 50%;transform: scaleX(0.5);@media (min-resolution: 3dppx) {transform: scaleX(0.33);}}}}
}.hairline(@direction, @color: @border-color-base, @radius: 0) when (@direction = 'all') {border: 1PX solid @color;border-radius: @radius;html:not([data-scale]) & {@media (min-resolution: 2dppx) {position: relative;border: none;&::before {content: '';position: absolute;left: 0;top: 0;width: 200%;height: 200%;border: 1PX solid @color;border-radius: @radius * 2;transform-origin: 0 0;transform: scale(0.5);box-sizing: border-box;pointer-events: none;// @media (min-resolution: 3dppx) {//   width: 300%;//   height: 300%;//   border-radius: @radius * 3;//   transform: scale(0.33);// }}}}
}

这个值得研究下,比 vant 和 第一种解决方案有点不同,主要在于处理了 DPR 为 2 和为 3 的两种情况,相比来说更加完善。

这里 PX 大写,为了防止插件将 px 转成 rem 等单位

相关文章:

移动端1px-从基本原理到开源解决方案介绍

1px 不够准确&#xff0c;应该说成 1 物理像素 为什么有 1px 这个问题&#xff1f;实现 1px 有哪些方法&#xff1f;这些方法分别有哪些优缺点&#xff1f;开源项目中使用的哪些解决方案&#xff1f;如何在项目中处理 1px 的相关问题&#xff1f; 基本概念 首先&#xff0c;我们…...

Linux——shell外壳程序

shell外壳程序 1. 什么是shell外壳程序 Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心 “ &#xff0c;但我们一般用户&#xff0c;不能直接使用核心。 而是通过核心的“外壳”程序&#xff0c;也就是所谓的shell。 shell是所有外壳程序的统称 平时程序员…...

攻防世界web篇-Training-WWW-Robots

直接点击给出的地址&#xff0c;然后会转到另一个网页界面&#xff0c;在这个界面&#xff0c;已经给出了提示&#xff0c;robots.txt 在浏览器中&#xff0c;直接在地址的后面加上robots.txt&#xff0c;会进到下面这个界面 因为对php语言一窍不通&#xff0c;所以这里纯粹就…...

Docker是一个流行的容器化平台,用于构建、部署和运行应用程序。

文章目录 Web应用程序数据库服务器微服务应用开发环境持续集成和持续部署 (CI/CD)应用程序依赖项云原生应用程序研究和教育 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;…...

如何压缩ppt文件的大小?

如何压缩ppt文件的大小&#xff1f;要知道现在很多课件都是使用ppt文件&#xff0c;那么就导致ppt文件过大&#xff0c;我们很多时候电脑的存储空间就不够了。为了能够更好的存储这些ppt文件&#xff0c;我们通常会选择压缩ppt文件。怎么压缩ppt文件更快更好&#xff0c;没有损…...

8个视频剪辑素材网站,免费下载

找视频剪辑素材就上这8个网站&#xff0c;免费下载&#xff0c;可商用&#xff0c;赶紧收藏起来~ 免费视频素材 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计类素材为主&#xff0c;高清视频素材也很多…...

常用的二十种设计模式(上)-C++

C中常用的设计模式有很多&#xff0c;设计模式是解决常见问题的经过验证的最佳实践。以下是一些常用的设计模式&#xff1a; 单例模式&#xff08;Singleton&#xff09;&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。工厂模式&#xff08;Factory&am…...

JS中var和let和const的区别

在我很早之前&#xff0c;我还在用着var&#xff0c;直到接触到了let与const&#xff0c;我才知道var造成的影响很多&#xff0c;我果断的抛弃了var&#xff0c;哈哈 让我为大家介绍一下它们的区别吧&#xff01; 1.块级作用域 块作用域由 { }包括&#xff0c;let和const具有…...

如何利用IP定位技术进行反欺诈?

网络欺诈风险是指在互联网和数字领域中&#xff0c;存在各种类型的欺诈活动&#xff0c;旨在欺骗个人、组织或系统以获得非法获益。以下是一些常见的网络欺诈风险类型&#xff1a; 身份盗用&#xff1a;这是一种欺诈行为&#xff0c;涉及盗取他人的个人身份信息&#xff0c;如姓…...

wireshark抓包本地IDEA xml格式报文教程以及postman调用接口

1、选择 2、筛选...

MySQL学习(六)——视图和触发器

文章目录 1. 视图1.1 视图语法1.2 检查选项1.3 视图的更新1.4 视图的作用 2. 触发器2.1 介绍2.2 语法介绍2.3 触发器示例2.3.1 插入数据触发器2.3.2 修改数据触发器2.3.3 删除数据触发器 1. 视图 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据…...

那些你面试必须知道的ES6知识点

目录 1、var、let、const的区别2、作用域考题3、合并两个对象4、箭头函数和普通函数的区别5、Promise有几种状态6、find和filter的区别7、some和every的区别 1、var、let、const的区别 区别一&#xff1a; var有变量提升&#xff0c;而let和const没有 <script>console.l…...

AD9371 系列快速入口

参考资料&#xff1a; AD9371 JESD204 Interface Framework Generic JESD204B block designs AD9371 & AD9375 Prototyping Platform User Guide ADI™ Reference Designs HDL User Guide 相关设备 &#xff1a; ZCU106ADRV9371CPRO33-30.726 dB 衰减 AD9371ZCU102 移植到…...

Jenkins+vue发布项目

在Jenkins 中先创建一个任务名称 然后进行下一步&#xff0c;放一个项目 填写一些参数 参数1&#xff1a; 参数2&#xff1a; 参数3&#xff1a;参数4&#xff1a; 点击保存就行了 配置脚本 // git def git_url http://gitlab.xxxx.git def git_auth_id GITEE_RIVER…...

RSTP详解:对比STP,到底改进了什么?

一、RSTP概述 IEEE 802.1W中定义的RSTP可以视为STP的改进版本&#xff0c;RSTP在许多方面对STP进行了优化&#xff0c;它的收敛速度更快&#xff0c;而且能够兼容STP。 二、RSTP对STP的改进 改进点1&#xff1a;端口角色 、 改进点2&#xff1a;端口状态 RSTP的状态规范缩…...

从0到1,申请cos服务器并上传图片到cos文件服务器

目录 准备工作 Java代码编写 控制台打印 整理成工具类 编写接口 Postman测试 准备工作 1.进入网址腾讯云 产业智变云启未来 - 腾讯 (tencent.com) 2.搜索cos,点击立即使用&#xff0c;刚开始会免费赠送你 3.存储都是基于桶的&#xff0c;先创建桶&#xff0c;在桶里面创…...

Stm32_标准库_15_串口蓝牙模块_手机与蓝牙模块通信_BUG修复

代码&#xff1a; #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Serial.h" #include "Time.h" #include "Function.h" #include <stdio.h> #include <…...

文心一言帮忙写代码之微信小程序图片移动顺序

先上效果图&#xff0c;图片顺序可移动&#xff0c;左移右移调准顺序。 代码是文心一言帮忙写的&#xff0c;自己稍微改造就可以用了。 首先是往左移&#xff0c;也就是从下标1移到下标0 &#xff0c;下标2移到下标1 var imglist [‘aa’, ‘bb’, ‘cc’, ‘dd’]; function…...

【电子通识】USB接口三大类型图册

基本概念 不同时期的USB接口有不同的类型&#xff0c;USB接口分为插头和插座&#xff1a; 插头&#xff0c;plug&#xff0c;对应的也叫公口&#xff0c;即插别人的。 插座&#xff0c;receptacle&#xff0c;对应也叫做母口&#xff0c;即被插的。 USB的接口类型&#xff0…...

@Controller与@RestController

总结 Controller &#xff1a;定义一个控制器类. RequestMapping &#xff1a;给出外界访问方法的路径&#xff0c;或者说触发路径 &#xff0c;触发条件。 具体解析访问路径到某个方法上. ResponseBody &#xff1a;标记Controller类中的方法。把return的结果变成JSON对象…...

跨模态注意力机制在视频理解中的应用与优化

1. 跨模态注意力机制的技术解析跨模态注意力机制&#xff08;Cross-Attention&#xff09;作为连接视觉与语言模态的核心技术&#xff0c;其工作原理类似于人类大脑处理多感官信息的方式。当我们在观看视频时&#xff0c;视觉皮层和语言中枢会协同工作——这正是跨模态注意力在…...

AWS批处理作业终极指南:Batch服务的智能任务调度与优化

AWS批处理作业终极指南&#xff1a;Batch服务的智能任务调度与优化 【免费下载链接】og-aws &#x1f4d9; Amazon Web Services — a practical guide 项目地址: https://gitcode.com/gh_mirrors/og/og-aws AWS Batch服务是Amazon Web Services提供的一项强大的任务调度…...

【黑客的瑞士军刀】全能渗透测试工具箱Hackingtool

本文推荐GitHub爆火的开源项目Hackingtool&#xff0c;它将数百款主流安全测试工具整合分类&#xff0c;提供直观TUI操作界面&#xff0c;支持一键安装、批量更新与Docker部署&#xff0c;兼容多系统&#xff0c;涵盖多类安全测试场景&#xff0c;适合安全初学者、渗透测试人员…...

Image-Downloader:如何用Python实现三引擎批量图片采集?

Image-Downloader&#xff1a;如何用Python实现三引擎批量图片采集&#xff1f; 【免费下载链接】Image-Downloader Download images from Google, Bing, Baidu. 谷歌、百度、必应图片下载. 项目地址: https://gitcode.com/gh_mirrors/im/Image-Downloader 在数字内容创…...

告别蝴蝶纹:SNAP中Sentinel-1 DInSAR处理的核心步骤拆解与原理浅析

告别蝴蝶纹&#xff1a;SNAP中Sentinel-1 DInSAR处理的核心步骤拆解与原理浅析 雷达干涉测量&#xff08;DInSAR&#xff09;技术通过分析合成孔径雷达&#xff08;SAR&#xff09;影像间的相位差异&#xff0c;能够精确捕捉地表毫米级形变。对于Sentinel-1这类TOPS模式数据&am…...

高效PR沟通:提升代码协作效率的关键技巧

1. 为什么PR沟通如此重要&#xff1f;在代码协作开发中&#xff0c;Pull Request&#xff08;PR&#xff09;是开发者之间最重要的沟通载体之一。一个典型的PR生命周期中&#xff0c;沟通环节往往占据70%以上的时间成本。根据GitHub官方统计&#xff0c;处理良好的PR沟通能使代…...

ngx_free_connection

1 定义 ngx_free_connection 函数 定义在 ./nginx-1.24.0/src/core/ngx_connection.cvoid ngx_free_connection(ngx_connection_t *c) { c->data ngx_cycle->free_connections;ngx_cycle->free_connections c;ngx_cycle->free_connection_n;if (ngx_cycle->fi…...

K-Means聚类效果总不好?试试在Scikit-learn里用标准化欧氏距离优化你的模型

K-Means聚类效果总不好&#xff1f;试试在Scikit-learn里用标准化欧氏距离优化你的模型 当你在电商用户分群项目中遇到这样的场景&#xff1a;消费金额&#xff08;0-10000元&#xff09;和登录次数&#xff08;1-100次&#xff09;两个特征被放在同一个聚类模型里&#xff0c;…...

Role: 个性化健身教练

Role: 个性化健身教练 【免费下载链接】LangGPT LangGPT: Empowering everyone to become a prompt expert! &#x1f680; &#x1f4cc; 结构化提示词&#xff08;Structured Prompt&#xff09;提出者 &#x1f4cc; 元提示词&#xff08;Meta-Prompt&#xff09;发起者 &am…...

终极指南:免费m3u8下载工具如何帮你永久保存在线视频

终极指南&#xff1a;免费m3u8下载工具如何帮你永久保存在线视频 【免费下载链接】m3u8-downloader 一个M3U8 视频下载(M3U8 downloader)工具。跨平台: 提供windows、linux、mac三大平台可执行文件,方便直接使用。 项目地址: https://gitcode.com/gh_mirrors/m3u8d/m3u8-dow…...