html自定义checkbox、radio、select —— checkbox、radio篇

时间:2022-09-10 13:00:10

前些日子,所在公司项目的UI做了大改,前端全部改用 Bootstrap 框架,Bootstrap的优缺点在此就不详述了,网上一大堆相关资料。

前端的设计就交给我和另一个同事[LV,大学同班同学,毕业后在同一家公司同一个部门同一个项目组共事,现在他离职跑去创业了,小小怀念一下他],由于我们都是不喜欢 html 自带的 checkbox、radio、select 的样式,所以就决定自己来写一套基于 Bootstrap 的样式。

对于 checkbox/radio,首先我们想到的就是用图片来替换掉现有的点击框,我会一点PS,所以图片就交给我了:

html自定义checkbox、radio、select —— checkbox、radio篇 从左到右分别是:unchecked: { normal, hover, active/focus}; checked: { normal, hover, active/focus}; disabled: { unchecked, checked }

针对这些 Icon,写好对应的样式。由于 Bootstrap 自带的 Icon 宽、高都为 14px,我们也用同样的大小,并且参照 Bootstrap Icon 命名:icon-sfa[项目名缩写]-checkbox / icon-sfa-radio

写代码的中途,我曾想过直接用样式来控制UI,不使用图片,如 Google 的登录。但后来放弃了,原因是坑爹的 IE8-,完全不支持。

html自定义checkbox、radio、select —— checkbox、radio篇

替换现有的样式并不难,无非就是将原有的点击框隐藏起来,用图片来代替现有的位置。

难的是事件的响应!

我们是在原有系统UI的基础上,进行UI的替换的。所以原有页面会有许多的JS代码,而我们最不想碰的就是这些JS代码。所以对于事件的响应,我们可真是绞尽脑汁了,特别是对 select 改写(在下一篇将会详述)。

替换样式:

<label>
    <i>
    <input type="checkbox">
    text
</label>

大致结构就是这样,其中<i>用来显示自定义 Icon,其他照旧。

为<label>添加 hover、mousedown、mouseup 事件,分别用来处理对应的UI显示;

为<input>添加隐藏样式:{ opacity: 0, position: 'relative', left: -99999 },使用 "opacity" 不使用 "display" 的原因,依旧是坑爹的 IE。由于我们需要为<input>添加 change 事件来改变UI显示,但是如果使用 "display",在 IE8- 下是无法促发 change 事件的。

我们甚至想过直接为<label>添加 click 事件,但是均会有冲突。为了兼容各个浏览器内核,尝试了许多方法后,最终选择使用 "opacity",目前经过测试,IE、chrome、ff 下是可以正确使用的。

至于使用 "position" 和 "left",是因为在 IE 下,会有这么一个恶心的虚线框 html自定义checkbox、radio、select —— checkbox、radio篇,只能选择把它远远的移走。"position" 的值为 "relative" 而不是 "absolute",是因为原先<input>的位置,包括大小要预留着给<i>。

(今天在写 demo 时发现,是由于 "bootstrap.extension.css" 里对 <i> margin-left 进行了设置,导致值为 "absolute" 时出现位置偏差,在此改过。应为 "absolute",且删除 "bootstrap.extension.css" 中的设置,demo 已更新)

接下来是为<input>添加 change 事件,根据当前<input> checked 的值,改变显示的UI。这里需要注意的是,radio 是以 name 的值来进行分组的,即几个 name 的值相同的 radio <input>将会组成一组,而每一组最多只能有一个 radio 选中。

最后,为<input>定义一个用于 form reset 的方法,用于当重置表单时,重新初始化显示的UI。

贴上主体JS:

// Transform Checkbox / Radio
$.fn.transformInput = function () {
return this.each(function () {
var $input = $(this);
if ($input.data('transformed')) { return; } var _defaultChecked = false;
var $label = _getLabel($input);
var $icon = $('<i>', { 'class': $input.is('input:checkbox') ? 'icon-sfa-checkbox' : 'icon-sfa-radio' })
.insertBefore($input);
$input.attr('checked') && $icon.addClass('checked') && (_defaultChecked = true);
$input.attr('disabled') && $icon.addClass('disabled'); $label
.hover(function () { $icon.addClass('hover'); return $label; }, function () { $icon.removeClass('hover').removeClass('active'); return $label; })
.mousedown(function (event) { if (event.which == 1) { $icon.addClass('active'); } return $label; })
.mouseup(function (event) { $icon.removeClass('active'); return $label; });
$input
.data({ transformed: true })
.css({ opacity: 0, position: 'relative', left: -99999 })
.change(function () {
if (!$input.attr('disabled')) {
if ($input.is('input:radio')) {
var _name = $input.attr('name');
if (_name != undefined && _name != '') {
$('input[name="' + _name + '"]', this.form).not($input).attr({ checked: false }).transformResetStatus();
}
$input.attr({ checked: true });
}
$input.transformResetStatus();
} return $input;
})
.on({
transformReset: function () {
$input.attr({ checked: _defaultChecked }).transformResetStatus();
}
});
});
};

里面有一些方法这里就不贴出来了,将在下一篇《html自定义checkbox、radio、select —— select篇》一起将代码上传。

看看在流浏览器中的效果:

html自定义checkbox、radio、select —— checkbox、radio篇


下一篇《html自定义checkbox、radio、select —— select篇》在周5下班前贴出,将附上 checkbox、radio、select 的demo

