前言
应该感觉不止一次会被涉及到关于1px的问题,其主要触发的场景就是高分屏上会把1px宽的边框显示成2px,在dpr为3的设备上,显示边框为3px.
为了避免大家少走弯路,这里简单带一下网上提到的几种方案,包括下面的:
- 边框的图片,border-image
- 背景图片
- 边框的阴影
- 设置viewport的meta属性(不建议使用)
推荐方案:
1 transform
针对边框设置1px之后,在使用transform,需要结合JavaScript代码,用来判断是否是Retina.
.hairlines li{ position: relative; border:none; }.hairlines li:after{content: '';position: absolute; left: 0;background: #000; width: 100%; height: 1px;transform: scaleY(0.5); transform-origin: 0 0; }
2 PostCSS的postcss-write-svg
使用PostCSS的插件是不是比我们修改图片要来得简单与方便。
使用PostCSS的postcss-write-svg插件,最后编译完会变成一背景图片样式。比如:
@svg square {@rect { fill: var(--color, black); width: 100%; height: 100%; } }#example {background: white svg(square param(--color #00b1ff)); }
3 0.5px
查看是否兼容设置0.5px的方案,进行兼容性测试,支持就设置这个样式,结合Flexible方案。
if (dpr >= 2) {var fakeBody = document.createElement('body')var testElement = document.createElement('div')testElement.style.border = '.5px solid transparent'fakeBody.appendChild(testElement)docEl.appendChild(fakeBody)if (testElement.offsetHeight === 1) {docEl.classList.add('hairlines')}docEl.removeChild(fakeBody)}
4 伪元素 transform、border-image
京东的1px的方案,边框均是伪元素实现的,但不是所有的样式有实现。
// transform 方案@media only screen and (-webkit-min-device-pixel-ratio: 2){.option:after {-webkit-transform: scale(.5);-webkit-transform-origin: 0 0;bottom: -100%;right: -100%;}}option:after {content: "";display: block;border: 1px solid #ddd;position: absolute;top: 0;bottom: 0;left: 0;right: 0;pointer-events: none;}// border-image方案.jd-header-bar {position: relative;border-width: 0 0 1px;border-bottom: 1px solid #bfbfbf;-webkit-border-image: url("data:image/gif;base64,R) repeat-x 0 0;background-size: 100% 44px}
5 box-shadow
天锚的方案:box-shadow
.templates-item-wrapper {width: 92%;margin: 0 auto;/* -webkit-box-shadow: 0 1px 2px 0 rgba(157,157,157,.5); */-moz-box-shadow: 0 1px 2px 0 rgba(157,157,157,.5);/* box-shadow: 0 1px 2px 0 rgba(157,157,157,.5); */}
