这篇文章是有关CSS功能的系列文章中的第二篇。

文章系列:

  1. 为SVG背景着色
  2. 下拉菜单(本文)
  3. 基于给定元素数的逻辑样式

CSS正变得越来越强大,并且具有CSS网格和自定义属性(也称为CSS变量)之类的功能,我们看到了一些真正具有创造力的解决方案。 这些解决方案中的一些解决方案不仅着重于使网页更漂亮,而且使网页更易于访问,以及使样式可访问的体验更好。 我绝对是来这里的!

我们在网络上看到的常见UI模式是下拉菜单。 它们用于分段显示相关信息,而不会因按钮,文本和选项而使用户不知所措。 我们经常在网站的标题或导航区域内看到这些内容。

Google搜索“下拉菜单”产生了许多示例

让我们看看是否可以仅使用CSS来制作这些菜单之一。 我们将在导航组件内创建链接列表,如下所示:

<nav role="navigation"><ul><li><a href="#">One</a></li><li><a href="#">Two</a></li><li><a href="#">Three</a></li></ul>
</nav>

现在,假设我们要第二个导航项上的子菜单下拉菜单。 我们可以在那里做同样的事情,并在该列表项中包含一个链接列表:

<nav role="navigation"><ul><li><a href="#">One</a></li><li><a href="#">Two</a><ul class="dropdown"><li><a href="#">Sub-1</a></li><li><a href="#">Sub-2</a></li><li><a href="#">Sub-3</a></li></ul></li><li><a href="#">Three</a></li></ul>
</nav>

现在,我们有了两层导航系统。 为了在我们希望可见时隐藏和显示内容,我们需要应用一些CSS。 为了使交互更清晰,已从以下示例中删除了所有样式属性:

li {display: block;transition-duration: 0.5s;
}li:hover {cursor: pointer;
}ul li ul {visibility: hidden;opacity: 0;position: absolute;transition: all 0.5s ease;margin-top: 1rem;left: 0;display: none;
}ul li:hover > ul,
ul li ul:hover {visibility: visible;opacity: 1;display: block;
}ul li ul li {clear: both;width: 100%;
}

见笔简单CSS下拉菜单与哈弗由乌纳克拉维茨( @una )上CodePen 。

现在,子菜单下拉菜单已隐藏,但是当我们将其悬停在导航栏中的相关父菜单上时,该子菜单下拉菜单将显示并可见。 通过样式ul li ul ,我们可以访问该子菜单,通过样式ul li ul li ,我们可以访问其中的单个列表项。

问题

这开始看起来像我们想要的,但是到现在为止我们还远远没有完成。 Web的可访问性是产品开发的核心部分,现在将是实现这一目标的绝好机会。 添加role="navigation"是一个不错的开始,但是为了使导航栏可访问,应该能够在其中导航(并以合理的顺序关注适当的项目),并且还应具有正确的屏幕阅读器大声读出正在关注的内容。

您可以将鼠标悬停在任何列表项上,并清楚地看到正在悬停的内容,但是对于选项卡导航而言并非如此。 继续尝试尝试浏览上面的示例。 您失去联络,其中的重点是视觉正如你选项卡, 两人在主菜单中,你会看到一个焦点指示环,但是当你标签到下一个项目(其子菜单项中的一个),该对焦消失。


现在,需要注意的是,从理论上讲您将专注于另一项内容,并且屏幕阅读器可以解析Sub-One来解析该内容,但是键盘用户将无法看到正在发生的事情,并且会迷路。

发生这种情况的原因是,当我们对父元素的悬停进行样式化时,一旦将焦点从父项转移到该父项中的列表项之一,我们就会失去样式。 从CSS的角度来看这很有意义,但这不是我们想要的。

幸运的是,这里有一个新CSS伪类,它可以为我们提供我们在这种情况下想要的东西,它叫做:focus-within

解决方案:`:focus-within`

:focus-within伪选择器是CSS选择器4级规范的一部分,它告诉浏览器在其任何子级处于焦点时将样式应用于父级。 因此,在本例中,这意味着我们可以跳到Sub-One并应用:focus-within样式和父项的:hover样式,并确切地看到我们在导航下拉列表中的位置。 在我们的例子中是ul li:focus-within > ul

ul li:hover > ul,
ul li:focus-within > ul,
ul li ul:hover {visibility: visible;opacity: 1;display: block;
}

见笔与悬停和简单CSS下拉菜单:焦点中的尤娜克拉维茨( @una )上CodePen 。

甜! 有用!

