背景
在移动端,css中的1px并等于移动设备的1px,因为手机屏幕有不同的像素密度。window中的devicePixelRatio就是反应css中像素与真实像素的比例,也就是设备物理像素和设备独立像素的比例,也就是 devicePixelRatio = 物理像素 / 独立像素。所以造成了通过css设置1px,在移动端屏幕上会变粗。
解决方案一:使用伪类缩放
使用伪类缩放需要主要的是:
- 设置全边框的时候,box-sizing要设置为border-box,否则伪元素上下左右各会多1px
- 需要将父元素设置为relative
- 注意 transform 的起点,上边距要用左上角,下边距用左下角
0.5px下边框
/* 下边框 */ .one-px-border2:after { content: ""; position: absolute; bottom: 0; left: 0; right: 0; border-bottom: 1px solid red; transform: scaleY(.5); transform-origin: left bottom; }
0.5px上边框
/* 上边框 */ .one-px-border1:before { content: ""; position: absolute; top: 0; left: 0; right: 0; border-top: 1px solid red; transform: scaleY(.5); transform-origin: left top; }
0.5px全边框
.one-px-border3:after { content: ""; position: absolute; bottom: 0; left: 0; border: 1px solid red; transform-origin: left bottom; width: 200%; height: 200%; transform: scale(.5); /* box-sizing要设置为border-box,否则伪元素上下左右各会多1px */ box-sizing: border-box; /* 设置圆角border等 */ border-radius: 10px; }
解决方案二:使用 -webkit-min-device-pixel-ratio
使用less对常用的1px进行封装:
// 高清屏 1px @lignt-gray-color: #e7e7e7; // 设置圆角(如果圆角大于0,则添加圆角的代码) .border-radius(@borderRadius) when (unit(@borderRadius) > 0) { border-radius: @borderRadius; @media (-webkit-min-device-pixel-ratio: 2) { &:before { border-radius: unit(unit(@borderRadius) * 2, px); } } @media (-webkit-min-device-pixel-ratio: 2.5) { &:before { border-radius: unit(unit(@borderRadius) * 2.5, px); } } @media (-webkit-min-device-pixel-ratio: 2.75) { &:before { border-radius: unit(unit(@borderRadius) * 2.75, px); } } @media (-webkit-min-device-pixel-ratio: 3) { &:before { border-radius: unit(unit(@borderRadius) * 3, px); } } } // border函数 .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: 198%; height: 198%; -webkit-transform: scale(.5); } } @media (-webkit-min-device-pixel-ratio: 2.5) { &:before { width: 248%; height: 248%; -webkit-transform: scale(.4); } } @media (-webkit-min-device-pixel-ratio: 2.75) { &:before { width: 273%; height: 273%; -webkit-transform: scale(1 / 2.75); } } @media (-webkit-min-device-pixel-ratio: 3) { &:before { width: 298%; height: 298%; 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); } // 上边框函数及规则 .border-top( @borderWidth: 1px; @borderStyle: solid; @borderColor: @lignt-gray-color; @borderRadius: 0) { .border(@borderWidth 0 0 0; @borderStyle; @borderColor; @borderRadius); } // 右边框函数及规则 .border-right( @borderWidth: 1px; @borderStyle: solid; @borderColor: @lignt-gray-color; @borderRadius: 0) { .border(0 @borderWidth 0 0; @borderStyle; @borderColor; @borderRadius); } // 下边框函数及规则 .border-bottom( @borderWidth: 1px; @borderStyle: solid; @borderColor: @lignt-gray-color; @borderRadius: 0) { .border(0 0 @borderWidth 0; @borderStyle; @borderColor; @borderRadius); } // 左边框函数及规则 .border-left( @borderWidth: 1px; @borderStyle: solid; @borderColor: @lignt-gray-color; @borderRadius: 0) { .border(0 0 0 @borderWidth; @borderStyle; @borderColor; @borderRadius); } // 上-右边框函数及规则 .border-tr( @borderWidth: 1px; @borderStyle: solid; @borderColor: @lignt-gray-color; @borderRadius: 0) { .border(@borderWidth @borderWidth 0 0; @borderStyle; @borderColor; @borderRadius); } // 上-下边框函数及规则 .border-tb( @borderWidth: 1px; @borderStyle: solid; @borderColor: @lignt-gray-color; @borderRadius: 0) { .border(@borderWidth 0; @borderStyle; @borderColor; @borderRadius); } // 上-左边框函数及规则 .border-tl( @borderWidth: 1px; @borderStyle: solid; @borderColor: @lignt-gray-color; @borderRadius: 0) { .border(@borderWidth 0 0 @borderWidth; @borderStyle; @borderColor; @borderRadius); } // 右-下边框函数及规则 .border-rb( @borderWidth: 1px; @borderStyle: solid; @borderColor: @lignt-gray-color; @borderRadius: 0) { .border(0 @borderWidth @borderWidth 0; @borderStyle; @borderColor; @borderRadius); } // 右-左边框函数及规则a .border-rl( @borderWidth: 1px; @borderStyle: solid; @borderColor: @lignt-gray-color; @borderRadius: 0) { .border(0 @borderWidth; @borderStyle; @borderColor; @borderRadius); } // 下-左边框函数及规则 .border-bl( @borderWidth: 1px; @borderStyle: solid; @borderColor: @lignt-gray-color; @borderRadius: 0) { .border(0 0 @borderWidth @borderWidth; @borderStyle; @borderColor; @borderRadius); }
使用时:
.one-px-border { // 使用less函数.border .border(1px, solid, red); // 使用less函数.border-radius .border-radius(20px); }
解决方案三:使用图片
切图,使用图片结合border-image进行css样式设置
.border-bottom-1px { border-width: 0 0 1px 0; border-image: url(linenew.png) 0 0 2 0 stretch; }
缺点:不够灵活,换颜色需要换图片
解决方案四:使用box-shadow模拟
.box-shadow-1px { width: 100px; height: 100px; box-shadow: inset 0px -1px 1px -1px red; }