- 问题描述:
为了适配各种屏幕,我们写代码时一般使用设备独立像素来对页面进行布局。
而在设备像素比大于 1的屏幕上,我们写的 1px实际上是被多个物理像素渲染,这就会出现 1px在有些屏幕上看起来很粗的现象。
- 对此有如下解决方案:
@mixin border-1px($color, $direction) {
position: relative;
&::before {
content: "";
position: absolute;
z-index: 1;
@if $direction==all {
left: 0;
top: 0;
border: 1px solid $color;
box-sizing: border-box;
transform-origin: left top;
}
@else {
background-color: $color;
@if $direction==top {
left: 0;
top: 0;
width: 100%;
height: 1px;
}
@if $direction==right {
right: 0;
top: 0;
width: 1px;
height: 100%;
}
@if $direction==bottom {
left: 0;
bottom: 0;
width: 100%;
height: 1px;
}
@if $direction==left {
left: 0;
top: 0;
width: 1px;
height: 100%;
}
}
}
}
@each $direction in all,
top,
right,
bottom,
left {
@for $i from 1 to 10 {
$scale: 1 / $i;
@media only screen and (-webkit-min-device-pixel-ratio:$i) {
.border-1px-#{$direction}::before {
@if $direction==all {
width: $i * 100%;
height: $i * 100%;
transform: scale($scale);
}
@if $direction==top {
transform: scaleY($scale);
}
@if $direction==bottom {
transform: scaleY($scale);
}
@if $direction==right {
transform: scaleX($scale);
}
@if $direction==left {
transform: scaleX($scale);
}
}
}
}
}
这种方式可以满足各种场景。
- 使用方式:
第一步:@include border-1px(blue, all);引入由mixin定义的代码块(创建伪类 模拟border)
第二步:<div class=”border-1px-all”></div>添加border-1px-#{$direction}类名(缩放尺寸)
- *注:
为何没有直接对border-width直接操作 是因为有部分机型不支持0.5px这样的值 会被当成0来处理 故用缩放来实现。