现在,当我们选择第二个项目时,会弹出子菜单,当我们浏览子菜单时,可见性仍然存在! 现在,我们可以在代码中附加:focus状态和:hover从而为键盘用户提供与鼠标用户相同的体验。


在大多数情况下,例如在直接链接上,我们通常可以这样写:

a:hover,
a:focus {...
}

但是在这种情况下,由于我们基于父级li来应用悬停样式,因此我们可以再次使用:focus-within切换时获得相同的外观。 这是因为我们实际上不能专注li (除非我们添加tabindex="0" )。 我们实际上是在关注其中的链接( a )。 :focus-within允许我们在关注链接时仍将样式应用于父级li (太酷了!):

li:hover,
li:focus-within {...
}

此时,由于我们要应用焦点样式,因此我们可以做一些通常不推荐的操作 (删除该蓝色轮廓焦点环的样式)。 我们可以通过以下方式做到这一点:

li:focus-within a {outline: none;
}

上面的代码指定当我们通过链接( a )专注于列表项时,请勿对链接项( a )应用轮廓。 用这种方式编写代码是非常安全的,因为我们专门设计了悬停状态,并且使用不支持:focus-within浏览器,该链接仍会获得聚焦环。 现在,我们的菜单如下所示:

使用:focus-within:hover状态和自定义聚焦环消失的最终菜单

见笔简单CSS下拉菜单与悬停和:聚焦内聚焦状态由乌纳克拉维茨( @una )上CodePen 。

那ARIA呢?

如果您熟悉辅助功能,则可能听说过ARIA标签和状态。 您可以利用它们来发挥自己的优势,同时创建具有内置可访问性的这些类型的下拉菜单! 您可以在这里找到Heydon Pickering的优秀示例。 当包含ARIA标记时,您的代码将看起来像这样:

<nav role="navigation"><ul><li><a href="#">One</a></li><li><a href="#" aria-haspopup="true">Two</a><ul class="dropdown" aria-label="submenu"><li><a href="#">Sub-1</a></li><li><a href="#">Sub-2</a></li><li><a href="#">Sub-3</a></li></ul></li><li><a href="#">Three</a></li></ul>
</nav>

