干货-自定义个性化checkbox

前端工程师和设计师一直都是相爱相杀的两个人。

在拿到UI稿时设计师告诉我要做到99%还原。。。满脸黑线( ̄工 ̄lll)于是乎,就要实现设计师满意的checkbox。以下为实现步骤。

Requirement:
要实现如图所示的checkbox:

Paste_Image.png

Implementation

  1. 首先,需要让设计师给你一张如下图所示的png:


    checkbox.png

    这张图片从左到右依次为,checkbox默认状态、hover状态、选中状态、未选中的disabled状态、选中的disabled状态。

  2. 接下来就要使用强大的CSS了。
    首先给需要个性化的checkbox加上以下样式:
    input[type="checkbox"] {
    -webkit-appearance: none; //去掉checkbox原有的样式
    }
    然后利用设计师给的图添加checkbox各种状态所需要的样式:
    默认:
    input[type="checkbox"] {
    -webkit-appearance: none;
    background: url("checkbox.png");
    height: 16px; //每一个checkbox的高度
    vertical-align: middle;
    width: 16px; //每一个checkbox的宽度
    }
    选中:
    input[type="checkbox"]:checked {
    background-position: -36px 0; //图片相对于当前checkbox向左移16 + 2(间距) + 16px,即为选中样式。
    }
    未选中:
    input[type="checkbox"]:not(:checked) {
    background-position: 0 0;
    }
    未选中hover:
    input[type="checkbox"]:not(:checked):hover {
    background-position: -18px 0;
    }
    选中但disabled:
    input[type="checkbox"][disabled]:checked {
    background-position: -72px 0;
    }
    其他样式可以自己参考自己设定。
  3. 兼容性方面:
    目前只兼容 Webkit 系列浏览器; Firefox 实现了替代的 -moz-appearance属性,不过控件原有的背景颜色、边框样式无法修改;IE 系列暂时不支持该属性。
  4. 为了兼容更多的主流浏览器,需要寻求另外的解决方案。
    在所有主流浏览器里,点击关联某个复选框的 label 时,产生的效果和点击元素自身相同,会切换复选框控件的选中状态。
    既然能用 label 元素来控制复选框的状态,那就不必直接操作实际的复选框元素,而把操作和样式都转移到与之关联的 label 元素上:
    <input id="example" type="checkbox">
    <label for="example"></label>
    确保 label 元素的 for属性的值和复选框 input 的 id值一致,同时将 label 元素放置于 input 之后,这样 CSS 可以通过相邻兄弟选择器定位到这个 label 元素并为之应用样式:
    input[type="checkbox"] + label:before {
    background: #fff url(i/blue.png);
    content: " ";
    height: 22px;
    left: 0;
    position: absolute;
    width: 22px;
    }
    有了样式化的 label 元素来提供交互,原生的 checkbox 控件就显得有点多余了,虽然可以用 display: none把它隐藏掉,不过隐藏后的表单元素是不能获得焦点的,要怎么办呢?
    当然,没有什么问题用一个div解决不了的。所以我们做如下修改:

    <div class="checkbox">
    <input id="exampleCheckbox" type="checkbox">
    <label for="exampleCheckbox"></label>
    </div>
    /* css */
    .checkbox {
    min-height: 24px;
    padding-left: 24px;
    position: relative;
    }
    input[type="checkbox"] {
    box-sizing: border-box;
    left: 4px;
    margin: 0;
    padding: 0;
    position: absolute;
    top: 3px;
    }

用一个div将label和input包含在内,并设置div的position为relative,这样就可以调整label和checkbox相对于父div的位置,实现用 label 元素把checkbox遮住,这样既能支持键盘交互,同时当图片加载失败的时候,又能保证原生的控件可用。
这样就可以兼容主流浏览器啦。

有一个iCheck库,可以实现很好看的checkbox样式,详见使用说明-中文。但是要实现各家设计师的样式,还是要自力更生呀。(• ₃ •)

参考资料

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

推荐阅读更多精彩内容