纯CSS方法美化一个单选按钮/复选框

纯CSS方法美化一个单选按钮/复选框

看见了吧,前面那个小单选按钮,UI 小姐姐画的还是很好看的,看看我们前端用到了什么技术。

很明显这个小东西是使用 HTML 原生的 radio 和 CheckBox 来实现的,原生的单选按钮/复选框样式如下:


原生单选按钮和复选框

写项目的时候看了看 element-ui 和 View UI(十月份之前还叫 iview 来,改名了。。。)有没有可以直接使用的组件,结果都没有可以直接拿来就用的。那没办法了,要么借助插件,要么手写,插件可以使用 pretty checkbox 来实现。

A pure CSS library to beautify checkbox and radio buttons

这个插件好呀,插件效果是茫茫的多,但是为了个小功能就用个插件有点杀鸡焉用牛刀的感觉,算了,还是自己来吧。不就写点 css 吗。 come on 反正年底了,划划水了,走起。

看下实现效果:


纯CSS方法美化一个单选按钮/复选框

源代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>纯CSS方法美化一个单选按钮/复选框</title>
    <style>
        body{
            margin: 100px 100px;
        }
        .checkbox:checked {
            background:#E29F00;
        }
        .checkbox {
            -webkit-appearance:none;
            -moz-appearance:none;
            outline: none;
            width:20px;
            height:20px;
            background-color:#ffffff;
            border:solid 1px #dddddd;
            border-radius:50%;
            margin:0;
            padding:0;
            position:relative;
            display:inline-block;
            /*文字对齐方式*/
            vertical-align:top;
            transition:background-color ease 0.1s;
        }
        .checkbox:checked::after {
            content:'';
            top:3px;
            left:3px;
            position:absolute;
            border:#fff solid 2px;
            border-top:none;
            border-right:none;
            height:6px;
            width:10px;
            transform:rotate(-45deg);
        }
    </style>
</head>
<body>
    <input type="checkbox" class="checkbox">
</body>
</html>

实现思路:

  • 第一比较重要的 CSS 属性 appearance ,但是所有主流浏览器都不支持 appearance 属性,使用的时候必须加浏览器前缀。Firefox 支持替代的 -moz-appearance 属性,Safari 和 Chrome 支持替代的 -webkit-appearance 属性。其主要作用是去除系统默认的样式,appearance 常用于 IOS 下移除原生样式,如果用在复选框上,复选框就会直接消失,这时复选框的样式就能自定义样式了。

做个试验,页面放置一个复选框:

<input type="checkbox" class="box">

给复选框添加 -webkit-appearance: none; 这一条样式,复选框消失,标志着此时复选框的默认样式被去除,可以自定义样式了,不然你没办法去用 css 去操作 checkbox 的样式。

这时候设置以下样式我们就能得到个圆:

.box{
    -webkit-appearance: none;
    width: 30px;
    height: 30px;
    border-radius: 50%;
    border: 2px solid red;
}

但此时这个东西有个缺点,看动图演示:


动图演示

我们去点击会默认出现外边框,圆外区域点击下才能消失,这个很好理解,input 为 text 的时候,作为输入框,输入框会有失焦聚焦的效果,而且 checkbox 说到底也是 input 所以也会有这个效果,只要我们在加上一条 css 语句就行了。

outline: none;//去除默认外边框

这时候就差一个背景变色和对号显示了。这个就太简单了,选中的时候使用x:checked 来设置选中的样式。里面的对号就是一个正方形只显示了两条边,然后通过 transform:rotate() 旋转四十五度达到的效果,这个用伪元素来实现就行了。

你肯定有个疑问能不能使用 radio 来替代 checkbox ?
答案是最好不要,因为如果只有一个 radio 标签,一旦选中就不能取消了,单选的切换只能是最少两个以上的相同 name 的标签,只能通过刷新页面来恢复初始页面。

既然都写到这里了,我们就试着模仿一下 pretty checkbox 里面的东西,比如下面这个图示例子:


这个心还可以放大缩小,一些炫酷的效果就可以使用 animation 来实现。可见没什么难的只要有百度,上源代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>纯CSS方法美化一个单选按钮/复选框</title>
    <style>
        body{
            margin: 100px 100px;
        }
        .checkbox {
            -webkit-appearance:none;
            -moz-appearance:none;
            outline: none;
            width:20px;
            height:20px;
            background-color:#ffffff;
            border:solid 1px #dddddd;
            border-radius:50%;
            margin:0;
            padding:0;
            position:relative;
            display:inline-block;
            /*文字对齐方式*/
            vertical-align:top;
            transition:background-color ease 0.5s;
        }
        .checkbox:checked::after,.checkbox:checked::before{
            content: "";
            position: absolute;
            width: 8px;
            height: 12px;
            top:3px;
            left:3px;
            border-radius: 5px 5px 0 0;
            background-color: red;
        }
        .checkbox:checked::after{
            transform: rotate(-45deg);
        }
        .checkbox:checked::before{
            left: 5.8px;
            transform: rotate(45deg);
        }
</style>
</head>
<body>
<input type="checkbox" class="checkbox" name="radio">
</body>
</html>

比較常見的還有一個叉,順便也寫出來了,上面的 我們都給畫出來了,這個 ×就比較簡單了,正好兩個僞元素(正負)旋轉45度角。


送上源代碼:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>纯CSS方法美化一个单选按钮/复选框</title>
    <style>
        body{
            margin: 100px 100px;
        }
        .checkbox:checked {
            background:#5cb85c;
        }
        .checkbox {
            -webkit-appearance:none;
            -moz-appearance:none;
            outline: none;
            width:20px;
            height:20px;
            background-color:#ffffff;
            border:solid 1px #dddddd;
            border-radius:50%;
            margin:0;
            padding:0;
            position:relative;
            display:inline-block;
            /*文字对齐方式*/
            vertical-align:top;
            transition:background-color ease 0.1s;
        }
        .checkbox:checked::after,.checkbox:checked::before {
            content:'';
            position:absolute;
            height:2px;
            width:15px;
            left: 1.5px;
            top: 8px;
            background-color: #ffffff;
        }
        .checkbox:checked::after{
            transform: rotate(-45deg);
        }
        .checkbox:checked::before {
            transform: rotate(45deg);
        }
    </style>
</head>
<body>
    <input type="checkbox" class="checkbox">
</body>
</html>

写作时间 2020-01-17 20:47


补充于2020年2月28日 21点19分

这次主要是讨论下为什么单选单选按钮/复选框 不能直接通过 CSS 样式自定义,非要通过appearance 去除默认样式才能自定义?

我们根据元素在布局时是否换行把 HTML 标签分为块级元素内联元素。典型的标签就是 div 和 span如果根据是否具有可替换内容,我们也可以把元素分为替换元素和非替换元素。

替换元素,顾名思义,内容可以被替换。举个典型的例子:

<img src="1.jpg">

如果我们把上面的1.jpg换成2.jpg,图片就被替换了,这种通过修改某个属性值呈现的内容就可以被替换的元素就称为“替换元素”。因此,<img>、<object>、<video>、<iframe>或者表单元素<textarea>和<input>都是典型的替换元素。

替换元素除了内容可替换这一特性以外,其中还有一个重要的特性。就是内容的外观不受页面上的CSS的影响。用专业的话讲就是在样式表现在CSS作用域之外。如何更改替换元素本身的外观?需要类似appearance属性,或者浏览器自身暴露的一些样式接口,例如::-ms-check{}可以更改高版本IE浏览器下单复选框的内间距、背景色等样式,但是直接input[type='checkbox']{}却无法更改内间距、背景色等样式。

总结:复选框属于 input 标签是可替换的元素,需要类似appearance属性才能修改样式。

参考张鑫旭的「CSS 世界」。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容