Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >CSS魔法堂:改变单选框颜色就这么吹毛求疵!

CSS魔法堂:改变单选框颜色就这么吹毛求疵!

作者头像
^_^肥仔John
发布于 2018-10-08 02:57:33
发布于 2018-10-08 02:57:33
2.9K00
代码可运行
举报
运行总次数:0
代码可运行

前言

 是否曾经被业务提出"能改改这个单选框的颜色吧!让它和主题颜色搭配一下吧!",然后苦于原生不支持换颜色,最后被迫自己手撸一个凑合使用。若抛开input[type=radio]重新开发一个,发现要模拟选中、未选中、不可用等状态很繁琐,而涉及单选框组就更烦人了,其实我们可以通过label::before:checkedtabindex,然后外加少量JavaScript脚本就能很好地模拟出一个样式更丰富的“原生”单选框。下面我们一起来尝试吧!

单选框了解一下

 由于我们的目标是改变单选框颜色,其他外观特征和行为与原来的单选框一致,那么我们就必须先了解单选框原来的外观特征和行为主要有哪些。

1.外观特征

1.1.常态样式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
margin: 3px 3px 0px 5px;
border: none 0;
padding: 0;
box-sizing: border-box;
display: inline-block;
line-height: normal;
position: static;

注意:外观上我们必须要保证布局特性和原生的一致,否则采用自定义单选框替换后很大机会会影响整体的布局,最后导致被迫调整其他元素的布局特性来达到整体的协调,从而扩大了修改范围。

1.2.获得焦点的样式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
outline-offset: 0px;
outline: -webkit-focu-ring-color auto 5px;

注意:这里的获取焦点的样式仅通过键盘Tab键才生效,若通过鼠标点击虽然单选框已获得焦点,但上述样式并不会生效。

1.3.设置为disabled的样式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
color: rgb(84, 84, 84);

2.行为特征

 单选框的行为特征,明显就是选中与否,及选中状态的改变事件,因此我们必须保持对外提供change事件。

 另外值得注意的是,当通过键盘的Tab键让单选框获得焦点后,再按下Space键则会选中该单选框。

 有了上述的了解,我们可以开始着手撸代码了!

少废话,撸代码

上图中左侧就是原生单选框,右侧为我们自定义的单选框。从上到下依次为未选中选中获得焦点disabled状态的样式。

CSS部分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
label.radio {
  /* 保证布局特性保持一致 */
  margin: 3px 3px 0px 5px;
  display: inline-block;
  box-sizing: border-box;

  width: 12px;
  height: 12px;
}

.radio__appearance{
  display: block; /* 设置为block则不受vertical-align影响,从而不会意外影响到.radio的linebox高度 */
  position: relative;
  box-shadow: 0 0 0 1px tomato; /* box-shadow不像border那样会影响盒子的框高 */
  border-radius: 50%;
  height: 90%;
  width: 90%;
  text-align: center;
}
label.radio [type=radio] + .radio__appearance::before{
  content: "";
  display: block;
  border-radius: 50%;
  width: 85%;
  height: 85%;

  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);

  transition: background .3s;
}
label.radio [type=radio]:checked + .radio__appearance::before{
  background: tomato;
}
label.radio [type=radio][disabled] + .radio__appearance{
  opacity: .5;
}
label.radio:focus{
  outline-offset: 0px;
  outline: #999 auto 5px;
}
/* 通过鼠标单击获得焦点时,outline效果不生效 */
label.radio.clicked{
  outline: none 0;
}
/* 自定义单选框的行为主要是基于原生单选框的,因此先将原生单选框隐藏 */
label.radio input {
  display: none;
}

HTML部分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- 未选中状态 -->
<label class="radio" tabindex="0">
  <input type="radio" name="a">
  <i class="radio__appearance"></i>
</label>

<br>

<!-- 选中状态 -->
<label class="radio" tabindex="0">
  <input type="radio" name="a" checked>
  <i class="radio__appearance"></i>
</label>

<br>

<!-- disabled状态 -->
<label class="radio">
  <input type="radio" name="a" disabled>
  <i class="radio__appearance"></i>
</label>

JavaScript部分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var radios = document.querySelectorAll(".radio")
radios.forEach(radio => {
  // 模拟鼠标点击后:focus样式无效
  radio.addEventListener("mousedown", e => {
    var tar = e.currentTarget
    tar.classList.add("clicked")
    var fp = setInterval(function(){
      if (document.activeElement != tar){
        tar.classList.remove("clicked")
        clearInterval(fp)
      }
    }, 400)
  })
  // 模拟通过键盘获得焦点后,按`Space`键执行选中操作
  radio.addEventListener("keydown", e => {
    if (e.keyCode === 32){
      e.target.click()
    }
  })
})