您要将aria-haspopup="true"到下拉菜单的父级以指示其他状态,并在实际的下拉菜单本身中包含aria-label="submenu" (在这种情况下,我们的class="dropdown"

这些属性本身将为您提供显示下拉菜单所需的功能,但缺点是它们仅在启用JavaScript的情况下起作用。

浏览器支持警告

说到警告,让我们谈谈对浏览器的支持。 尽管:focus-within确实具有很好的浏览器支持,但需要注意的是,不支持Internet Explorer和Edge,因此在这些平台上的用户将无法看到导航。

该浏览器支持数据来自Caniuse ,其更多信息。 数字表示浏览器支持该版本及更高版本的功能。

桌面

火狐浏览器 IE浏览器 边缘 苹果浏览器
60 52 没有 79 10.1

手机/平板电脑

Android Chrome浏览器 Android Firefox 安卓系统 iOS Safari
81 68 81 10.3

这里的最终解决方案是同时使用ARIA标记和CSS :focus-within ,以确保您的用户了坚实的下拉经验。

见笔与悬停和简单CSS下拉菜单:焦点内和焦点状态和ARIA的乌纳克拉维茨( @una )上CodePen 。

如果您希望将来能够使用此功能,请在Edge User Voice上对其进行投票 ! 并在您使用时提高:focus-ring ,以便我们能够为该对焦环设置样式并为所有人创建美好的交互式网络体验

更多关于`:focus-within`和A11Y

  • Scott O'Hara 撰写了有关:focus-within ,突出显示了演示,例如突出显示的<table>行和下拉菜单
  • 库沙格拉·古尔(Kushagra Gour) 着重介绍被困模式
  • 埃里克·贝利( Eric Bailey) 着重介绍了焦点样式
  • 克里斯(Chris)在孩子专注时保持父元素可见
  • 所有关于CSS-Tricks的文章都与:focus-within

翻译自: https://css-tricks.com/solved-with-css-dropdown-menus/

用CSS解决! 下拉菜单相关推荐

  1. Bootstrap—解决下拉菜单不弹出问题

    最近学到Bootstrap下拉菜单,学懂了教程内容之后自己敲一个点击按钮底下弹出下拉菜单的小demo,写完代码发现运行之后点击按钮没反应,下拉菜单弹不出来,对照教程感觉代码没错. 我的代码如下: &l ...

  2. 纯CSS实现下拉菜单及下拉容器等(纯CSS实现导航条及导航下拉容器)

    原文:纯CSS实现下拉菜单及下拉容器等(纯CSS实现导航条及导航下拉容器) 虽然网上类似甚至相同的案例有很多,但是我还是写下,以记下笔记,也可供大家参考 希望大家可以指导批评~~ 首先我们以列表ul ...

  3. 兼容IE各版本的纯CSS二级下拉菜单

    这是一个标准的CSS下拉菜单制作教程,有针对目前流行的IE6/IE7/IE8不同版本的CSS代码,因此可以在IE之间完全兼容,不过其它的浏览器像火狐/GG浏览器之类的没有测试,如果兼容IE8的话,那么 ...

  4. html下拉菜单触摸显示,CSS导航:纯CSS触碰式下拉菜单

    [破洛洛教学网] 纯CSS触碰式下拉菜单 /* 整体设置*/ .navigation { margin:0; padding:0; width:610px; list-style-type:none; ...

  5. css表格中下拉菜单怎么设置,css如何实现下拉菜单?css实现下拉菜单的方法(完整代码)...

    本篇文章给大家带来的内容是关于css如何实现下拉菜单?css实现下拉菜单的方法(完整代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. /*盒子,相对定位*/ .dropdown{ ...

  6. 使用CSS制作下拉菜单样式

    CSS制作下拉菜单 制作tooltip显示形式 代码示例 实现原理 HTML 部分 CSS 部分 制作可点击的下拉菜单 实现原理 代码示例 Appdex 制作tooltip显示形式 代码示例 < ...

  7. html用css做下拉菜单,纯css实现下拉菜单

    纯css实现下拉菜单 1.效果如下: 2.html代码 时间最近 时间最近 评论最多 被赞最多 3.css代码 * { margin: 0; padding: 0; } ul { list-style ...

  8. Remora:仅CSS的下拉菜单

    Horizontal "drop down" menus for site navigation are familiar to almost every web user, so ...

  9. CSS+JavaScript下拉菜单布局与代码执行

    导读:今天来通过一个安居客web下拉菜单来总结一下怎么用css布局以及通过js切换css效果 头部的布局以及下拉菜单布局 实现代码: <html> <body><div ...

  10. 纯HTML、CSS实现下拉菜单

    在完成百度前端学院的初级任务阶段时,是不允许使用 javascript 来制作页面动态效果,但是对于下拉菜单效果的实现可以仅仅通过纯HTML和CSS来完成. (效果图) 实现的思路为,利用单选框(ra ...

最新文章

  1. 记录一次docker导致宿主机重启故障解决方法
  2. UNIX进程的创建,进程链和进程扇
  3. 使用Mybatis Generator自动生成代码
  4. CDN加速服务有什么功能和作用?
  5. 「推荐系统」 领域的最新进展你知道么?
  6. linux got分析,聊聊Linux动态链接中的PLT和GOT(3)——公共GOT表项
  7. 开篇:讲讲peopleeditor遇到的问题
  8. c语言头文件和源文件_C语言头文件防卫式声明
  9. 评价微型计算机总线的性能指标,计算机组成原理学习笔记(3):总线
  10. Apache Kafka – KIP 32,33 Time Index
  11. html5复习分类,HTML5考试复习资料.doc
  12. 【论文写作】网上办公自动系统中功能需求如何写
  13. 关联分析(二)--FP-Growth算法
  14. 怎么是phpadmin连接mysql_phpmyadmin连接远程mysql
  15. 三次样条曲线拟合算法c语言,关于三次样条曲线拟合法
  16. unity 编辑器模式下修改屏幕分辨率
  17. Python模拟随机游走
  18. 仓库拣货标签——流程卡
  19. Kafka Rest : Confluent
  20. 快速读懂Http3协议总结

热门文章

  1. docker拉取RabbitMq镜像并安装
  2. 机器学习算法原理 (一)机器学习算法汇总
  3. 邯郸翱翔学校春季班火热开启
  4. WiFi,哪里才是你的家?
  5. 【Source教程】游戏SDK工具的下载安装与使用方法
  6. 超级计算机预测南方下雪,超算算出京津冀要下雪?确实有征兆但并不完全确定...
  7. 边缘与云计算如何结合以创建工业自动化平台
  8. matlab 正态分布期望,MATLAB实现正态分布ML(极大似然)估计
  9. JAVA Spring Boot与海康威视摄像头的故事
  10. 怎样查看电脑CPU?