checkbox应该是一个比较常用的html功能了,不过浏览器自带的checkbox往往样式不怎么好看,而且不同浏览器效果也不一样。出于美化和统一视觉效果的需求,checkbox的自定义就被提出来了。这里对实现方法做个总结。

实现思路

css实现的主要手段是利用label标签的模拟功能。labelfor属性可以关联一个具体的input元素,即使这个input本身不可被用户可见,有个与它对应的label后,用户可以直接通过和label标签交互来替代原生的input——而这给我们的样式模拟留下了空间。简而言之就是:

隐藏原生input,样式定义的过程留给label (那为什么不直接改变checkbox的样式?因为checkbox作为浏览器默认组件,样式更改上并没有label那么方便,很多属性对checkbox都是不起作用的,比如background,而label在样式上基本和div一样'任人宰割')

而在选择事件上,由于css的“相邻选择符(E+F)”的存在,让我们可以直接利用html的默认checkbox,免去了js模拟选择的麻烦。

demo详解

DEMO的部分CSS3属性只写了webkit前缀,所以建议用webkit内核的浏览器查看本页
HTML代码:

  1. <!-- input的id必须有,这个是label进行元素匹配所必需的 -->
  2. <!-- 可以看到每个input的id和label的“for”属性对应同一字符串 -->
  3. <input type="checkbox" id="checkbox01" />
  4. <label for="checkbox01"></label>
  5. <input type="checkbox" id="checkbox02" />
  6. <label for="checkbox02"></label>
  7. <input type="checkbox" id="checkbox03" />
  8. <label for="checkbox03"></label>
  9. <input type="checkbox" id="checkbox04" />
  10. <label for="checkbox04"></label>

HTML构建完成,接下来是对应的css:

  1. /* 隐藏所有checkbox */
  2. input[type='checkbox'] {
  3. display: none;
  4. }
  5. /* 对label进行模拟.背景图片随便拼凑的,不要吐槽品味*/
  6. /* transition效果是做个背景切换效果,这里单纯演示而已,实际上这个过渡不加更自然*/
  7. label {
  8. display: inline-block;
  9. width: 60px;
  10. height: 60px;
  11. position: relative;
  12. background: url(//www.chitanda.me/images/blank.png);
  13. background-position: 0 0px;
  14. -webkit-transition: background 0.5s linear;
  15. }
  16. /* 利用相邻选择符和checkbox`:checked`的状态伪类来模拟默认选中效果(就是点击后那个勾号的效果) */
  17. /*如果这段代码注释,点击后将没有任何反馈给用户*/
  18. /*因为label本身是没有点击后被选中的状态的,checkbox被隐藏后,这个状态只能手动模拟*/
  19. input[type='checkbox']:checked+label {
  20. background-position: 0 -60px;
  21. }

上面代码的效果如下所示,看起来好像也可以了。

不过仔细想想,貌似缺了点什么:选项对应的提示文字

对css不了解的新人可能这时候第一反应就是在label后面用p标签或者span标签来添加文字。不过这种方式都不怎么优雅。个人建议用css的::before::after伪元素(::before和:before是一个东西。不过为了把“伪元素”和“伪类”区分出来,W3C建议的写法是伪元素用::而伪类用:)

  1. /* 伪元素的生效很简单,定义`content`就好,其余的属性和普通div一样 */
  2. label::after {
  3. content: attr(data-name);
  4. /*利用attr可以减少css代码量,data-name写在html部分的label属性里*/
  5. display: inline-block;
  6. position: relative;
  7. width: 120px;
  8. height: 60px;
  9. left: 100%;
  10. vertical-align: middle;
  11. margin: 10px;
  12. }

当然既然可以用::after模拟label的文字,那也就可以用::before模拟label的checkbox样式,这里就不做解析了。

这里提一下伪类和伪元素的区分:

1)伪类:存在的意义是为了通过选择器找到那些不存在于DOM树中的信息以及不能被常规CSS选择器获取到的信息。 伪类由一个冒号:开头,冒号后面是伪类的名称和包含在圆括号中的可选参数。

