目录
名称的重要性:下拉列表、菜单、导航
自定义 的需求
构建“混合”选择器
可用性测试
关于类似菜单的选择器
结语
首页 web前端 css教程 在本机和自定义选择元素之间达到平衡

在本机和自定义选择元素之间达到平衡

Apr 05, 2025 am 09:32 AM

Striking a Balance Between Native and Custom Select Elements

本文探讨如何构建既美观又易访问的样式化下拉选择元素。我们将巧妙地结合原生 <select></select> 元素和自定义样式,实现最佳用户体验。

名称的重要性:下拉列表、菜单、导航

在研究过程中,我们发现“下拉列表”、“菜单”、“导航”等术语经常混用,导致歧义。本文将明确定义“下拉列表”:

下拉列表: 一种交互式组件,包含一个按钮,用于显示和隐藏项目列表,通常通过鼠标悬停、点击或轻触触发。列表默认隐藏,交互后显示。列表通常以块状内容(即选项)的形式覆盖其他内容。

许多界面元素看起来像下拉列表,但简单地将其称为“下拉列表”如同用“鱼”来描述动物一样笼统。我们需要区分菜单、导航和选择元素这三种不同类型的下拉列表:

  • 菜单: 页面内容中用户可执行的命令或操作列表。
  • 导航: 用于网站导航的链接列表。
  • 选择: 表单控件(<select></select>),用于在表单中显示供用户选择的选项列表。

不同用户对界面的感知和交互方式不同,因此对UI元素的命名和设计模式的定义存在主观性。

<menu></menu> 元素已弃用,不推荐使用。关于包含式菜单和菜单按钮的详细说明,以及为什么不应将 ARIA 菜单角色用于站点导航,请参考相关资源。

我们将专注于作为 <select></select> 元素的下拉列表类型。

<select></select> 元素的样式化挑战

根据 MDN 的说法,样式化表单控件存在“好、坏、丑”三种情况。<select></select> 元素无疑属于“丑”的范畴,其样式化支持不足,导致开发者常常寻求替代方案。

理想情况下,如果可以避免使用 <select></select>,就应该避免。然而,在某些情况下,<select></select> 仍然是最佳选择,例如选项数量众多、布局空间有限或时间/预算不足等。

自定义 <select></select> 的需求

创建自定义 <select></select> 时,通常需要满足以下需求:

  • 按钮显示当前选定的选项。
  • 点击按钮切换选项列表的可见性。
  • 点击选项列表中的选项会更新所选值,按钮文本随之更改,选项列表关闭。
  • 点击组件外部会关闭选项列表。
  • 触发器包含一个指向下方的三角形图标,指示存在选项。

然而,这仅仅满足了部分需求。原生 <select></select> 元素还提供以下功能:

  • 无论用户的视觉能力如何,选定的选项都清晰可见。
  • 组件能够以可预测的方式与键盘交互(例如,使用箭头键导航,Enter 键选择,Esc 键取消等)。
  • 辅助技术(例如屏幕阅读器)能够清晰地向用户宣布元素,包括其角色、名称和状态。
  • 选项列表位置调整(即不会被屏幕裁剪)。
  • 元素遵守用户的操作系统偏好设置(例如高对比度、配色方案、动画等)。

许多自定义 <select></select> 组件都无法完全满足这些需求。

构建“混合”选择器

构建简单的自定义 <select></select> 会牺牲功能性以换取美观性。更好的方法是默认提供原生 <select></select>,并在可能的情况下将其替换为更美观的自定义版本。这就是“混合”选择器的理念。它包含两个选择器:

  • 原生 <select></select>,默认可见且可访问。
  • 自定义 <select></select>,默认隐藏,仅在使用鼠标时显示。

以下是 HTML 结构示例:

<label for="selectNative">Main job role</label>
<div>
  <select id="selectNative" class="selectNative">
    <option value="1">Option 1</option>
    <option value="2">Option 2</option>
  </select>
  <div class="selectCustom">
    <!-- Custom select content -->
  </div>
</div>
登录后复制

