移动端实现一像素边框的各种方法

1.参考了下MUI的实现效果,编写了以下适合自己的解决方案代码

/* 一像素边框 */
.border-bottom,
.border-top,
.border-left,
.border-right,
.border-top-add,
.border-left-add{
  position: relative;
}

.border-bottom::after,
.border-top::after,
.border-left::after,
.border-right::after,
.border-top-add+.border-top-add::after,
.border-left-add+.border-left-add::after{
  position: absolute;
  content: '';
  background-color: #eee;
}

.border-bottom::after,
.border-top::after,
.border-top-add+.border-top-add::after{
  right: 0;
  left: 0;
  height: 2rpx;
  -webkit-transform: scaleY(.5);
  transform: scaleY(.5);
}

.border-left::after,
.border-right::afte,
.border-left-add+.border-left-add::after{
  top: 0;
  height: 100%;
  width: 2rpx;
  -webkit-transform: scaleX(.5);
  transform: scaleX(.5);
}

.border-bottom::after{
  bottom: 0;
}

.border-top::after,
.border-top-add+.border-top-add::after{
  top: 0;
}

.border-left::after,
.border-left-add+.border-left-add::after{
  left: 0;
}

.border-right::after{
  right: 0;
}

这里单位用的rpx,因为我做的是微信小程序(微信小程序用1rpx并没用达到0.5px的效果),若要做h5页面,将2rpx改为1px即可。

.border-top-add, .border-left-add是紧邻的元素添加上边框,左边框。

这个写法有个局限性,不能在同一个标签中即加上边框又加下边框等,可以根据实际情况进行改进,一个边框用after添加,一个边框用before添加。

2.完美版的border.css(推荐)

@charset "utf-8";
.border,
.border-top,
.border-right,
.border-bottom,
.border-left,
.border-topbottom,
.border-rightleft,
.border-topleft,
.border-rightbottom,
.border-topright,
.border-bottomleft {
    position: relative;
}
.border::before,
.border-top::before,
.border-right::before,
.border-bottom::before,
.border-left::before,
.border-topbottom::before,
.border-topbottom::after,
.border-rightleft::before,
.border-rightleft::after,
.border-topleft::before,
.border-topleft::after,
.border-rightbottom::before,
.border-rightbottom::after,
.border-topright::before,
.border-topright::after,
.border-bottomleft::before,
.border-bottomleft::after {
    content: "\0020";
    overflow: hidden;
    position: absolute;
}
/* border
 * 因,边框是由伪元素区域遮盖在父级
 * 故,子级若有交互,需要对子级设置
 * 定位 及 z轴
 */
