css 中引入 svg 来兼容部分安卓机显示 0.5px 边框

2018-02-27 11:02:25来源:https://juejin.im/post/5a7d572f5188257a7c6c44a5作者:稀土掘金人点击

分享

相信大家昨天打开某 404 搜索引擎的时候应该都看到这张图片了,不得不说,后人会以这么一种方式来纪念前人,而且还是一个伟大的公司,挺感动的。



在开发 H5 页面的时候发现,部分安卓机的原生浏览器不兼容 0.5px 的border
,这时候就很闹心了,如下所示代码:


input {
border-bottom: 0.5px solid #DCDCDC;
}
使用 rem 改进


后面想到了用rem
的方式,因为 H5 页面借鉴了手淘的响应式像素,根据移动设备的 dpi 设定了根元素的font-size
大小,所以几乎所有的px
都改成了rem
作为单位,这样可以更好地去实现移动端的响应式像素以及 Retina 屏幕上的表现。代码如下:


input {
/* 47 是页面根元素的 font-size 大小 */
border-bottom: calc(1rem/47) solid #DCDCDC;
}


测试中有部分机型完美展示了,但是有部分还是不显示,网上有帖子说可以利用伪元素:before
和:after
进行1px
的表现,然后利用transform: scaleY(0.5);
进行高度上的调整,思路很好,但奶奶个熊input
元素不支持伪元素。


最后,物色到了一个很妙的方法:在 CSS 中使用 svg!


css 中引入 svg 来改进


具体思路是为元素加上background-image
,然后把 svg 置为图片类型,因为 svg 上的1px
就是实实在在的只占 1 个物理像素。


实现很简单,代码如下:


input {
background-image: url("data:image/svg+xml;utf8,<svg xmlns='/2014th7cj/d/file/p/20180223/svg' width='100%' height='100%'><line x1='0' y1='100%' x2='100%' y2='100%' stroke='#dcdcdc' stroke-width='1'/></svg>") ;
}

倒腾不止于此,利用 php 代码把 svg 的 xml 代码转成 base64 格式再试试:


<?php
echo base64_encode("<svg xmlns='/2014th7cj/d/file/p/20180223/svg' width='100%' height='100%'><line x1='0' y1='100%' x2='100%' y2='100%' stroke='#dcdcdc' stroke-width='1'/></svg>");
?>

输出如下:


PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxMDAlJyBoZWlnaHQ9JzEwMCUnPjxsaW5lIHgxPScwJyB5MT0nMTAwJScgeDI9JzEwMCUnIHkyPScxMDAlJyBzdHJva2U9JyNkY2RjZGMnIHN0cm9rZS13aWR0aD0nMScvPjwvc3ZnPg==


再引入到 css 的background-image
中:(注意原utf8
要改成base64
)


input {
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxMDAlJyBoZWlnaHQ9JzEwMCUnPjxsaW5lIHgxPScwJyB5MT0nMTAwJScgeDI9JzEwMCUnIHkyPScxMDAlJyBzdHJva2U9JyNkY2RjZGMnIHN0cm9rZS13aWR0aD0nMScvPjwvc3ZnPg==") ;
}
结语

其实还有很多方法可以来解决这个问题,大家尽情发挥一下脑洞吧。


已是年关,大家无论是外出游玩还是返乡路上,都一定要眼观四路、耳听八方,保管自己的随身物品。希望新的一年我的读者们都平平安安、开开心心的,再远再难都要回家一趟。这个冬天,不冷!


最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台