CSS 代码用于控制两个选择器的显示和位置:

.selectNative,
.selectCustom {
  position: relative;
  width: 22rem;
  height: 4rem;
}

.selectCustom {
  position: absolute;
  top: 0;
  left: 0;
  display: none;
}

@media (hover: hover) {
  .selectCustom {
    display: block;
  }
  .selectNative:focus   .selectCustom {
    display: none;
  }
}
登录后复制

JavaScript 代码用于处理点击事件、同步两个选择器的值以及键盘导航。

可用性测试

我们进行了一次小型可用性测试,测试对象包括残疾人士,使用不同的设备和辅助技术进行测试。测试结果表明该方法有效,但仍需进行更广泛的测试。

该方法的优点在于:

  • 移动设备和平板电脑用户获得原生 <select></select>,提供更好的用户体验和性能。
  • 键盘用户能够以预期的方式与原生 <select></select> 交互。
  • 辅助技术能够像正常一样与原生 <select></select> 交互。
  • 鼠标用户能够与增强的自定义 <select></select> 交互。

该方法为所有用户提供必要的原生功能,无需额外的工作量来实现所有原生特性。

然而,这种方法并非万能的,它适用于简单的选择器,对于复杂的交互可能无效。

关于类似菜单的选择器

如果选择器始终具有选定选项(例如排序内容),则可以使用原生 <select></select> 或自定义菜单。需要注意 WCAG 3.2.2 输入准则:

除非在用户使用组件之前已告知其行为,否则更改任何用户界面组件的设置不应自动导致上下文更改。

为了满足此准则,需要在用户交互之前警告用户操作,或在选择器后添加说明。

结语

构建真正易访问的选择器组件比看起来更难。 “混合”选择器是尝试在保持美观的同时获得尽可能多的原生功能的一种方法。如果资源允许,请确保在发布组件之前进行充分的测试。

记住在创建“下拉列表”组件时使用正确的名称。 ?

以上是在本机和自定义选择元素之间达到平衡的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

使用GraphQL缓存 使用GraphQL缓存 Mar 19, 2025 am 09:36 AM

如果您最近开始使用GraphQL或审查了其优点和缺点,那么您毫无疑问听到了诸如“ GraphQl不支持缓存”或

使用Redwood.js和Fauna构建以太坊应用 使用Redwood.js和Fauna构建以太坊应用 Mar 28, 2025 am 09:18 AM

随着最近比特币价格超过20k美元的攀升,最近打破了3万美元,我认为值得深入研究创建以太坊

用高架创建自己的野蛮人 用高架创建自己的野蛮人 Mar 18, 2025 am 11:23 AM

无论您是开发人员的哪个阶段,我们完成的任务(无论大小)都会对我们的个人和专业成长产生巨大影响。

VUE 3 VUE 3 Apr 02, 2025 pm 06:32 PM

它的出局!恭喜Vue团队完成了完成,我知道这是一项巨大的努力,而且很长时间。所有新文档也是如此。

您可以从浏览器获得有效的CSS属性值吗? 您可以从浏览器获得有效的CSS属性值吗? Apr 02, 2025 pm 06:17 PM

我有人写了这个非常合法的问题。 Lea只是在博客上介绍了如何从浏览器中获得有效的CSS属性。那样的是这样。

在CI/CD上有点 在CI/CD上有点 Apr 02, 2025 pm 06:21 PM

我说的“网站”比“移动应用程序”更合适,但我喜欢Max Lynch的框架:

带有粘性定位的堆叠卡和一点点的杂物 带有粘性定位的堆叠卡和一点点的杂物 Apr 03, 2025 am 10:30 AM

前几天,我发现了科里·金尼文(Corey Ginnivan)网站上的这一点,当您滚动时,彼此之间的卡片堆放集。

比较浏览器的响应式设计 比较浏览器的响应式设计 Apr 02, 2025 pm 06:25 PM

这些桌面应用程序中有许多目标是同时在不同的维度上显示您的网站。因此,例如,您可以写作

See all articles