常用的伪类:

  1. :active 向被激活的元素添加样式。
  2. :focus 向拥有键盘输入焦点的元素添加样式。
  3. :hover 当鼠标悬浮在元素上方时,向元素添加样式。
  4. :link 向未被访问的链接添加样式。
  5. :visited 向已被访问的链接添加样式。
  6. :first-child 向元素的第一个子元素添加样式。
  7. :checked 向选中的控件元素添加样式

2)伪元素:伪元素在DOM树中创建了一些抽象元素,这些抽象元素是不存在于文档语言里的(可以理解为html源码);

注意: css3为了区分伪类和伪元素,规定伪类前面有一个冒号,伪元素前面有两个冒号

常用伪元素:

  1. ::before 为作用元素的第一个子节点插入dom
  2. ::after 为作用元素的最后一个子节点插入dom
  • 同:都是通过选择器为元素添加样式
  • 异:伪元素会创建一个元素,但不是真正的Html元素,伪类相当于为一个元素创建一个class样式

实例:自定义radio

html代码:

  1. <input type="radio" id="radio">
  2. <label for="radio"></label>

css代码:

  1. input{
  2. display:none;
  3. }
  4. label {
  5. display: inline-block;
  6. width: 30px;
  7. height: 30px;
  8. border: 1px solid #333;
  9. border-radius: 50%;
  10. position: relative;
  11. }
  12. label::after {
  13. -webkit-transition: all .5s ease;
  14. -moz-transition: all .5s ease;
  15. -o-transition: all .5s ease;
  16. -ms-transition: all .5s ease;
  17. transition: all .5s ease;
  18. cursor: pointer;
  19. position: absolute;
  20. width: 16px;
  21. height: 16px;
  22. border-radius: 50%;
  23. top: 50%;
  24. left: 50%;
  25. margin-top:-8px;
  26. margin-left:-8px;
  27. z-index: 1;
  28. content: '';
  29. border:1px solid #333;
  30. }
  31. input:checked+label::after{
  32. background:red;
  33. }

实现效果:
点击前:

点击后:

实例:自定义checkbox

html代码:

  1. <input type="checkbox" id="checkbox">
  2. <label for="checkbox"></label>

css代码:

  1. input{
  2. display:none;
  3. }
  4. label {
  5. display: inline-block;
  6. width: 30px;
  7. height: 30px;
  8. border: 1px solid #333;
  9. position: relative;
  10. }
  11. label::after {
  12. -webkit-transition: opacity .5s ease;
  13. -moz-transition: opacity .5s ease;
  14. -o-transition: opacity .5s ease;
  15. -ms-transition: opacity .5s ease;
  16. transition: opacity .5s ease;
  17. cursor: pointer;
  18. position: absolute;
  19. content: '';
  20. opacity: 0;
  21. }
  22. input:checked+label::after{
  23. border: 2px solid #d73d32;
  24. border-top: none;
  25. border-right: none;
  26. -webkit-transform: rotate(-45deg);
  27. -ms-transform: rotate(-45deg);
  28. transform: rotate(-45deg);
  29. width:20px;
  30. height:10px;
  31. top:50%;
  32. margin-top:-8px;
  33. left:50%;
  34. margin-left:-10px;
  35. opacity: 1.0;
  36. }

实现效果:
点击前:点击后:

样式中用到了css3选择器,想详情了解,可查看:《CSS基础篇--CSS3属性选择器与(:not)选择器》

参考地址:https://segmentfault.com/a/11...

