【问题标题】:The :focus pseudo-class and when it is applied:focus 伪类及其应用时间
【发布时间】:2017-01-07 21:13:13
【问题描述】:

:focus 选择器用于对具有一般意义的焦点元素进行样式设置。但考虑到鼠标按下或触摸等情况,它究竟何时应用?作为 Web 开发人员,我如何控制它以保持一致?

例如在 Stack Overflow 上,如果我在其中一个链接上按下鼠标,但没有激活,通过在释放之前将鼠标移开,链接将获得键盘焦点(然后按 Tab 键,焦点转到下一个链接)。然而,即使它有焦点,它也没有得到:focus 样式。如果我点击链接,我会得到:focus 轮廓样式。

但是在我正在开发的一个网站上,鼠标按下立即给了我:focus 样式,所以肯定有一些微妙的细节。

在这个 sn-p 中,Chrome 中的 <a><button> 元素就像我之前的描述一样工作,而可点击的 <div> 似乎像后者一样工作。但是在我的一个网站上,后者在所有 3 种情况下都发生了,我什至不确定为什么它们在这个 sn-p 中不一样,因为我这里没有额外的样式或 JS。

$('button').on('click', function() {});
$('.fake-btn').on('click', function() {});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>
  <a href="www.example.com">A link</a>
</p>
<p>
  <button>A button</button>
</p>
<p>
  <div class="fake-btn" tabindex="0">A clickable element</div>
</p>

在 IE11 中,一切都像 GIF 中的默认 &lt;a&gt;&lt;button> 一样工作,包括在我的其他网站上。也许这是一个 Chrome 错误,或者当应用 :focus 样式时,我是否仍然遗漏了一些细微的规范?伪类 CSS 规则的顺序在这里是否以某种不明显的方式很重要?

【问题讨论】:

  • 您确定要区分:focus:active
  • :focus 不一定与鼠标有关。 :focus 即使您在键盘上单击 tab 也会触发,直到您在没有鼠标的情况下获得元素(buttona 等)。我的问题是你的问题到底是什么?实际结果是什么(用文字描述 UI - 例如,按钮应该有一个border)以及预期的结果是什么?
  • 是的,active 有不同的焦点样式(事实上,默认情况下&lt;div&gt; 似乎没有 active 样式,但是所有元素都有一个 :focus 规则)。描述的哪一部分不清楚,用鼠标点击有时会给出焦点样式,有时不是我描述的不同方式,但它总是给出键盘焦点?例如为什么在 sn-p 中 &lt;div&gt;&lt;a&gt; 不同?
  • @Paulie_D 即使使用默认浏览器样式,我也会得到某种程度的“奇怪”行为,例如在sn-p。 :active 在键盘激活或鼠标单击期间都按预期工作,但 :focus 有时仅显示,即使元素肯定具有键盘焦点
  • 我在sn-p中找到了一些可以快速记录案例的东西,希望更清楚。在其他一些网站上,我的&lt;a&gt;&lt;button&gt; 的行为与此处的&lt;div&gt; 完全一样(焦点样式应用于mousedown),但我认为没有什么可以做到这一点(例如,一些JS 调用focus() mousedown 事件处理程序)

标签: html css css-selectors focus


【解决方案1】:

:focus 是与键盘当前选择的字段相关的伪选择器。在输入中切换应将 :focus 应用于该输入。

:active 是与“激活”按钮或链接相关的伪选择器。因此,点击或触摸它会将:active 应用于该元素。

在 CSS 中...

button:active {
    border: solid red 1px;
}

当您对该元素执行操作时,这将添加一个 1px 的红色边框,使其成为被点击的活动链接。

button:focus {
    border: solid red 1px;
}

当您进入该按钮时,这将执行相同的样式。对于:focus 在某些情况下工作,tabindex 很重要。要在按钮上使用相同的 :focus 样式,请确保在按钮上包含 tabindex

如果您需要更多帮助,请告诉我。

【讨论】:

  • 我不明白这是如何回答这个问题的?是的,tabindex 是必需的,因为默认情况下大多数元素根本无法聚焦,例如我的示例中的 div,如果你不能聚焦它,你就不会得到 :focus (包括父元素)。但是为什么 :focus 有时只应用(并且在不同的浏览器上不同)以响应 mousedown,以及如何使其保持一致(UI 设计人员的偏好是永远不要使用 :focus 来处理鼠标/触摸事件)?为什么我的示例中的内容会有所不同?
  • 要进一步回答,按钮默认应该有:focus。你没有的原因是你在默认情况下没有:focus 的元素(&lt;p&gt;)内嵌套了一个按钮。大多数情况下,CSS 文件会设置按钮样式,因此最好为它们提供明确的:focus 样式以确保确定。就我个人而言,当我想要设置活动点击状态的样式时,我总是使用:active 作为按钮。确保你的 CSS 没有覆盖按钮上的 `:focus' 样式。你能把你的 CSS 贴出来让我看看吗?
  • 问题中有小提琴/示例,即使使用默认样式也会发生。
  • 另外你也不需要主动聚焦。因为一个元素会在它被激活之前被聚焦。
  • 太棒了。即使对于 div,如果我们想专注于它,tabindex 也应该包含在您的 div 中。
猜你喜欢
  • 2011-12-13
  • 2012-10-25
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 2012-01-26
相关资源
最近更新 更多