微信小程序开发——修改小程序原生checkbox、radio默认样式

复选框:

闲话少说,这里直接介绍如何修改小程序提供的复选框的样式,如原生的是这样的:

需要的是这样的:

示例代码:

/*复选框外框样式*/
checkbox .wx-checkbox-input {
  width: 40rpx;
  height: 40rpx;
  border: 4rpx solid #999;
  border-radius: 100%;
}
/*复选框外框选中样式*/
checkbox .wx-checkbox-input.wx-checkbox-input-checked {
  border-color: #3cbcee;
}
/*复选框选中后内部样式*/
checkbox .wx-checkbox-input.wx-checkbox-input-checked::before {
  width: 60%;
  height: 60%;
  background: #3cbcee;
  border-radius: 100%;
  content: '';
  transform: translate(-50%, -50%) scale(1);
  -webkit-transform: translate(-50%, -50%) scale(1);
}

注:复选框选中后内部样式部分,最后两行样式一定要有,不然复选框选中后内部的圆点会不居中(而且不太好调),具体的就不细说了,有兴趣的可以试试:

  transform: translate(-50%, -50%) scale(1);
  -webkit-transform: translate(-50%, -50%) scale(1);

如上,还是跟我们修改html原生标签样式是一样的,只不过我们不了解小程序这些原生组件的内部结构罢了。

单选按钮:

仍旧按上面的样式修改,代码如下:

/* 单选按钮样式*/

radio .wx-radio-input {
  width: 40rpx;
  height: 40rpx;
  border: 4rpx solid #999;
  border-radius: 100%;
  background: none;
}

/*单选按钮选中后内部样式*/

radio .wx-radio-input.wx-radio-input-checked {
  border: 4rpx solid #3cbcee!important;
}

radio .wx-radio-input.wx-radio-input-checked::before {
  width: 60%;
  height: 60%;
  background: #3cbcee;
  border-radius: 100%;
  content: '';
  transform: translate(-50%, -50%) scale(1);
  -webkit-transform: translate(-50%, -50%) scale(1);
}

如上,样式代码跟复选框的基本一致,直接将checkbox换为radio就可以了。但是有一个地方不一样,就是单选按钮选择后的外框样式需要添加 !Important ,不然不会生效的。

如果需要添加禁用标志,也是可以自定义的:

radio.disabled .wx-radio-input {
  width: 40rpx;
  height: 40rpx;
  border: 4rpx solid #eee;
  border-radius: 100%;
  background: none;
}

总结:

虽然官方没有提供原生组件样式修改的入口,但是微信小程序基于微信内置浏览器的X5内核(其实就是Chrome内核),小程序在某些方面和html是很类似的。从上边的例子也可以看出,小程序原生checkbox组件内部是封装了一些我们看不到的东西的,只要我们了解了原生组件内部构造,就可以直接修改组件样式。

目前还没找到有关小程序组件内部类名的相关文档,但感觉可以从小程序编译包中应该有迹可循的,感兴趣的可以去了解下:https://www.cnblogs.com/xyyt/p/9523902.html

后记:

对于复选框、单选按钮这些组件,在编码实现的时候,会涉及到组件的选中、非选中、禁用状态,非禁用状态可能会有默认选择第一个选项,一般情况下的编码如下:

<radio wx:if="{{item.isSelect==0}}" class='vc {{cardDetail.status!=1||cardDetail.payStatus==0?"disabled":""}}' 
       color="white" disabled='{{cardDetail.status!=1||cardDetail.payStatus==0}}' value="{{index}}" checked='{{index==fatherRightsCheckIndex}}' />

如上,所有的状态、属性都在一个组件中实现,可以发现判断条件会比较多,如果后续有改动,那么改动的地方就比较多了。我们可以对这段代码进行优化如下:

<block wx:if="{{item.isSelect==0}}">
    <radio wx:if="{{cardDetail.status!=1||cardDetail.payStatus==0}}" class='vc disabled' disabled='true' />
    <radio wx:else class='vc' color="white" value="{{index}}" checked='{{index==fatherRightsCheckIndex}}' />
</block>

如上,代码并没有增加多少,但是代码结构清晰多了,即使后续有改动,改动起来也很方便的。

posted on 2019-05-15 19:34  逍遥云天  阅读(14547)  评论(0编辑  收藏  举报

导航