window.devicePixelRatio = 设备的物理像素 / CSS像素 。复制代码打开 Chrome 浏览器,启动移动端调试模式,在控制台去输出这个 devicePixelRatio 的值 。这里选中 iphone6/7/8 这系列的机型,输出的结果就是 2:这就意味着设置的 1px CSS 像素,在这个设备上实际会用 2 个物理像素单元来进行渲染,所以实际看到的一定会比 1px 粗一些 。
解决1px问题的三种思路:
思路一:直接写 0.5px
如果之前 1px 的样式这样写:
border:1px solid #333复制代码可以先在 JS 中拿到 window.devicePixelRatio 的值,然后把这个值通过 JSX 或者模板语法给到 CSS 的 data 里,达到这样的效果(这里用 JSX 语法做示范):<div id="container" data-device={{window.devicePixelRatio}}></div>复制代码然后就可以在 CSS 中用属性选择器来命中 devicePixelRatio 为某一值的情况,比如说这里尝试命中 devicePixelRatio 为 2 的情况:#container[data-device="2"] {border:0.5px solid #333}复制代码直接把 1px 改成 1/devicePixelRatio 后的值,这是目前为止最简单的一种方法 。这种方法的缺陷在于兼容性不行,IOS 系统需要 8 及以上的版本,Android/ target=_blank class=infotextkey>安卓系统则直接不兼容 。思路二:伪元素先放大后缩小
这个方法的可行性会更高,兼容性也更好 。唯一的缺点是代码会变多 。
思路是先放大、后缩小:在目标元素的后面追加一个 ::after 伪元素,让这个元素布局为 absolute 之后、整个伸展开铺在目标元素上,然后把它的宽和高都设置为目标元素的两倍,border 值设为 1px 。接着借助 CSS 动画特效中的放缩能力,把整个伪元素缩小为原来的 50% 。此时,伪元素的宽高刚好可以和原有的目标元素对齐,而 border 也缩小为了 1px 的二分之一,间接地实现了 0.5px 的效果 。
代码如下:
#container[data-device="2"] {position: relative;}#container[data-device="2"]::after{position:absolute;top: 0;left: 0;width: 200%;height: 200%;content:"";transform: scale(0.5);transform-origin: left top;box-sizing: border-box;border: 1px solid #333;}复制代码思路三:viewport 缩放来解决这个思路就是对 meta 标签里几个关键属性下手:
<meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">复制代码这里针对像素比为 2 的页面,把整个页面缩放为了原来的 1/2 大小 。这样,本来占用 2 个物理像素的 1px 样式,现在占用的就是标准的一个物理像素 。根据像素比的不同,这个缩放比例可以被计算为不同的值,用 js 代码实现如下:const scale = 1 / window.devicePixelRatio;// 这里 metaEl 指的是 meta 标签对应的 DommetaEl.setAttribute('content', `width=device-width,user-scalable=no,initial-scale=${scale},maximum-scale=${scale},minimum-scale=${scale}`);复制代码这样解决了,但这样做的副作用也很大,整个页面被缩放了 。这时 1px 已经被处理成物理像素大小,这样的大小在手机上显示边框很合适 。但是,一些原本不需要被缩小的内容,比如文字、图片等,也被无差别缩小掉了 。作者:教主鸽鸽
链接:
https://juejin.cn/post/7081144288398016520
【前端进阶高薪必看-CSS之手写篇】
推荐阅读
- 国产web端开源ui组件-通用前端ui界面组件库
- 不可不知的sql扫描、注入利器sqlmap——实战演示sqlmap进阶命令
- 微前端架构技术解析
- 前端必懂面试题之浏览器输入URL之后发生了什么
- 新司机进阶宝典:用车三大常见问题,买车君逐一击破!
- 前端:何为跨域,如何跨域
- 解如何利用CORS跨域,是时候让前端来指挥一次后端同学开发了
- 5个你可能不知道的苹果Mac使用技巧!进阶必备
- 八零后弃外企高薪销售 改行做茶膏
- 前端正则表达式书写以及常用的方法
