按钮角色 role="button"

描述

按钮角色用于可点击元素,用户点击按钮来触发一些动作。按钮角色使用 `role="button"` 表示。

<div id="saveChanges" tabindex="0" role="button" aria-pressed="false">Save</div>

上面示例创建一个可捕获焦点、可点击按钮。不同于常风的按钮:

<button id="saveChanges">Save</button>

按钮角色用于向屏幕阅读器标识元素为按钮。按钮的常见用法是执行动作,如提交表单,打开弹窗或者执行插入数据或显示信息的动作等等。

常见的按钮是 button, role="button" 可以创建可切换状态的非按钮元素,如菜单按钮。按钮有两种状态,一是按下,二是非按下。这两种状态使用 aria-pressed 属性的 true 或 false 值来表示。aria-pressed="undefined" 是默认值表示不支持按。

按钮应该有可访问名。通常是按钮中的文字。如果按钮没有文字,如图标按钮,可用 [aria-label](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute) 或 [aria-labelledby](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-labelledby_attribute) 标识。

需要添加的 JS 功能

按钮可由鼠标,触摸,或键盘交互。对于原生 <button> 元素,当按钮有焦点时,用户按 Space 或 Enter 就可以触发按钮的 onclick 事件。如果用其他标签创建按钮时,onclick 事件只有在用户用鼠标点击元素时才会触发,即使有 role="button" 也不行。因些必需要添加添加一些事件才能支持 Space 或 Enter 操作。

onclick: 处理鼠标点击或触摸事件。

onKeyDown: 处理 Enter 或 Space 操作。

示例

1. 创建一个 span 元素表示按钮,设置 tabindex 属生使按钮可聚焦且有焦点顺序。使用 CSS 样式设置按钮外观。handleBtnClick 和 handleBtnKeyDown 事件处理句柄用于按钮处理鼠标点击或 Space 或 Enter 的操作,其动作为向列表添加新名称。

html

  <h1>ARIA Button Example</h1>

    <ul id="nameList"></ul>

    <label for="newName">Enter your Name: </label>

    <input type="text" id="newName">

    <span role="button" tabindex="0" onclick="handleCommand()" onKeyDown="handleCommand()">Add Name</span>

css

[role="button"] {

  padding: 2px;

  background-color: navy;

  color: white;

  cursor: default;

}

[role="button"]:hover,

[role="button"]:focus,

[role="button"]:active {

   background-color: white;

   color: navy;

}

ul {

    list-style: none;

}

js

function handleCommand(event) {

    // Handles both mouse clicks and keyboard

    // activate with Enter or Space

    // Get the new name value from the input element

    let newNameInput = document.getElementById('newName');

    let name = newNameInput.value;

    newNameInput.value = ''; // clear the text field

    newNameInput.focus();  // give the text field focus to enable entering and additional name.

    // Don't add blank entries to the list.

    if(name.length > 0) {

        listItem = document.createElement('li');

        listItem.appendChild(document.createTextNode(name));

        // Add the new name to the list.

        let list = document.getElementById('nameList');

        list.appendChild(listItem);

    }

}

2. 使用 span 元素表示按钮,切换其 aria-pressed 状态。

html

<span role="button" tabindex="0"

 aria-pressed="false" onclick="handleBtnClick(event)"

 onKeyDown="handleBtnKeyDown(event)">

  Mute Audio

</span>

<audio id="audio" src="https://soundbible.com/mp3/Tyrannosaurus%20Rex%20Roar-SoundBible.com-807702404.mp3">

  Your browser does not support the <code>audio</code> element.

</audio>

css

button,

[role="button"] {

    padding: 3px;

    border: 2px solid transparent;

}

button:active,

button:focus,

[role="button"][aria-pressed="true"] {

    border: 2px solid #000;

}

js

function handleBtnClick(event) {

  toggleButton(event.target);

}

function handleBtnKeyDown(event) {

  // Check to see if space or enter were pressed

  if (event.key === " " || event.key === "Enter" || event.key === "Spacebar") { // "Spacebar" for IE11 support

    // Prevent the default action to stop scrolling when space is pressed

    event.preventDefault();

    toggleButton(event.target);

  }

}

function toggleButton(element) {

  var audio = document.getElementById('audio');

  // Check to see if the button is pressed

  var pressed = (element.getAttribute("aria-pressed") === "true");

  // Change aria-pressed to the opposite state

  element.setAttribute("aria-pressed", !pressed);

  // toggle the play state of the audio file

  if(pressed) {

     audio.pause();

  } else {

     audio.play();

  }

}

可访问性关注

按钮是可交互的控件,因些需要焦点。如果添加了 button 角色但元素 (如 <span>, <div> 或 <p>) 本身不可捕获焦点,那么可用 tableindex 属性使其可捕获焦点。

注意链接充当按钮,链接其望用 Enter 打开,而按钮是 Space 或 Enter. 给链接加 role="button" 是不够的,还需要处理 Space 操作使其与原生按钮一致。

当使用 button 角色时,屏幕阅读器会将元素识别为按钮,通常说点击后加元素的可访问名。可访问名是元素的内容或者来自 aria-label 或 aria-labelledby 属性指定,或者是元素的描述。

思考

思考有助天更好理解问题,看完上面的描述后,不妨思考以下几个问题?

1. 按钮角色 role="button" 主要用来干什么的?

2. 如何创建自定义按钮?

2. 按钮的可访问性。

原文链接

https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/button_role

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容