【问题标题】:Default buttons don't show outline styles on click默认按钮在单击时不显示轮廓样式
【发布时间】:2017-01-14 10:57:42
【问题描述】:

为什么默认按钮在单击时不显示任何轮廓样式,而自定义按钮在单击时显示轮廓样式?

如何在单击自定义按钮时删除轮廓样式,但在用户使用键盘导航到它时保留轮廓样式(与默认按钮相同的行为)?

.btn {
  display: inline-block;
  padding: 12px;
  background: cyan;
  border: none;
}
<div>
    <button type="button">Why no outline styles on click?</button>
</div>
<div style="margin-top: 24px">
    <button class="btn">Why outline styles on click?</button>
</div>

更新:出于可访问性原因,我不能使用大纲:无。参考:http://www.outlinenone.com/

【问题讨论】:

  • 您可以使用 JS 使用 blur 修复此问题。我猜用户代理正在响应浏览器事件并且正在移除默认样式元素的焦点,而不是自定义样式元素(至少对于某些属性)。

标签: html css


【解决方案1】:

如果您担心可访问性,那么为什么要删除大纲?通过删除轮廓但添加不同样式的方式来实现可访问性是完全可以的:例如background-colorcolorborder

【讨论】:

  • 这样的一个例子:在 SO sn-ps 中,“运行代码 sn-p”和“复制 sn-p 以回答”按钮和“隐藏结果”链接得到 :hover :focus 上的样式。对 WCAG 了解不够,无法知道这种风格变化是否被认为足够明显(并且“扩展 sn-p”链接不是选项卡可选择的!)但无论如何这只是一个例子
【解决方案2】:

取自前一个问题并在此处编辑:

Why pseudo element :focus on button when using TAB but not click?

你可以通过js做到这一点

var submit = document.getElementById("submit");

var tabbing = false;

window.onkeyup = function (e) {
    if (e.keyCode == 9) {
        tabbing = true;
    }
}

submit.onfocus = function (e) {
    if (tabbing) {
        this.classList.add("tabbed");
    }
};

submit.onblur = function () {
    this.classList.remove("tabbed");
    tabbing = false;
};
#submit.tabbed:focus {
    outline: 2px solid green;
}

#submit{
  display: inline-block;
  padding: 12px;
  background: cyan;
  border: none;
  }

#submit:focus{
  outline: none;
  }
<label>Name:</label>
<input type="text" />
<br>
<label>Pass:</label>
<input type="password" />
<br>
<label>Save Password:</label>
<input type="checkbox" />
<br>
<br>
<button id="submit">Submit</button>

仅当用户选择了选项卡而不是单击按钮时才会显示大纲。

【讨论】:

    【解决方案3】:

    您需要使用 javascript 来区分来自点击的 focus 和来自按键的 focus

    查看答案

    那里有很多不错的选项 - 假设您能够将 js 添加到此页面,您会找到适合您的选项

    【讨论】:

    • 但请记住,并非每个受益于网络可访问性的人都会使用键盘导航。如果您希望此页面可以访问,:focus 应该以 some 方式显示(请参阅@wim-merten 的答案)。如果您根据网络可访问性政策工作,请小心:不显示 :focus 可能会违反政策
    【解决方案4】:

    您可以使用:focus {outline: none;} 设置焦点时按钮的outline 属性

    .btn {
      display: inline-block;
      padding: 12px;
      background: cyan;
      border: none;
    }
    .btn:focus {
      outline: none;
    }
    <div>
        <button type="button">Why no outline styles on click?</button>
    </div>
    <div style="margin-top: 24px">
        <button class="btn">Why outline styles on click?</button>
    </div>

    【讨论】:

    • 出于可访问性的原因,我不能使用无大纲
    【解决方案5】:

    一些浏览器设置了以下默认值,

    :focus {
      outline: -webkit-focus-ring-color auto 5px;
    }
    

    并且需要被覆盖:

    .btn:focus {
      outline: none;
    }
    

    【讨论】:

    • 不能使用大纲:由于可访问性原因没有
    • 你无法访问你的css?
    • @Okomikeruko 出于可访问性原因,删除轮廓是一种不好的做法。一些用户不能使用鼠标而只能使用键盘。大纲让他们知道哪些元素具有焦点并可以执行操作。如果没有大纲,这些用户只能猜测当他们按 Tab 键然后按 Enter 时会发生什么。
    • 那么一些 JavaScript 怎么样,这样大纲只会在单击而不是选项卡时丢失:stackoverflow.com/questions/32046375/…
    【解决方案6】:

    您可以通过包括以下内容来删除大纲:

    .btn{
       outline: none;
    }
    

    您需要知道的另一件事是: 当你使用前。 .btn:active active 表示点击按钮等动作。

    您所要做的就是默认包含大纲并在操作或焦点时将其删除。

    【讨论】:

    • 不能使用大纲:由于可访问性原因没有
    【解决方案7】:

    我不确定你所说的可访问性是什么意思,但如果你想删除你需要使用的大纲

    button:focus {outline:0;}
    

    fiddle here

    我认为没有办法区分,focus on button 通过键盘输入或鼠标点击,都触发了按钮的focus 事件。

    【讨论】:

    • 焦点仍然在自定义按钮上,而不是在默认样式按钮上。 OP想要解决这个问题。切换到自定义按钮时,您的解决方案会移除焦点。
    • "Web 可访问性意味着残障人士可以使用 Web。更具体地说,Web 可访问性意味着残障人士可以感知、理解、导航和与 Web 交互,并且他们可以为网络。网络可访问性也使其他人受益,包括因年龄增长而能力变化的老年人。” w3.org/WAI/intro/accessibility.php 上的更多内容,这是一个普遍的重要问题,随着越来越多的大型机构添加 Web 可访问性政策,这个问题正在成为更多开发人员生活的一部分
    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 2021-07-09
    • 2017-07-17
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2013-06-23
    • 2018-11-22
    相关资源
    最近更新 更多