html自定义checkbox、radio、select —— checkbox、radio篇的更多相关文章

  1. checkbox、select、radio的设置与获取

    参考链接:http://www.cnblogs.com/xiaopin/archive/2011/09/13/2175190.html js版本: <!DOCTYPE html PUBLIC & ...

  2. checkbox,select,radio 选取值&comma;设定值&comma;回显值

    获取一组radio被选中项的值var item = $('input[@name=items][@checked]').val();获取select被选中项的文本var item = $(" ...

  3. 修改radio、checkbox、select默认样式的方法

    样式 radio select checkbox 兼容性 现在前端页面效果日益丰富,默认的input组件样式显然已经不能满足需求.趁着这次开发的页面中有这方面的需求,在这里整理一下修改radio.ch ...

  4. 前端开发:css技巧,如何设置select、radio 、 checkbox 、file这些不可直接设置的样式 。

    前言: 都说程序员有三宝:人傻,钱多,死得早.博主身边的程序“猿”一大半应了这三宝,这从侧面说明了一个问题,只有理性是过不好日子的.朋友们应该把工作与生活分开,让生活变得感性,让工作变得理性,两者相提 ...

  5. struts2学习笔记之表单标签的详解&colon;s&colon;checkbox&sol;radio&sol;select&sol;optiontransferselect&sol;doubleselect&sol;combobox

    struts2中的表单标签都是以s标签的方式定义的,同时,struts2为所有标签都提供了一个模板,C:\Users\180172\Desktop\struts2-core-2.2.1.1.jar\t ...

  6. JS中Float类型加减乘除 修复 JQ 操作 radio、checkbox 、select LINQ to SQL&colon;Where、Select&sol;Distinct LINQ to SQL Count&sol;Sum&sol;Min&sol;Max&sol;Avg Join

    JS中Float类型加减乘除 修复   MXS&Vincene  ─╄OvЁ  &0000027─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄Ov ...

  7. 自定义radio、checkbox的样式

    input标签中的radio和checkbox是很表单中常用的类型,大多时候,默认样式并不能满足我们的需求,所以有了此篇. 自定义样式,由此开启: html: <div class=" ...

  8. 《jQuery判断radio、checkbox、select 是否选中和设置选中问题以及获取选中值》总结

    <form> <input type="radio" name="gender" id="man" value=&quot ...

  9. Jquery常用radio取值&comma;checkbox取值&comma;select取值&comma;radio选中&comma;checkbox选中&comma;select选中&comma;及其相关设置

    获取一组radio被选中项的值:var item = $('input[name=items][checked]').val(); 获取select被选中项的文本:var item = $(&quot ...

  10. JQ 操作 radio、checkbox 、select

    MXS&Vincene  ─╄OvЁ  &0000026─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄OvЁ:今天很残酷,明天更残酷,后天很美好, ...

随机推荐

  1. C&sol;S架构和B&sol;S架构的概念和区别

    C/S 架构 C/S 架构是一种典型的两层架构,其全程是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端 ...

  2. &lbrack;转&rsqb; eclipse SVN中文件修改后图标不变黑星解决

    原文地址:http://blog.csdn.net/luwei42768/article/details/39225641 版权声明:本文为博主原创文章,未经博主允许不得转载. 如上图, 如果文件修改 ...

  3. NHibernate可视化设计插件——Mindscape&period;NHibernateModelDesigner

    我一直希望NHibernate能够支持像EF一样支持可视化操作,今天去网上搜了一下,发现有一个插件,类似EF的可视化功能. 下载地址:Mindscape.NHibernateModelDesigner ...

  4. 编写高效且优雅的 Python 代码

    http://python.jobbole.com/86808/ http://python.jobbole.com/86869/?utm_source=blog.jobbole.com&ut ...

  5. &lbrack;Java&rsqb; 继承中,父类被覆盖的成员变量、方法的可访问性

    在 Java 的继承机制里,在子类内部,可以访问父类被覆盖的变量和方法:在子类外部,可以访问父类的被覆盖变量,但是不能访问父类的被覆盖方法. 父类中被覆盖的方法不能在外部被方法,这是出于封装的考虑. ...

  6. 地精排序&lpar;Gnome Sort&rpar; 算法

    gnome应该是最简单排序的排序算法吧!Gnome Sort,这是该算法的作者命名的,O(n*n)时间复杂度,O(1)空间复杂度,属于稳定的排序算法.算法的思想是每趟循环找到第一个逆序的元素,把它和在 ...

  7. C&num; TSC打印二维码和条形码

    效果图 开发.使用环境说明 安装TSC_7.3.8_M-3.exe打印机驱动,安装时选择对应的ttp 244 pro 将TSCLIB.dll复制到C:\Windows\system 驱动安装说明 选择 ...

  8. SpringBoot 配置静态资源映射

    SpringBoot 配置静态资源映射 (嵌入式servlet容器)先决知识 request.getSession().getServletContext().getRealPath("/& ...

  9. 【CF131D】Subway

    题目大意:给定一棵 N 个节点的基环树,求各个点到环的最小距离. 题解:除了找环的必须参数之外,对每个点维护一个 fa 即可. 代码如下 #include <bits/stdc++.h> ...

  10. POJ 2337 Catenyms (有向图欧拉路径,求字典序最小的解)

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8756   Accepted: 2306 Descript ...