您的位置:

提高网页可访问性的 CSS Selectors 选择器

在 Web 开发中,网页可访问性是一个非常重要的话题。它指的是未经过优化的网站在一些残障人士的浏览和操作上会遇到很多障碍。由于残障人士的需求非常多样化,如视觉障碍、听觉障碍、体力障碍等,因此如何提高网页的可访问性是一个永恒的话题。

CSS Selectors (CSS 选择器)是一组用于选择 HTML 元素的方法。通过使用正确选择器,我们可以有效地提高网页的可访问性。下面我们将从几个方面阐述如何使用 CSS Selectors 提高网页的可访问性。


一、使用 ID、Class 选择器

ID、Class 选择器是 CSS 中最常用的选择器,通过它们可以为 HTML 元素设置唯一的样式,从而增强可访问性。在网页开发中,我们经常使用 ID 和 Class 选择器为元素设置样式,比如给导航栏增加背景色、修改字体样式等。

/* ID 选择器 */
#nav {
    background-color: #333;
}

/* Class 选择器 */
.text-bold {
    font-weight: bold;
}

通过使用 ID 和 Class 选择器,我们可以将网页的样式变得更加清晰、直观,并且让残障人士更容易阅读和操作。


二、使用属性选择器

属性选择器允许我们基于元素的属性来选择 HTML 元素,从而为其设置样式。这在网页的可访问性方面也有一定的作用。其中一种常见的属性选择器是 [attribute~="value"] 选择器,它用于选取包含指定属性值的元素。

/* 选取带有 title 属性的元素 */
[title] {
    border-bottom: 1px solid #ccc;
}

/* 选取包含 title="example" 属性的元素 */
[title~="example"] {
    background-color: #f7f7f7;
}

通过使用属性选择器,我们可以为含有特定属性值的元素设置样式,如为链接散发特定的样式、细节标签等,从而让残障人士更容易区分和使用。


三、使用伪类选择器

CSS 中有很多伪类选择器,它们能够选择 HTML 元素的某个状态,以为其设置样式。比如 :hover、:active、:visited、:target 等。这些伪类选择器可以为网页可访问性提供一些帮助,比如当用户鼠标悬停在按钮上时,可以通过 :hover 伪类选择器为其设置特定样式。

/* 鼠标悬停样式 */
a:hover {
    color: #44a3f5;
    text-decoration: underline;
}

/* 激活样式,如表单中的提交按钮 */
button:active {
    background-color: #ff9a00;
}

/* 已经被访问过的链接,给链接增加特殊的样式 */
a:visited {
    color: #999;
}

通过伪类选择器,我们可以为 HTML 元素创建更多的交互力度和视觉差异,从而增强可访问性。


四、使用结构性伪类选择器

结构性伪类选择器能够匹配 HTML 文档中特定的元素,如 :first-child、:last-child、:nth-child(n) 等,可以给 HTML 元素提供更多的样式和交互。比如可以通过 :first-child 选取某个父元素的第一个子元素来设置其特殊样式。

/* 选取某个父元素下的第一个子元素设置字体大小 */
.parent :first-child {
    font-size: 24px;
}

/* 选取某个元素下的倒数第二个子元素设置特殊样式 */
.parent :nth-last-child(2) {
    background-color: #eee;
}

通过结构性伪类选择器,我们可以为 HTML 元素创建更多交互和视觉特效,从而增强可访问性。


总结

以上就是如何使用 CSS Selectors 提高网页可访问性的技巧。通过使用 ID、Class、属性选择器、伪类选择器、结构性伪类选择器,我们可以为 HTML 元素设置更多的样式和交互,从而提高可访问性。

提高网页可访问性的 CSS Selectors 选择器

2023-05-12
CSS :is选择器在元素选取中的优势

2023-05-12
when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${item.id} [in template "article/detail/index.ftl" at line 48, column 106] ---- Java stack trace (for programmers): ---- freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...] at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:134) at freemarker.core.EvalUtil.coerceModelToTextualCommon(EvalUtil.java:481) at freemarker.core.EvalUtil.coerceModelToStringOrMarkup(EvalUtil.java:401) at freemarker.core.EvalUtil.coerceModelToStringOrMarkup(EvalUtil.java:370) at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:104) at freemarker.core.DollarVariable.accept(DollarVariable.java:63) at freemarker.core.Environment.visit(Environment.java:371) at freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:321) at freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271) at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:244) at freemarker.core.Environment.visitIteratorBlock(Environment.java:645) at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:108) at freemarker.core.IteratorBlock.accept(IteratorBlock.java:94) at freemarker.core.Environment.visit(Environment.java:335) at freemarker.core.Environment.visit(Environment.java:341) at freemarker.core.Environment.visit(Environment.java:341) at freemarker.core.Environment.process(Environment.java:314) at freemarker.template.Template.process(Template.java:383) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:332) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:266) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:220) at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:181) at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:314) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1431) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1167) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1106) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at com.software.filter.HttpSpiderIdentifyFilter.doFilter(HttpSpiderIdentifyFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at java.base/java.lang.VirtualThread.run(VirtualThread.java:309)