利用Label标签订制个性化Radio按钮

在最近的项目中,遇到了相似下图的单选按钮。 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 吧。

相关文章
相关标签/搜索