小程序1rpx边框不完美解决方案

问题描述
  • 在小程序开发中,1rpx边框随处可见,如果只是简单的使用
    border: 1rpx solid red;的话,在不同的机型上会有不同的表现, IOS机型可能存在边框缺失,安卓边框较粗。
原因

首先先看看IOS边框缺失的问题

当父元素的高度为奇数时,容易出现上下边框缺失,同理,当父元素宽度为奇数时,容易出现左右边框缺失

解决办法是在边框内部添加一个1rpx的元素或是伪元素,撑开内部使元素的宽高为偶数

然而我们发现这种方案在Iphone 6等2倍屏可以生效, 但放在如Iphone X等3倍屏下面就很飘了, 还是经常会出现边框缺失的情况, 这种情况下再去把父元素改为2和3共同的倍数就非常不现实了。

再回过头看导致边框缺失的具体原因是啥。

在这之前需要了解下高分屏的物理像素和虚拟像素的概念

简单来说物理像素是设备的实际像素

虚拟像素是设备的坐标点, 可以简单理解为css像素

而rpx类似rem,渲染后实际转换成px之后可能存在小数,在不同的设备上多多少少会存在渲染的问题。而1rpx的问题就更加明显,因为不足1个物理像素的话,在IOS会进行四舍五入,而安卓好像统一向上取整,这也是上面两种设备表现不同的原因。

解决办法

我们采用的方法是采用translate:scale(0.5)的方法对边框进行缩放

具体的代码如下


.border1rpx, .border1rpx_before{
  position: relative;
  border-width: 0rpx !important;
  padding: 0.5rpx;
  z-index: 0;
}
.border1rpx::after, .border1rpx_before::before{
  content: "";
  border-style: inherit;
  border-color: inherit;
  border-radius: inherit;
  box-sizing: border-box !important;
  position: absolute;
  border-width: 2rpx !important;
  left: 0;
  top: 0;
  width: 200% !important;
  height: 200% !important;
  transform-origin: 0 0;
  transform: scale(0.5) !important;
  z-index: -1;
}
.border1rpx-full { margin: -1rpx; }
  1. 给.border1rpx的元素设置边框宽度为0
  2. 给::after伪元素宽高为两倍,边框设置2rpx,
  3. 边框其他样式继承元素的设置
  4. 然后再缩放0.5来达到边框为1rpx的效果

作者:微盟
来源:微信开放社区
原文:https://developers.weixin.qq.com/community/develop/article/doc/000c289924cb28a714ba9fc4451413
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>好的,我现在需要帮用户解决在UniApp中调整checkbox组件边框大小的问题。首先,用户提到了他们之前尝试在组件内写样式无效,而引用中提到需要在App.vue里修改样式。所以,我得确认用户是否正确地在全局样式中进行修改。 接下来,根据用户提供的代码示例,看到他们用了类似checkbox .wx-checkbox-input这样的选择器。这说明可能需要覆盖原生组件或第三方组件库(如uview)的默认样式。但UniApp中同平台的checkbox可能有同的实现,比如微信小程序和H5的底层结构同,可能需要同的选择器。 用户想调整边框大小,可能需要检查哪些CSS属性控制边框。通常,边框大小可能由width和height控制,但有时候border-width属性也会影响。过示例代码中用的是width和height,这可能对应复选框的容器大小,而实际边框可能需要使用border属性或border-width来调整。 另外,用户提到使用uview组件库,所以需要确认uview的checkbox组件是否有特定的类名或样式覆盖方式。比如,u-checkbox__icon可能是一个类名,需要用户查阅uview的文档来找到正确的选择器。 然后,考虑到作用域的问题,组件内的样式如果使用了scoped,可能会影响全局样式的应用。因此,用户需要在App.vue或全局样式文件中添加样式,避免被局部样式覆盖。此外,可能需要使用/deep/或::v-deep来穿透scoped样式,尤其是在Vue项目中。 最后,需要提醒用户测试同平台,因为UniApp跨平台特性可能导致样式表现一致。比如,微信小程序和APP的渲染方式同,可能需要针对同平台做适配,或使用条件编译。 总结步骤应该是:全局样式文件或App.vue中添加自定义样式,使用正确的选择器,调整width、height以及border相关属性,必要时使用深度选择器,并测试多平台效果。</think>在 UniApp 中调整 checkbox 组件的边框大小,需要通过以下步骤进行样式自定义: ### 解决方案 1. **全局样式覆盖** 在`App.vue`的`style`标签中添加以下代码(注意要加`scoped`): ```css /* 微信小程序平台 */ checkbox .wx-checkbox-input { width: 40rpx !important; /* 控制复选框宽度 */ height: 40rpx !important; /* 控制复选框高度 */ border-width: 4rpx !important; /* 调整边框粗细 */ border-color: #008CFF !important; } /* 通用H5/APP平台 */ .uni-checkbox-input { width: 40rpx !important; height: 40rpx !important; border: 4rpx solid #008CFF !important; } ``` 2. **uView组件库处理** 如果使用uview组件,需通过`customStyle`参数实现: ```vue <u-checkbox customStyle="{ 'checkbox-width': '40rpx', 'checkbox-height': '40rpx', 'border-width': '4rpx' }"> </u-checkbox> ``` ### 注意事项 - 需要`!important`覆盖组件默认样式[^1] - H5平台推荐使用`border`复合属性 - 微信小程序需单独处理`.wx-checkbox-input`选择器 - 建议通过`border-radius`调整圆角配合尺寸修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值