.border::before {
    box-sizing: border-box;
    top: 0;
    left: 0;
    height: 100%;
    width: 100%;
    border: 1px solid #eaeaea;
    transform-origin: 0 0;
}
.border-top::before,
.border-bottom::before,
.border-topbottom::before,
.border-topbottom::after,
.border-topleft::before,
.border-rightbottom::after,
.border-topright::before,
.border-bottomleft::before {
    left: 0;
    width: 100%;
    height: 1px;
}
.border-right::before,
.border-left::before,
.border-rightleft::before,
.border-rightleft::after,
.border-topleft::after,
.border-rightbottom::before,
.border-topright::after,
.border-bottomleft::after {
    top: 0;
    width: 1px;
    height: 100%;
}
.border-top::before,
.border-topbottom::before,
.border-topleft::before,
.border-topright::before {
    border-top: 1px solid #eaeaea;
    transform-origin: 0 0;
}
.border-right::before,
.border-rightbottom::before,
.border-rightleft::before,
.border-topright::after {
    border-right: 1px solid #eaeaea;
    transform-origin: 100% 0;
}
.border-bottom::before,
.border-topbottom::after,
.border-rightbottom::after,
.border-bottomleft::before {
    border-bottom: 1px solid #eaeaea;
    transform-origin: 0 100%;
}
.border-left::before,
.border-topleft::after,
.border-rightleft::after,
.border-bottomleft::after {
    border-left: 1px solid #eaeaea;
    transform-origin: 0 0;
}
.border-top::before,
.border-topbottom::before,
.border-topleft::before,
.border-topright::before {
    top: 0;
}
.border-right::before,
.border-rightleft::after,
.border-rightbottom::before,
.border-topright::after {
    right: 0;
}
.border-bottom::before,
.border-topbottom::after,
.border-rightbottom::after,
.border-bottomleft::after {
    bottom: 0;
}
.border-left::before,
.border-rightleft::before,
.border-topleft::after,
.border-bottomleft::before {
    left: 0;
}
@media (max--moz-device-pixel-ratio: 1.49), (-webkit-max-device-pixel-ratio: 1.49), (max-device-pixel-ratio: 1.49), (max-resolution: 143dpi), (max-resolution: 1.49dppx) {
    /* 默认值,无需重置 */
}
@media (min--moz-device-pixel-ratio: 1.5) and (max--moz-device-pixel-ratio: 2.49), (-webkit-min-device-pixel-ratio: 1.5) and (-webkit-max-device-pixel-ratio: 2.49), (min-device-pixel-ratio: 1.5) and (max-device-pixel-ratio: 2.49), (min-resolution: 144dpi) and (max-resolution: 239dpi), (min-resolution: 1.5dppx) and (max-resolution: 2.49dppx) {
    .border::before {
        width: 200%;
        height: 200%;
        transform: scale(.5);
    }
    .border-top::before,
    .border-bottom::before,
    .border-topbottom::before,
    .border-topbottom::after,
    .border-topleft::before,
    .border-rightbottom::after,
    .border-topright::before,
    .border-bottomleft::before {
        transform: scaleY(.5);
    }
    .border-right::before,
    .border-left::before,
    .border-rightleft::before,
    .border-rightleft::after,
    .border-topleft::after,
    .border-rightbottom::before,
    .border-topright::after,
    .border-bottomleft::after {
        transform: scaleX(.5);
    }
}
@media (min--moz-device-pixel-ratio: 2.5), (-webkit-min-device-pixel-ratio: 2.5), (min-device-pixel-ratio: 2.5), (min-resolution: 240dpi), (min-resolution: 2.5dppx) {
    .border::before {
        width: 300%;
        height: 300%;
        transform: scale(.33333);
    }
    .border-top::before,
    .border-bottom::before,
    .border-topbottom::before,
    .border-topbottom::after,
    .border-topleft::before,
    .border-rightbottom::after,
    .border-topright::before,
    .border-bottomleft::before {
        transform: scaleY(.33333);
    }
    .border-right::before,
    .border-left::before,
    .border-rightleft::before,
    .border-rightleft::after,
    .border-topleft::after,
    .border-rightbottom::before,
    .border-topright::after,
    .border-bottomleft::after {
        transform: scaleX(.33333);
    }
}

更多方法和效果参考:

https://segmentfault.com/a/1190000007604842

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
移动端开发中,实现1像素的效果是为了解决高分辨率屏幕下的线条模糊或者过粗的问题。下面是一些常见的实现方式: 1. 使用 CSS3 的 transform 进行缩放:可以使用 `scale` 属性将元素缩放到所需的大小,例如 `scale(0.5)` 即为缩放到原来的一半大小。然后再将元素的实际大小设置为 2 像素,这样在高分辨率屏幕上显示时,就会以 1 像素的精度显示。 2. 使用 viewport 的 meta 标签:在 HTML 文件的头部添加如下 meta 标签,可以将屏幕的物理像素与 CSS 像素进行等比缩放匹配,从而实现1像素的效果。 ```html <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> ``` 3. 使用 CSS3 的 border-image:可以使用 `border-image` 属性为元素的边框设置一张1像素的图片作为边框样式,从而实现1像素的效果。例如: ```css .border-1px { border-width: 1px; border-style: solid; border-image: url(border.png) 2 repeat; } ``` 4. 使用 CSS3 的伪类和 transform 进行缩放:可以使用 `::after` 伪类为元素添加一个宽度为1像素的伪元素,然后使用 `scale` 属性将其缩放到所需的大小。例如: ```css .border-1px::after { content: ''; display: block; width: 200%; height: 1px; background: #000; transform: scale(0.5); transform-origin: top left; } ``` 这些方法都可以用来实现移动端的1像素效果,具体选择哪种方法,可以根据实际情况和需求来决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值