在最近的项目中,遇到了相似下图的单选按钮。 javascript
Radio 按钮的默认样式并很差看,常常成为被修改样式的对象。而经常使用的 antd 中,Radio 组件也没有提供可用于自定义的属性。固然,这些是难不倒各位前端小伙伴的,只要利用好 label
标签就能很简单地实现一个个性化 Radio 按钮组件。css
CSS3 目前基本都获得了支持,因此配合 CSS3 就能减小咱们在 JS 上的处理。这一次主要涉及以下知识点:前端
label
标签的使用:checked
伪类的使用::before/after
伪元素的使用实际完成的效果以下图(因为偷懒,不少就用文字代替了): java
想看代码的小伙伴也能够来这里:利用 Label 定制个性化 Radio 按钮antd
整个 Radio 的核心思想,就是利用 label
与 radio 的互相关联。这样在点击 label
的时候,radio 按钮也会跟着联动。label
与表单控件的关联分为显示和隐式两种。显示即咱们熟悉的 for
属性关联表单控件的 id
,而隐式则是把表单控件包裹在 label
标签中。在咱们的例子中,采用的是隐式关联的方法。app
<label class="label-wrapper" style={labelStyle} onChange={handleChange}>
<input type="radio" id={id} name={name} value={value} /> // 辅助的 div 在例子里面用来显示边框等自定义样式 <div>{content}</div> </label>
复制代码
为了方便对样式的控制,咱们须要调整一下 label
的默认样式。spa
.label-wrapper {
display: block;
position: relative;
}
复制代码
下一步就是利用到 :checked
伪类,来控制选中和非选中的样式。对应咱们的例子,就是 input
下面的 div
的样式。而对于简单的图案,如边框、右上角的选中标示,其实还能够利用 ::before/after
伪元素来实现。code
input:checked + div {
// 经过 padding 解决抖动问题
padding: 0;
position: relative;
border-radius: 10px;
border: 5px solid lightblue;
&::after {
content: "@";
color: #fff;
position: absolute;
top: -10px;
right: 1px;
}
&::before {
content: "";
width: 0px;
height: 0px;
border: 15px solid lightblue;
border-left-color: transparent;
border-bottom-color: transparent;
position: absolute;
top: 0;
right: 0;
}
}
复制代码
如此一来,一个简单的自定义 Radio 按钮就实现出来了。根据需求咱们能够监听 onChange
事件等来实现咱们想要的功能。另外,只要利用 radio 相同 name
就会互斥的性质,就能实现按钮组的效果。cdn
最后再提一下,想看代码的小伙伴也能够来这里:利用 Label 定制个性化 Radio 按钮xml
这一次利用 CSS 伪类来实现自定义 Radio 按钮,主要是受到最近刷题中 CSS 题目的启发。虽然如今前端的重点在 JavaScript 上,但 HTML 与 CSS 仍然是逃不开的内容。CSS3 提供了许多伪类和新的属性,利用好伪类能够减小咱们在 JavaScript 上的工做量。因此在空闲之时不妨多翻两眼 CSS3 吧。