How to style a checkbox using CSS?
我正在尝试使用以下选项设置复选框的样式:
1 | <input type="checkbox" style="border:2px dotted #00f;display:block;background:#ff0000;" /> |
但是没有应用样式。复选框仍显示其默认样式。我如何给它指定的样式?
更新:下面的答案引用了CSS3广泛可用之前的状态。在现代浏览器(包括Internet Explorer 9和更高版本)中,使用首选样式创建复选框替换更简单,而不使用JavaScript。
以下是一些有用的链接:
- 仅使用CSS创建自定义表单复选框
- 简易CSS复选框生成器
- 你可以用"黑"复选框做的事情
- 使用CSS3实现自定义复选框和单选按钮
- 如何使用CSS设置复选框样式
值得注意的是,根本问题没有改变。您仍然不能将样式(边框等)直接应用于checkbox元素,并且这些样式会影响HTML复选框的显示。然而,改变的是现在可以隐藏实际的复选框,并用自己的样式元素替换它,只使用CSS。特别是,因为CSS现在有一个广泛支持的
老一套的回答
这里有一篇关于样式复选框的有用文章。基本上,作者发现不同浏览器的默认复选框差异很大,而且许多浏览器总是显示默认的复选框,不管您如何设计。所以真的没有一个简单的方法。
不难想象一个解决方案,在这个解决方案中,您将使用javascript在复选框上覆盖一个图像,并单击该图像,从而选中真正的复选框。没有javascript的用户将看到默认复选框。
编辑后添加:这是一个很好的脚本,可以为您做到这一点;它隐藏了真正的checkbox元素,用一个样式化的跨度替换它,并重定向click事件。
有一种方法可以只用CSS来实现这一点。我们可以(ab)使用
CSS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | .myCheckbox input { // display: none; // Better than display: none for accessibility reasons position: relative; z-index: -9999; } .myCheckbox span { width: 20px; height: 20px; display: block; background: url("link_to_image"); } .myCheckbox input:checked + span { background: url("link_to_another_image"); } |
HTML:
1 2 3 4 5 | <label for="test">Label for my styled"checkbox"</label> <label class="myCheckbox"> <input type="checkbox" name="test"/> <span></span> </label> |
您可以通过使用
注意,这只适用于兼容的浏览器,我认为这与一些浏览器不允许您在输入元素上设置
这只是一个WebKit浏览器解决方案(Chrome、Safari、移动浏览器)
参见示例小提琴
1 2 3 4 5 | $(function() { $('input').change(function() { $('div').html(Math.random()); }); }); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | /* Main Classes */ .myinput[type="checkbox"]:before { position: relative; display: block; width: 11px; height: 11px; border: 1px solid #808080; content:""; background: #FFF; } .myinput[type="checkbox"]:after { position: relative; display: block; left: 2px; top: -11px; width: 7px; height: 7px; border-width: 1px; border-style: solid; border-color: #B3B3B3 #dcddde #dcddde #B3B3B3; content:""; background-image: linear-gradient(135deg, #B1B6BE 0%, #FFF 100%); background-repeat: no-repeat; background-position: center; } .myinput[type="checkbox"]:checked:after { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAQAAABuW59YAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAB2SURBVHjaAGkAlv8A3QDyAP0A/QD+Dam3W+kCAAD8APYAAgTVZaZCGwwA5wr0AvcA+Dh+7UX/x24AqK3Wg/8nt6w4/5q71wAAVP9g/7rTXf9n/+9N+AAAtpJa/zf/S//DhP8H/wAA4gzWj2P4lsf0JP0A/wADAHB0Ngka6UmKAAAAAElFTkSuQmCC'), linear-gradient(135deg, #B1B6BE 0%, #FFF 100%); } .myinput[type="checkbox"]:disabled:after { -webkit-filter: opacity(0.4); } .myinput[type="checkbox"]:not(:disabled):checked:hover:after { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAQAAABuW59YAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAB2SURBVHjaAGkAlv8A3QDyAP0A/QD+Dam3W+kCAAD8APYAAgTVZaZCGwwA5wr0AvcA+Dh+7UX/x24AqK3Wg/8nt6w4/5q71wAAVP9g/7rTXf9n/+9N+AAAtpJa/zf/S//DhP8H/wAA4gzWj2P4lsf0JP0A/wADAHB0Ngka6UmKAAAAAElFTkSuQmCC'), linear-gradient(135deg, #8BB0C2 0%, #FFF 100%); } .myinput[type="checkbox"]:not(:disabled):hover:after { background-image: linear-gradient(135deg, #8BB0C2 0%, #FFF 100%); border-color: #85A9BB #92C2DA #92C2DA #85A9BB; } .myinput[type="checkbox"]:not(:disabled):hover:before { border-color: #3D7591; } /* Large checkboxes */ .myinput.large { height: 22px; width: 22px; } .myinput.large[type="checkbox"]:before { width: 20px; height: 20px; } .myinput.large[type="checkbox"]:after { top: -20px; width: 16px; height: 16px; } /* Custom checkbox */ .myinput.large.custom[type="checkbox"]:checked:after { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGHRFWHRBdXRob3IAbWluZWNyYWZ0aW5mby5jb23fZidLAAAAk0lEQVQ4y2P4//8/AyUYwcAD+OzN/oMwshjRBoA0Gr8+DcbIhhBlAEyz+qZZ/7WPryHNAGTNMOxpJvo/w0/uP0kGgGwGaZbrKgfTGnLc/0nyAgiDbEY2BCRGdCDCnA2yGeYVog0Aae5MV4c7Gzk6CRqAbDM2w/EaQEgzXgPQnU2SAcTYjNMAYm3GaQCxNuM0gFwMAPUKd8XyBVDcAAAAAElFTkSuQmCC'), linear-gradient(135deg, #B1B6BE 0%, #FFF 100%); } .myinput.large.custom[type="checkbox"]:not(:disabled):checked:hover:after { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGHRFWHRBdXRob3IAbWluZWNyYWZ0aW5mby5jb23fZidLAAAAk0lEQVQ4y2P4//8/AyUYwcAD+OzN/oMwshjRBoA0Gr8+DcbIhhBlAEyz+qZZ/7WPryHNAGTNMOxpJvo/w0/uP0kGgGwGaZbrKgfTGnLc/0nyAgiDbEY2BCRGdCDCnA2yGeYVog0Aae5MV4c7Gzk6CRqAbDM2w/EaQEgzXgPQnU2SAcTYjNMAYm3GaQCxNuM0gFwMAPUKd8XyBVDcAAAAAElFTkSuQmCC'), linear-gradient(135deg, #8BB0C2 0%, #FFF 100%); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> <table style="width:100%"> <tr> <td>Normal:</td> <td><input type="checkbox" /></td> <td><input type="checkbox" checked="checked" /></td> <td><input type="checkbox" disabled="disabled" /></td> <td><input type="checkbox" disabled="disabled" checked="checked" /></td> </tr> <tr> <td>Small:</td> <td><input type="checkbox" class="myinput" /></td> <td><input type="checkbox" checked="checked" class="myinput" /></td> <td><input type="checkbox" disabled="disabled" class="myinput" /></td> <td><input type="checkbox" disabled="disabled" checked="checked" class="myinput" /></td> </tr> <tr> <td>Large:</td> <td><input type="checkbox" class="myinput large" /></td> <td><input type="checkbox" checked="checked" class="myinput large" /></td> <td><input type="checkbox" disabled="disabled" class="myinput large" /></td> <td><input type="checkbox" disabled="disabled" checked="checked" class="myinput large" /></td> </tr> <tr> <td>Custom icon:</td> <td><input type="checkbox" class="myinput large custom" /></td> <td><input type="checkbox" checked="checked" class="myinput large custom" /></td> <td><input type="checkbox" disabled="disabled" class="myinput large custom" /></td> <td><input type="checkbox" disabled="disabled" checked="checked" class="myinput large custom" /></td> </tr> </table> |
额外的Webkit风格翻转开关小提琴
1 2 3 4 5 6 | $(function() { var f = function() { $(this).next().text($(this).is(':checked') ? ':checked' : ':not(:checked)'); }; $('input').change(f).trigger('change'); }); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | body { font-family: arial; } .flipswitch { position: relative; background: white; width: 120px; height: 40px; -webkit-appearance: initial; border-radius: 3px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); outline: none; font-size: 14px; font-family: Trebuchet, Arial, sans-serif; font-weight: bold; cursor: pointer; border: 1px solid #ddd; } .flipswitch:after { position: absolute; top: 5%; display: block; line-height: 32px; width: 45%; height: 90%; background: #fff; box-sizing: border-box; text-align: center; transition: all 0.3s ease-in 0s; color: black; border: #888 1px solid; border-radius: 3px; } .flipswitch:after { left: 2%; content:"OFF"; } .flipswitch:checked:after { left: 53%; content:"ON"; } |
1 2 3 4 5 6 7 8 | <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"> Webkit friendly mobile-style checkbox/flipswitch <input type="checkbox" class="flipswitch" /> <span></span> <input type="checkbox" checked="checked" class="flipswitch" /> <span></span> |
开始之前(截至2015年1月)
原来的问题和答案现在已经5岁了。因此,这只是一个小小的更新。
首先,在样式复选框方面有许多方法。基本原则是:
您需要隐藏默认的复选框控件,该控件由您的浏览器设置样式,并且不能使用CSS以任何有意义的方式被覆盖。
隐藏控件后,您仍然需要能够检测并切换其选中状态。
复选框的选中状态需要通过设置新元素的样式来反映。
解决办法(原则上)
以上可以通过多种方法来完成——您经常会听到使用CSS3伪元素是正确的方法。实际上,没有真正正确或错误的方法,这取决于最适合您将在其中使用的上下文的方法。也就是说,我有一个更喜欢的。
在
隐藏复选框
在复选框后添加一个新元素,您将相应地设置样式。它必须出现在复选框之后,以便可以使用CSS进行选择,并根据
解决方案(代码)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | label input { visibility: hidden;/* <-- hide the default checkbox, the rest is to hide and alllow tabbing, which display:none prevents */ display:block; height:0; width:0; position:absolute; overflow:hidden; } label span {/* <-- style the artificial checkbox */ height: 10px; width: 10px; border: 1px solid grey; display: inline-block; } [type=checkbox]:checked + span {/* <-- style its checked state */ background: black; } |
1 2 3 4 5 | <label> <input type='checkbox'> <span></span> Checkbox label text </label> |
但是嘿!我听到你在喊。如果我想在框中显示一个漂亮的勾号或叉号呢?我不想使用背景图像!
好吧,这就是CSS3的伪元素可以发挥作用的地方。这些支持
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | label input { display: none; /* hide the default checkbox */ } /* style the artificial checkbox */ label span { height: 10px; width: 10px; border: 1px solid grey; display: inline-block; position: relative; } /* style its checked state..with a ticked icon */ [type=checkbox]:checked + span:before { content: '\2714'; position: absolute; top: -5px; left: 0; } |
1 2 3 4 5 | <label> <input type='checkbox'> <span></span> Checkbox label text </label> |
我会按照SW4答案的建议隐藏复选框并用自定义范围覆盖它,建议使用此HTML
1 2 3 4 | <label> <input type="checkbox"> <span>send newsletter</span> </label> |
包装标签整齐地允许点击文本而不需要"for id"属性链接。然而,
不要用它可以通过点击或点击来工作,但这是一种使用复选框的蹩脚方法。有些人仍然使用更有效的tabkbbd来移动焦点,spacebkbd来激活,用这个方法隐藏会禁用它。如果表单很长,就可以节省一个人的手腕来使用
Cobberboy的答案推荐字体Awesome,这通常比位图好,因为字体是可伸缩的向量。使用上面的HTML,我建议使用以下CSS规则:
隐藏复选框
1 2 3 4 5 | input[type="checkbox"] { position: absolute; opacity: 0; z-index: -1; } |
我只使用了负的
1 2 3 4 5 | input[type="checkbox"] { appearance: none; -webkit-appearance: none; -moz-appearance: none; } |
样式复选框标签
1 2 3 4 | input[type="checkbox"] + span { font: 16pt sans-serif; color: #000; } |
添加复选框外观
1 2 3 4 5 6 7 8 | input[type="checkbox"] + span:before { font: 16pt FontAwesome; content: '\00f096'; display: inline-block; width: 16pt; padding: 2px 0 0 3px; margin-right: 0.5em; } |
添加复选框选中的外观
1 2 3 | input[type="checkbox"]:checked + span:before { content: '\00f046'; } |
添加焦点轮廓
1 2 3 | input[type="checkbox"]:focus + span:before { outline: 1px dotted #aaa; } |
Safari不提供此功能(请参见@jason sankey的评论),您应该使用
"为禁用设置灰色"复选框
1 2 3 | input[type="checkbox"]:disabled + span { color: #999; } |
"设置非禁用的悬停阴影"复选框
1 2 3 | input[type="checkbox"]:not(:disabled) + span:hover:before { text-shadow: 0 1px 2px #77F; } |
演示小提琴
尝试将鼠标悬停在复选框上,并使用t和shift+t移动,使用spacebkbd切换。
您可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | .checkbox > input[type=checkbox] { visibility: hidden; } .checkbox { position: relative; display: block; width: 80px; height: 26px; margin: 0 auto; background: #FFF; border: 1px solid #2E2E2E; border-radius: 2px; -webkit-border-radius: 2px; -moz-border-radius: 2px; } .checkbox:after { position: absolute; display: inline; right: 10px; content: 'no'; color: #E53935; font: 12px/26px Arial, sans-serif; font-weight: bold; text-transform: capitalize; z-index: 0; } .checkbox:before { position: absolute; display: inline; left: 10px; content: 'yes'; color: #43A047; font: 12px/26px Arial, sans-serif; font-weight: bold; text-transform: capitalize; z-index: 0; } .checkbox label { position: absolute; display: block; top: 3px; left: 3px; width: 34px; height: 20px; background: #2E2E2E; cursor: pointer; transition: all 0.5s linear; -webkit-transition: all 0.5s linear; -moz-transition: all 0.5s linear; border-radius: 2px; -webkit-border-radius: 2px; -moz-border-radius: 2px; z-index: 1; } .checkbox input[type=checkbox]:checked + label { left: 43px; } |
1 2 | <input id="checkbox1" type="checkbox" value="1" /> <label for="checkbox1"></label> |
以及上面代码的小提琴。请注意,有些CSS在旧版本的浏览器中不起作用,但我敢肯定有一些奇特的javascript示例!
易于实施和定制的解决方案
经过大量的搜索和测试,我得到了这个易于实现和定制的解决方案。在此解决方案中:
简单地将流动的CSS放在页面顶部,所有复选框样式都将发生如下变化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | input[type=checkbox] { transform: scale(1.5); } input[type=checkbox] { width: 30px; height: 30px; margin-right: 8px; cursor: pointer; font-size: 17px; visibility: hidden; } input[type=checkbox]:after { content:""; background-color: #fff; display: inline-block; margin-left: 10px; padding-bottom: 5px; color: #00BFF0; width: 22px; height: 25px; visibility: visible; border: 1px solid #00BFF0; padding-left: 3px; border-radius: 5px; } input[type=checkbox]:checked:after { content:"\2714"; padding: -5px; font-weight: bold; } |
您可以避免添加额外的标记。通过设置css
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | input[type="checkbox"] { -webkit-appearance: none; -moz-appearance: none; appearance: none; /* Styling checkbox */ width: 16px; height: 16px; background-color: red; } input[type="checkbox"]:checked { background-color: green; } |
1 | <input type="checkbox" /> |
我更喜欢使用图标字体(如fontawome),因为使用CSS很容易修改颜色,而且在高像素密度的设备上缩放效果很好。这里是另一个纯粹的CSS变体,使用与上面类似的技术。
(以下是静态图像,因此您可以可视化结果;有关交互式版本,请参阅jsFiddle)
与其他解决方案一样,它使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | span.bigcheck-target { font-family: FontAwesome; /* use an icon font for the checkbox */ } input[type='checkbox'].bigcheck { position: relative; left: -999em; /* hide the real checkbox */ } input[type='checkbox'].bigcheck + span.bigcheck-target:after { content:"\f096"; /* In fontawesome, is an open square (fa-square-o) */ } input[type='checkbox'].bigcheck:checked + span.bigcheck-target:after { content:"\f046"; /* fontawesome checked box (fa-check-square-o) */ } /* ==== optional - colors and padding to make it look nice === */ body { background-color: #2C3E50; color: #D35400; font-family: sans-serif; font-weight: 500; font-size: 4em; /* set this to whatever size you want */ } span.bigcheck { display: block; padding: 0.5em; } |
1 2 3 4 5 6 7 8 9 | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" /> <span class="bigcheck"> <label class="bigcheck"> Cheese <input type="checkbox" class="bigcheck" name="cheese" value="yes" /> <span class="bigcheck-target"></span> </label> </span> |
这是给你的琴。
这是一篇相当古老的文章,但最近我发现了一个非常有趣的解决问题的方法。
您可以使用
实例小提琴
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | input[type=checkbox] { width: 23px; height: 23px; -webkit-appearance: none; -moz-appearance: none; appearance: none; margin-right: 10px; background-color: #878787; outline: 0; border: 0; display: inline-block; -webkit-box-shadow: none !important; -moz-box-shadow: none !important; box-shadow: none !important; } input[type=checkbox]:focus { outline: none; border: none !important; -webkit-box-shadow: none !important; -moz-box-shadow: none !important; box-shadow: none !important; } input[type=checkbox]:checked { background-color: green; text-align: center; line-height: 15px; } |
1 | <input type="checkbox"> |
不幸的是,浏览器支持对于我的个人测试中的
"我能用吗?"链接
从我的谷歌搜索,这是最简单的方式为复选框样式。只需根据您的设计添加:after和:checked:after css。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | body{ background: #DDD; } span{ margin-left: 30px; } input[type=checkbox] { cursor: pointer; font-size: 17px; visibility: hidden; position: absolute; top: 0; left: 0; transform: scale(1.5); } input[type=checkbox]:after { content:""; background-color: #fff; display: inline-block; color: #00BFF0; width: 14px; height: 19px; visibility: visible; border: 1px solid #FFF; padding: 0 3px; margin: 2px 0; border-radius: 8px; box-shadow: 0 0 15px 0 rgba(0,0,0,0.08), 0 0 2px 0 rgba(0,0,0,0.16); } input[type=checkbox]:checked:after { content:"\2714"; display: unset; font-weight: bold; } |
1 | <input type="checkbox"> <span>Select Text</span> |
这里有一个简单的CSS解决方案,没有jquery或javascript
我正在使用fontawsome图标,但您可以使用任何图像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | input[type=checkbox] { display: inline-block; font-family: FontAwesome; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; visibility: hidden; font-size: 14px; } input[type=checkbox]:before { content: @fa-var-square-o; visibility: visible; /*font-size: 12px;*/ } input[type=checkbox]:checked:before { content: @fa-var-check-square-o; } |
我的解决方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | input[type="checkbox"] { cursor: pointer; -webkit-appearance: none; -moz-appearance: none; appearance: none; outline: 0; background: lightgray; height: 16px; width: 16px; border: 1px solid white; } input[type="checkbox"]:checked { background: #2aa1c0; } input[type="checkbox"]:hover { filter: brightness(90%); } input[type="checkbox"]:disabled { background: #e6e6e6; opacity: 0.6; pointer-events: none; } input[type="checkbox"]:after { content: ''; position: relative; left: 40%; top: 20%; width: 15%; height: 40%; border: solid #fff; border-width: 0 2px 2px 0; transform: rotate(45deg); display: none; } input[type="checkbox"]:checked:after { display: block; } input[type="checkbox"]:disabled:after { border-color: #7b7b7b; } |
1 2 3 4 | <input type="checkbox"> <input type="checkbox" checked> <input type="checkbox" disabled> <input type="checkbox" disabled checked> |
我认为最简单的方法是设计一个
HTML
1 2 | <input type="checkbox" id="first" /> <label for="first"> </label> |
CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | checkbox { display: none; } checkbox + label { /* Style for checkbox normal */ width: 16px; height: 16px; } checkbox::checked + label, label.checked { /* Style for checkbox checked */ } |
伊克斯!所有这些解决方法都让我得出这样的结论:如果你想设计样式,HTML复选框有点糟糕。
作为一个预警,这不是一个CSS实现。我只是想分享我想出的解决方案,以防其他人发现它有用。
我使用了html5
这样做的好处是,您不必使用外部图像,可能可以节省一些带宽。
缺点是,如果一个浏览器由于某种原因不能正确地呈现它,那么就没有回退。尽管这在2017年是否仍然是一个问题仍存在争议。
更新我发现旧代码很难看,所以我决定重写它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | Object.prototype.create = function(args){ var retobj = Object.create(this); retobj.constructor(args || null); return retobj; } var Checkbox = Object.seal({ width: 0, height: 0, state: 0, document: null, parent: null, canvas: null, ctx: null, /* * args: * name default desc. * * width 15 width * height 15 height * document window.document explicit document reference * target this.document.body target element to insert checkbox into */ constructor: function(args){ if(args === null) args = {}; this.width = args.width || 15; this.height = args.height || 15; this.document = args.document || window.document; this.parent = args.target || this.document.body; this.canvas = this.document.createElement("canvas"); this.ctx = this.canvas.getContext('2d'); this.canvas.width = this.width; this.canvas.height = this.height; this.canvas.addEventListener("click", this.ev_click(this), false); this.parent.appendChild(this.canvas); this.draw(); }, ev_click: function(self){ return function(unused){ self.state = !self.state; self.draw(); } }, draw_rect: function(color, offset){ this.ctx.fillStyle = color; this.ctx.fillRect(offset, offset, this.width - offset * 2, this.height - offset * 2); }, draw: function(){ this.draw_rect("#CCCCCC", 0); this.draw_rect("#FFFFFF", 1); if(this.is_checked()) this.draw_rect("#000000", 2); }, is_checked: function(){ return !!this.state; } }); |
这是一个有效的演示。
新版本使用原型和差异继承来创建一个有效的系统来创建复选框。要创建复选框:
1 | var my_checkbox = Checkbox.create(); |
这将立即将复选框添加到DOM并挂接事件。要查询是否选中复选框:
1 | my_checkbox.is_checked(); // true if checked, else false |
另外需要注意的是,我去掉了这个循环。
更新2在上一次更新中,我忽略了一点,那就是使用画布比只制作一个复选框更有优势,不管你想让它看起来怎样。如果愿意,还可以创建多状态复选框。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | Object.prototype.create = function(args){ var retobj = Object.create(this); retobj.constructor(args || null); return retobj; } Object.prototype.extend = function(newobj){ var oldobj = Object.create(this); for(prop in newobj) oldobj[prop] = newobj[prop]; return Object.seal(oldobj); } var Checkbox = Object.seal({ width: 0, height: 0, state: 0, document: null, parent: null, canvas: null, ctx: null, /* * args: * name default desc. * * width 15 width * height 15 height * document window.document explicit document reference * target this.document.body target element to insert checkbox into */ constructor: function(args){ if(args === null) args = {}; this.width = args.width || 15; this.height = args.height || 15; this.document = args.document || window.document; this.parent = args.target || this.document.body; this.canvas = this.document.createElement("canvas"); this.ctx = this.canvas.getContext('2d'); this.canvas.width = this.width; this.canvas.height = this.height; this.canvas.addEventListener("click", this.ev_click(this), false); this.parent.appendChild(this.canvas); this.draw(); }, ev_click: function(self){ return function(unused){ self.state = !self.state; self.draw(); } }, draw_rect: function(color, offsetx, offsety){ this.ctx.fillStyle = color; this.ctx.fillRect(offsetx, offsety, this.width - offsetx * 2, this.height - offsety * 2); }, draw: function(){ this.draw_rect("#CCCCCC", 0, 0); this.draw_rect("#FFFFFF", 1, 1); this.draw_state(); }, draw_state: function(){ if(this.is_checked()) this.draw_rect("#000000", 2, 2); }, is_checked: function(){ return this.state == 1; } }); var Checkbox3 = Checkbox.extend({ ev_click: function(self){ return function(unused){ self.state = (self.state + 1) % 3; self.draw(); } }, draw_state: function(){ if(this.is_checked()) this.draw_rect("#000000", 2, 2); if(this.is_partial()) this.draw_rect("#000000", 2, (this.height - 2) / 2); }, is_partial: function(){ return this.state == 2; } }); |
我稍微修改了最后一个代码片段中使用的
在JavaScript和CSS之间进行选择时需要考虑的问题。
旧的、设计不良的代码工作演示
首先,设置画布
1 2 3 4 5 6 | var canvas = document.createElement('canvas'), ctx = canvas.getContext('2d'), checked = 0; // The state of the checkbox canvas.width = canvas.height = 15; // Set the width and height of the canvas document.body.appendChild(canvas); document.body.appendChild(document.createTextNode(' Togglable Option')); |
接下来,设计一种让画布自我更新的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 | (function loop(){ // Draws a border ctx.fillStyle = '#ccc'; ctx.fillRect(0,0,15,15); ctx.fillStyle = '#fff'; ctx.fillRect(1,1,13,13); // Fills in canvas if checked if(checked){ ctx.fillStyle = '#000'; ctx.fillRect(2,2,11,11); } setTimeout(loop,1000/10); // refresh 10 times per second })(); |
最后一部分是使其具有交互性。幸运的是,这很简单:
1 2 3 | canvas.onclick = function(){ checked = !checked; } |
这就是IE中可能存在问题的地方,因为它们在JavaScript中有奇怪的事件处理模型。
我希望这能帮助别人,它绝对适合我的需要。
使用普通CSS3修改复选框样式,不需要任何JS&HTML操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | .form input[type="checkbox"]:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; content:"\f096"; opacity: 1 !important; margin-top: -25px; appearance: none; background: #fff; } .form input[type="checkbox"]:checked:before { content:"\f046"; } .form input[type="checkbox"] { font-size: 22px; appearance: none; -webkit-appearance: none; -moz-appearance: none; } |
1 2 3 4 5 | <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" /> <form class="form"> <input type="checkbox" /> </form> |
一个简单而轻量级的模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | input[type=checkbox] { cursor: pointer; } input[type=checkbox]:checked:before { content:"\2713"; background: #fffed5; text-shadow: 1px 1px 1px rgba(0, 0, 0, .2); font-size: 20px; text-align: center; line-height: 8px; display: inline-block; width: 13px; height: 15px; color: #00904f; border: 1px solid #cdcdcd; border-radius: 4px; margin: -3px -3px; text-indent: 1px; } input[type=checkbox]:before { content:"\202A"; background: #ffffff; text-shadow: 1px 1px 1px rgba(0, 0, 0, .2); font-size: 20px; text-align: center; line-height: 8px; display: inline-block; width: 13px; height: 15px; color: #00904f; border: 1px solid #cdcdcd; border-radius: 4px; margin: -3px -3px; text-indent: 1px; } |
1 2 3 4 5 6 | <input type="checkbox" checked="checked">checked1 <input type="checkbox">unchecked2 <input type="checkbox" checked="checked" id="id1"> <label for="id1">checked2+label</label> <label for="id2">unchecked2+label+rtl</label> <input type="checkbox" id="id2"> |
网址:https://jsfiddle.net/rvgccn5b/
No JavaScript or Jquery required.
更改复选框样式的简单方法。
HTML
1 2 | <input type="checkbox" id="option" /> <label for="option"> <span></span> Click me </label> |
CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | input[type="checkbox"] { display: none; border: none !important; box-shadow: none !important; } input[type="checkbox"] + label span { background: url(http://imgh.us/uncheck.png); width: 49px; height: 49px; display: inline-block; vertical-align: middle; } input[type="checkbox"]:checked + label span { background: url(http://imgh.us/check_2.png); width: 49px; height: 49px; vertical-align: middle; } |
这里是jsFiddle链接:https://jsFiddle.net/05y2bge3e3/
这里是一个仅支持css/html的版本,根本不需要jquery或javascript,简单而干净的html,以及非常简单和简短的css。
这是J小提琴
http://jsfiddle.net/v71kn3pr/
这是HTML
1 2 3 | <input type="checkbox" name="myCheckbox" id="myCheckbox_01_item" value="red" /> <label for="myCheckbox_01_item" class="box"></label> <label for="myCheckbox_01_item" class="text">I accept the Terms of Use.</label> |
这里是CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #myContainer { outline: black dashed 1px; width: 200px; } #myContainer input[type="checkbox"][name="myCheckbox"] { display: none; } #myContainer input[type="checkbox"][name="myCheckbox"]:not(:checked) + label.box { display: inline-block; width: 25px; height: 25px; border: black solid 1px; background: #FFF ; margin: 5px 5px; } #myContainer input[type="checkbox"][name="myCheckbox"]:checked + label.box { display: inline-block; width: 25px; height: 25px; border: black solid 1px; background: #F00; margin: 5px 5px; } #myContainer input[type="checkbox"][name="myCheckbox"] + label + label.text { font: normal 12px arial; display: inline-block; line-height: 27px; vertical-align: top; margin: 5px 0px; } |
这可以调整为能够有单独的收音机或复选框,复选框组和收音机按钮组以及。
这个HTML/CSS允许你同时捕获点击标签,所以复选框将被选中和取消选中,即使你只是点击标签。
这种类型的复选框/单选按钮适用于任何表单,完全没有问题。已经使用PHP、ASPX、JavaFaces和ColdFusion进行了测试。
这是最简单的方法,您可以选择提供此样式的复选框。
CSS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | .check-box input { display: none; } .check-box span:before { content: ' '; width: 20px; height: 20px; display: inline-block; background: url("unchecked.png"); } .check-box input:checked + span:before { background: url("checked.png"); } |
HTML:
1 2 3 4 | <label class="check-box"> <input type="checkbox"> <span>Check box Text</span> </label> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | input[type=checkbox].css-checkbox { position: absolute; overflow: hidden; clip: rect(0 0 0 0); height:1px; width:1px; margin:-1px; padding:0; border:0; } input[type=checkbox].css-checkbox + label.css-label { padding-left:20px; height:15px; display:inline-block; line-height:15px; background-repeat:no-repeat; background-position: 0 0; font-size:15px; vertical-align:middle; cursor:pointer; } input[type=checkbox].css-checkbox:checked + label.css-label { background-position: 0 -15px; } .css-label{ background-image:url(http://csscheckbox.com/checkboxes/dark-check-green.png); } |
警告:在写作的时候,以下是正确的,但与此同时,事情有所进展。
Afaik现代浏览器使用本机OS控件显示复选框,因此无法设置其样式。
因为像边缘和火狐这样的浏览器不支持:before:after-on复选框输入标签,这里有一个纯HTML和CSS的替代方案。当然,您应该根据自己的需求来编辑CSS。
将HTML设置为如下复选框:
1 2 3 4 5 | <input type='checkbox' /> <label> <span></span> Checkbox label </label> |
将此样式应用于复选框以更改颜色标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <style> .custom-checkbox { position: relative; } .custom-checkbox input{ position: absolute; left: 0; top: 0; height:15px; width: 50px; /* Expand the checkbox so that it covers */ z-index : 1; /* the label and span, increase z-index to bring it over */ opacity: 0; /* the label and set opacity to 0 to hide it. */ } .custom-checkbox input+label { position: relative; left: 0; top: 0; padding-left: 25px; color: black; } .custom-checkbox input+label span { position: absolute; /* a small box to display as checkbox */ left: 0; top: 0; height: 15px; width: 15px; border-radius: 2px; border: 1px solid black; background-color: white; } .custom-checkbox input:checked+label { /* change label color when checked */ color: orange; } .custom-checkbox input:checked+label span{ /* change span box color when checked */ background-color: orange; border: 1px solid orange; } </style> |
似乎您只需使用CSS就可以更改复选框的灰度颜色。
下面将复选框从黑色转换为灰色(这正是我想要的):
1 2 3 | input[type="checkbox"] { opacity: .5; } |
不,您仍然不能设置复选框本身的样式,但我(最终)找到了如何设置幻象样式,同时保留单击复选框的功能。这意味着,即使光标不完全静止,您也可以切换它,而不会冒选择文本或触发拖放的风险!
此解决方案可能也适用于单选按钮。
以下是IE9、FF30.0和Chrome40.0.2214.91的基本示例。您仍然可以将它与背景图像和伪元素结合使用。
http://jsfiddle.net/o0xo13yl/1/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | label { display: inline-block; position: relative; /* needed for checkbox absolute positioning */ background-color: #eee; padding: .5rem; border: 1px solid #000; border-radius: .375rem; font-family:"Courier New"; font-size: 1rem; line-height: 1rem; } label > input[type="checkbox"] { display: block; position: absolute; /* remove it from the flow */ width: 100%; height: 100%; margin: -.5rem; /* negative the padding of label to cover the"button" */ cursor: pointer; opacity: 0; /* make it transparent */ z-index: 666; /* place it on top of everything else */ } label > input[type="checkbox"] + span { display: inline-block; width: 1rem; height: 1rem; border: 1px solid #000; margin-right: .5rem; } label > input[type="checkbox"]:checked + span { background-color: #666; } <label> <input type="checkbox" /> <span> </span>Label text </label> |
对于纯CSS,没有什么特别之处:before和:after,没有转换,您可以关闭默认外观,然后像下面的示例一样使用内联背景图像对其进行样式设置。它可以在Chrome、Firefox、Safari和Now Edge(Chromium Edge)中使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | INPUT[type=checkbox]:focus { outline:1px solid rgba(0,0,0,0.2); } INPUT[type=checkbox] { background-color: #DDD; border-radius: 2px; appearance:none; -webkit-appearance:none; -moz-appearance:none; width: 17px; height: 17px; cursor:pointer; position: relative; top: 5px; } INPUT[type=checkbox]:checked { background-color:#409fd6; background:#409fd6 url("data:image/gif;base64,R0lGODlhCwAKAIABAP////3cnSH5BAEKAAEALAAAAAALAAoAAAIUjH+AC73WHIsw0UCjglraO20PNhYAOw==") 3px 3px no-repeat; } |
1 2 3 | <form> <label><input type="checkbox"> I Agree To Terms & Conditions</label> </form> |
你可以用ICheck它是为jquery&zepto定制的复选框和单选按钮,也许它可以帮助您
确保在icheck.js之前加载jquery v1.7+。
- 黑色-最小.css
- 红-铯
- 绿色-绿色.css
- 蓝色-蓝色.css
- 航空-航空.css
- 灰色-灰色.css
- 橙色-橙色.css
- 黄色-黄色.css
- 粉红色-粉红色.css
- 紫色-紫色.css
在HTML中插入before(替换路径和配色方案):
红色配色方案示例:
1 2 | <link href="your-path/minimal/red.css" rel="stylesheet"> <script src="your-path/icheck.js"> |
在HTML中添加一些复选框和单选按钮:
将javascript添加到HTML以启动ICheck插件:
1 2 3 4 5 6 7 | $(document).ready(function(){ $('input').iCheck({ checkboxClass: 'icheckbox_minimal', radioClass: 'iradio_minimal', increaseArea: '20%' // optional }); }); |
对于不同于黑色的配色方案,请使用此代码(例如红色):
1 2 3 4 5 6 7 | $(document).ready(function(){ $('input').iCheck({ checkboxClass: 'icheckbox_minimal-red', radioClass: 'iradio_minimal-red', increaseArea: '20%' // optional }); }); |
多恩
快速修复在文本前面添加图标:
1 | < asp:CheckBox... Text="<img src='/link/to/img.png' />My Text" /> |