小成本实现部分选中的复选框

大家都知道,HTML 里复选框(checkbox)表示选中状态的 checked 属性,只有选中和没被选中两种情况。但有时候,我们还要表示「部分选中」状态:如实现树或表格勾选时,当用户选择一部分子记录,父记录的状态就应该是部分选择。

通常的做法

有很多方案可以实现这个需求,这里列举两个有代表性的简单介绍下:

1)利用 checkbox 自身其他属性来模拟。如下图,用 disabled 的选中状态来表示部分选中。

ucren tree
(来源:ucren2008 的树组件)

这种方案的好处是实现简单。坏处是占用了复选框的 disabled 状态,会导致某些需求无法实现,也不直观。更严重的是,大部分浏览器处理键盘 tab 按键时会跳过 disabled 元素,这会导致上图中表示部分选择的 checkbox 无法用键盘操作。

2)利用图片等其他元素来模拟。如下图,整个 checkbox 都是其他元素模拟出来的。

ztree
(来源:zTree

这种方案使用图片模拟 checkbox,不受系统控件限制,可以实现任何想要的效果,但系统控件往往有着大量交互细节和可用性考虑,要全部模拟会比较复杂。

indeterminate 属性

实际上,checkbox 有一个叫 indeterminate 的属性,把它设为 true,就可以让 checkbox 变为「部分选中」的样子。这个属性只是改变 checkbox 的外观,不对它的checked 属性产生影响。另外,indeterminate 属性只能通过 JavaScript 来设置。来看下实际效果:

需要注意的是,indeterminate 并不是最近才出现的,很久以前它还是 IE 的一个私有属性,IE5 就支持。后来的浏览器基本上都支持:

  • IE 5+;
  • Firefox 3.6+;
  • Chrome 全系列;
  • Opera 11+;
  • Safari Mac 和 iOS 版;

W3C 的 HTML5 文档包含了对 checkbox indeterminate 属性的定义;CSS3 文档中也有 :indeterminate 伪类选择器,用来选择「部分选中的 checkbox」,如下例:

HTML<style>:indeterminate + span { color: red; }</style>

<input type="checkbox" id="cbTest2"> <span>这是一段文字</span>

<script>
    document.getElementById('cbTest2').indeterminate = true;
</script>

注意事项

不同浏览器和操作系统在对 indeterminate 属性展现上有些差异,这是原生表单控件的共同特点。我觉得没什么问题,但可能有些产品经理或设计师无法接受。

另外一个比较大的问题是,IE 与其他浏览器在处理点击 indeterminate 为 true 的 checkbox 时的差异。通过点击或空格键操作部分选中的 checkbox 时,在 mouseup 或者 keyup 阶段,所有浏览器都会将 indeterminate 属性改为 false,但 IE 是到此为止,其他浏览器还会改变 checkbox 的 checked 状态。也就是说对于以下代码:

HTML<input id="chk1" type="checkbox" />
<script>
    document.getElementById('chk1').indeterminate = true;
</script>

各浏览器都会显示为部分选中的 checkbox。但点一下它,IE 下会是未选中状态,其他浏览器会变成选中状态。

这个特性可以通过创建临时元素来探测:

JSvar tmp = document.createElement("input");
tmp.type = "checkbox";
tmp.checked = false;
tmp.indeterminate = true;

var body = document.body;
body.appendChild(tmp);
tmp.click();
body.removeChild(tmp);

alert(tmp.checked); //IE 是 false,其他浏览器是 true

结论

有时候,合理利用浏览器原生控件来实现一些功能,既简单高效,又有良好的体验和可用性,何乐而不为呢?

phpmyadmin
(来源:phpmyadmin

本文链接:https://imququ.com/post/native-tri-state-checkbox.html参与评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件开发商及电信营运商共同研发改良。 Android操作系统的特点包括: 开放源代码:Android系统采用开放源代码模式,允许开发者自由访问、修改和定制操作系统,这促进了技术的创新和发展,使得Android系统具有高度的灵活性和可定制性。 多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板电脑、智能电视、汽车导航系统等。 此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也在不断提升。例如,最新的Android版本引入了更多的安全性和隐私保护功能,以及更流畅的用户界面和更强大的性能。此外,Android系统也在不断探索新的应用场景,如智能家居、虚拟现实、人工智能等领域。 总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值