CSS效果篇--纯CSS+HTML实现checkbox的思路与实例的更多相关文章

  1. CSS效果篇--这里有你想要的CSS3漂亮的自定义Checkbox各种复选框

    在原来有一篇文章写到了<CSS效果篇--纯CSS+HTML实现checkbox的思路与实例>.这篇文章主要写各种自定义的checkbox复选框,实现如图所示的复选框: 大致的html代码都 ...

  2. 纯CSS+HTML实现checkbox的思路与实例

    checkbox应该是一个比较常用的html功能了,不过浏览器自带的checkbox往往样式不怎么好看,而且不同浏览器效果也不一样.出于美化和统一视觉效果的需求,checkbox的自定义就被提出来了. ...

  3. [css]演示:纯CSS实现的右侧底部简洁悬浮效果

    <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <meta name ...

  4. 【CSS Demo】纯 CSS 打造 Flow-Steps 导航

    low-Steps 导航效果常用于需要表示执行步骤的交互页面,效果如下: 步骤一 步骤二 步骤三   通常使用图片来实现 Flow-Steps 效果,但此方法的灵活性不足,当内容变化较大时就可能需要重 ...

  5. CSS布局技巧 -- 纯CSS让子元素的宽度总和决定其父元素的宽度

    使用场景 在移动端屏幕宽度有限的前提下,使用横向滚动的方式展示更多的内容.在这样的需求下,希望父元素作为容器,其宽度可以又横向排列资源的总宽度动态撑开,超过祖父元素的宽度:在不超过祖父元素时,自动继承 ...

  6. 兼容IE6-9,FF,Chrome的box-shadow效果(纯CSS)

    昨天由于工作关系,遇上了这个问题,苦恼一日无解——残念. 所幸终于在今天早上得到了解决,遗憾的是灵活性不够强,不能根据内容自适应,要配合JS才能达到自适应效果 不过总结到这里已经很满意了,毕竟规律已经 ...

  7. 实现一个成熟的底层毛玻璃效果(纯CSS)

    写在前面 毛玻璃背景是一个很常见的网页样式,想要实现,其实并不难,但经过我在网上的搜索发现,大量实现方法都较为不规范,且把问题复杂化了(例如各种z-index属性和position的定位)现提供一个代 ...

  8. 【动画消消乐|CSS】083.纯CSS实现卡通齿轮效果

    前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出-   自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计 ...

  9. 【css】 收藏 纯css打造 mackbook air

    http://www.cnblogs.com/myvin/p/4621231.html <html lang="en"> <head> <meta c ...

随机推荐

  1. fastadmin添加定时任务

    安装定时任务插件后 需要在crontab -e 中添加一条记录 * * * * * /usr/bin/php /var/www/yoursitepath/public/index.php /addon ...

  2. 使用pycharm开发web——django2.1.5(四)视图和模板相关

    刘老师说这块很重要..... 应该是很重要,大概看了一下,这里面关于views中函数作用,大概看来可能就是相应请求,传入数据和跳转,基本功能上貌似这些框架都差不多吧(其实我并没用过3个框架以上.... ...

  3. HDU 3642 求体积交集

    Get The Treasury 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3642 Problem Description Jack knows ...

  4. 基于TCP 协议的socket 简单通信

    DNS 服务器:域名解析 socket 套接字 : ​ socket 是处于应用层与传输层之间的抽象层,也是一组操作起来非常简单的接口(接受数据),此接口接受数据之后,交由操作系统 为什么存在 soc ...

  5. go的命令行参数

    package main import ( "fmt" "os" ) func main() { var s, sep string for i := 1; i ...

  6. 用shell脚本安装MySQL-5.7.22-官方版本多实例

    Install_CentOS7_MySQL57_multi_instance.sh #!/bin/bash #请提前准备好参数文件my.cnf PORT=3307 InitMySQL() { mkdi ...

  7. C#签名验签帮助类

    using System; using System.IO; using System.Text; using System.Collections.Generic; using System.Sec ...

  8. 开始学Python 啦 ,持续不断总结中。。(转)快捷键的使用

    最重要的快捷键1. ctrl+shift+A:万能命令行2. shift两次:查看资源文件新建工程第一步操作1. module设置把空包分层去掉,compact empty middle packag ...

  9. Django中 auto_now_add 和 auto_now 的区别

    auto_now_add = True #创建时添加的时间 修改数据时,不会发生改变 auto_now = True #修改数据的时间,每次修改都会有变动 ........

  10. Web Api 将DataTable装换成Excel,并通过文件流将其下载

    不废话,直接上代码 前端代码 <input type="button" class="layui-btn" value="Test-GetFil ...