这个实现有3个注意点:

  1. 通过label传递鼠标点击事件到关联的input[type=radio],因此可以安心隐藏单选框又可以利用单选框自身特性。但由于label控件自身的限制,如默认不是可获得焦点元素,因此无法传递键盘按键事件到单选框,即使添加tabindex特性也需手写JS来实现;
  2. 当tabindex大于等于0时表示该元素可以获得焦点,为0时表示根据元素所在位置安排获得焦点的顺序,而大于0则表示越小越先获得焦点;
  3. 由于单选框的displayinline-block,因此单选框将影响line box高度。当自定义单选框内元素采用inline-block时,若vertical-align设置稍有不慎就会导致内部元素所在的line box被撑高,从而导致自定义单选框所在的line box高度变大。因此这里采用将内部元素的display均设置为block的做法,直接让vertical-align失效,提高可控性。

总结

 对于复选框我们可以稍加修改就可以了,然后通过VUE、React等框架稍微封装一下提供更简约的API,使用起来就更方便了。

 尊重原创,转载请注明来自:https://cloud.tencent.com/developer/article/1351293 ^_^肥仔John

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
js原生、jquery单选框radio总结(获取值、设置默认选中值、样式)
label标签的两种使用方法: https://blog.csdn.net/qq_40015157/article/details/110850331
全栈程序员站长
2022/09/02
9.6K0
js原生、jquery单选框radio总结(获取值、设置默认选中值、样式)
Vue复习姿势系列之UI组件——单选框(Radio)
src/packages目录下新建radio文件夹,文件夹内创建radio.vue和index.js。 src/styles目录下心新建radio.scss,并在src/styles/index.scss中引入。 我们用label标签将input[type=radio]及span包裹在一起。目的是让input的鼠标事件扩散到整个label上,这样即使隐藏了input元素,也能正常使用它的功能。
玖柒的小窝
2021/10/19
4.7K0
Vue复习姿势系列之UI组件——单选框(Radio)
关于单选框以及复选框的css美化方法
在工作中,遇到单选框和复选框还是一件很头疼的事情。丑就算了,关键是各个浏览器都不一样,这非常让我头疼。
FungLeo
2022/11/28
6930
CSS 3.0实现水滴单选框
给大家分享一个用CSS 3.0实现水滴单选框动画,效果如下: 以下是代码实现,欢迎大家复制、粘贴和收藏。 <!DOCTYPE html> <html lang="en"> <head>
越陌度阡
2022/05/10
5480
CSS 3.0实现水滴单选框
30+有用的CSS代码片段
在一篇文章中收集所有的CSS代码片段几乎是不可能的事情,但是我们这里列出了一些相对于其他的更有用的代码片段,不要被这些代码的长度所吓到,因为它们都很容易实现,并且具有良好的文档。除了那些解决常见的恼人的问题外,也包含了一些解决新问题的新技术。 1.垂直对齐 如果你之前遇到过这个问题,你就应该知道它是多么的烦人,幸运的是,现在你可以使用CSS3变换来解决这个问题: .vc{ position: relative; top: 50%; -webkit-transform: transl
前朝楚水
2018/04/02
9660
CSS魔法堂:那个被我们忽略的outline
 在CSS魔法堂:改变单选框颜色就这么吹毛求疵!中我们要模拟原生单选框通过Tab键获得焦点的效果,这里涉及到一个常常被忽略的属性——outline,由于之前对其印象确实有些模糊,于是本文打算对其进行稍微深入的研究^_^
^_^肥仔John
2018/10/11
7580
CSS魔法堂:那个被我们忽略的outline
前端基础-CSS
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/12/10
1.1K0
纯CSS改写radio和checkbox,单选框、复选框样式优化
CSS: 将单选框或者复选框隐藏,在其后面写一个 span 利用 CSS 的相邻兄弟选择器  input + span 选中它,对它的样式进行美化。
德顺
2019/11/13
5.4K0
纯CSS改写radio和checkbox,单选框、复选框样式优化
仅用 CSS 实现赛博朋克 2077 风格视觉效果
《赛博朋克2077》 是一款动作角色类游戏,于 2020年12月10日 登陆各大游戏平台。故事发生在夜之城,权力更迭和身体改造是这里不变的主题。玩家将扮演一名野心勃勃的雇佣兵:V,追寻一种独一无二的植入体——获得永生的关键。它以自由的探索性,较高的操控度以及惊艳的视觉特效收获了一大批玩家。我非常喜欢 2077 官网的设计风格,因此本篇文章主要以 2077 官网为例,通过几个例子,依次实现赛博朋克风格元素效果。
zz_jesse
2021/07/30
5730
纯CSS实现自定义单选框和复选框
在html中,<label>标签通常和<input>标签一起使用,<label>标签为input元素定义标注(标记)。label 元素不会向用户呈现任何特殊效果,<label>标签的作用是为鼠标用户改进了可用性,当用户点击<label>标签中的内容时,浏览器就会自动将焦点转到和该标签相关联的控件上;<label>标签在单选按钮和复选按钮上经常被使用,使用该标签后,你点击label标签内的内容,也可以选中对应的单选按钮或复选按钮。
AlbertYang
2020/09/08
1.7K0
纯CSS实现自定义单选框和复选框
10个超酷的H5特效设计+1个仿最新苹果UI设计(压轴)
1.抽屉式(动态)选择 button(纯css实现) html代码:  <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="s
淼学派对
2022/11/20
1.5K0
10个超酷的H5特效设计+1个仿最新苹果UI设计(压轴)
layui 单选框、多选框radio 元素判断是必填项 lay-verify=‘required‘
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139121.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/02
2.5K0
layui 单选框、多选框radio 元素判断是必填项 lay-verify=‘required‘
自定义单选框样式方法
元素的初始样式都不怎么好看,我们一般修改样式会想到直接在那元素上添加样式,比如background、border等,在大多数元素上是可以这么做,但当遇上了单选框会毫无反应。
全栈程序员站长
2022/09/01
1.2K0
自定义单选框样式方法
html和css进阶
5.0之前没有placeholder新增功能,之前是value(提示的文字需要用户删除,而且字的颜色也没有变暗)实现的
小闫同学啊
2019/07/18
3.5K0
CSS中如何修改浏览器自带样式
不需要用到js, 而是纯css, 个人推荐使用此方法,巧用了将radio隐藏,然后通过label的for属性来改变radio的选中状态,在利用:checked伪类与兄弟选择器(+)来修改label的样式。从而无需使用js
用户9914333
2022/07/21
1.7K0
CSS中如何修改浏览器自带样式
从Chrome中提取出来的WebUI
  我稍微对样式进行了点修改,button按钮增加了reset按钮的支持,当ui设置为disabled,修改鼠标默认样式为禁止点击,最后对样式进行了压缩,完整代码如下:
胡尐睿丶
2022/03/23
4120
从Chrome中提取出来的WebUI
CSS3-实现单选框radio的小动画
在微信上看到一个教程文,觉得制作的小动画还是很有意思的,自己也试验了一下。一开始动画怎么都不执行(我用的HB),因为内置浏览器对css3的不兼容。加上各种浏览器前缀后就好了。但是旋转那个效果,在HB里还是不能正常播放。 总结就是:1,学习到了css3的伪类选择器还可以这样用!2,css3的动画设置还可以这样搭配!3,label可以替代radio。如果正常情况下让我想一个给radio 加动画的方法,我肯定不会想到把radio隐藏的!这是欲擒故纵啊。。。。 以下是代码: <div class="radio1">
xing.org1^
2018/05/17
9390
Vite 项目中如何去集成 Sass
样式方面我们首先是会想到要给项目进行默认样式的重置,此时我们应当去使用一个比较稳定的npm 包的样式重置代码:
HelloWorldZ
2024/05/24
1550
Vite 项目中如何去集成 Sass
纯CSS实现侧栏卡片显隐
以前我有写过一篇基于Butterfly的手机端fixed定位侧栏布局魔改方案,抛开被洪哥忽悠而起的这么长的标题不谈,在这篇中是通过编写一个手机端fixed定位的样式,并通过js监测到对应的点击动作后,给相应的侧栏卡片添加上这个样式。同时也是通过js不断的进行样式初始化和class的增减。
Akilar
2023/03/08
9730
优化单选框 radio 样式:随点击变换选中和未选中状态图片
果酱小程序的页面管理,其中一个模块是图片魔方,就是用户可以给小程序首页设置不同数量和布局的图片魔方来装修,其中在设置图片模仿的时候,要选择几张图布局是怎么布局的,如下图所示:
Denis
2023/04/13
2.5K0
优化单选框 radio 样式:随点击变换选中和未选中状态图片
相关推荐
js原生、jquery单选框radio总结(获取值、设置默认选中值、样式)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文