O que são ARIA Roles?
NOTA: Alguns desses exemplos interativos podem incluir código CSS e JavaScript. Não se preocupe em tentar entender o código. As prévias estão lá para ajudar a ilustrar alguns dos principais pontos discutidos na lição. Para ver as prévias, você precisará ativar o editor interativo.
ARIA significa Aplicações Ricas de Internet Acessíveis.
Os papéis ARIA especificam o significado semântico dos elementos HTML. Eles são essenciais para tornar o conteúdo web acessível para pessoas que usam tecnologias assistivas, como leitores de tela.
HTML possui elementos semânticos e não semânticos, com base em se eles transmitem significado sobre seu conteúdo.
Muitos elementos HTML semânticos já têm um papel ARIA atribuído por padrão. Por exemplo, o elemento
button tem um papel ARIA padrão de button.
<button>Example button</button>
Mas elementos não semânticos não têm um papel. Por exemplo, leitores de tela não saberão como interpretar o propósito de um div se você não especificar seu papel explicitamente.
<div>
<!-- more elements go here -->
</div>
Para especificar o papel ARIA de um elemento, você só precisa adicionar o atributo role, assim role="ARIA role", onde o valor é o nome de um papel na especificação ARIA.
Aqui está um exemplo de uso do atributo role com um valor de "alert":
<link rel="stylesheet" href="styles.css">
<div class="alert" id="exp-warning" role="alert">
<span class="hidden">Your log in session will expire in 3 minutes.</span>
</div>
.alert {
background-color: #fff3cd;
border: 1px solid #ffeeba;
color: #856404;
padding: 1em;
margin-top: 1em;
border-radius: 4px;
font-weight: bold;
}
.alert span {
display: inline-block;
}
É importante notar que especificar um role em um elemento faz apenas uma coisa: informa à tecnologia assistiva o propósito do elemento. Não adiciona nenhuma funcionalidade ou comportamento ao elemento. Se as pessoas esperam que um papel se comporte de uma determinada maneira, cabe a você, o desenvolvedor, adicionar esse comportamento esperado.
Por exemplo, adicionar um role de button a um div não o torna automaticamente clicável com o mouse ou utilizável com o teclado. É responsabilidade do desenvolvedor adicionar o comportamento esperado que permita que o div aja como um botão e, na maioria dos casos, é melhor usar o elemento button.
Existem seis categorias principais de funções ARIA:
- Funções da estrutura do documento
- Funções de widget
- Funções de referência
- Funções de região ao vivo
- Funções da janela
- E funções abstratas
toolbar, tooltip, feed, math, presentation, none e note.
Existem outros papéis semelhantes mas estes são os mais comumente usados. Este é um exemplo de um div com a função ARIA math. O div contém uma equação matemática.
<link rel="stylesheet" href="styles.css">
<div role="math" aria-label="x squared + y squared = 3">
x<sup>2</sup> + y<sup>2</sup> = 3
</div>
.math-expression {
font-family: "Times New Roman", serif;
font-size: 1.2rem;
background-color: #f4f4f4;
border-left: 4px solid #007acc;
padding: 0.75em 1em;
margin-top: 1em;
display: inline-block;
}
.math-expression sup {
font-size: 0.8em;
}
Você também notará que o div possui um atributo aria-label. O valor deste atributo deve ser uma string que representa a expressão.
As funções dos widgets definem o propósito e a funcionalidade dos elementos interativos, como barras de rolagem.
Exemplos de funções de widget incluem scrollbar, searchbox, separator (quando focável), slider, spinbutton, switch, tab, tabpanel e treeitem.
Aqui está um exemplo de uma searchbox:
<link rel="stylesheet" href="styles.css">
<div class="search-container" role="search">
<label for="searchbox" class="visually-hidden">Search</label>
<div
id="searchbox"
class="searchbox"
role="searchbox"
aria-label="Search the site"
tabindex="0"
contenteditable="true">
</div>
<button type="button" aria-label="Submit search">Search</button>
</div>
.search-container {
display: flex;
align-items: center;
gap: 0.5em;
margin-top: 1em;
}
.searchbox {
flex: 1;
padding: 0.5em;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 1em;
min-height: 1.5em;
}
.searchbox:focus {
border-color: #007acc;
outline: none;
box-shadow: 0 0 0 2px rgba(0, 122, 204, 0.3);
}
button {
padding: 0.5em 1em;
background-color: #007acc;
color: #fff;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #005fa3;
}
/* Hide visually but keep for screen readers */
.visually-hidden {
position: absolute;
left: -9999px;
}
Alguns desses papéis têm elementos semânticos equivalentes. Você deve priorizar o elemento semântico sobre o papel se houver um. Por exemplo, você deve preferir usar o elemento HTML button em vez de adicionar um role de button a um div.
Os papéis de landmark classificam e rotulam as seções principais de uma página web. Leitores de tela os utilizam para fornecer navegação conveniente para seções importantes de uma página. Você deve usá-los com moderação para manter o layout geral simples e fácil de entender. Exemplos de funções de referência são banner, complementary, contentinfo, form, main, navigation, region e search. Cada um desses papéis tem um equivalente correspondente em HTML, como header, footer, aside, form, main, nav, section e search. Se você usar os elementos HTML apropriados para definir as seções da sua página, então não é necessário adicionar explicitamente o atributo role a esses elementos.
Aqui está um exemplo de um banner:
<link rel="stylesheet" href="styles.css">
<div role="banner" class="site-banner">
<h1>Accessible Web Design</h1>
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">Articles</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
</div>
.site-banner {
background-color: #007acc;
color: #fff;
padding: 1em 1.5em;
border-radius: 4px;
}
.site-banner h1 {
margin: 0 0 0.5em;
font-size: 1.5em;
}
.site-banner nav ul {
list-style: none;
margin: 0;
padding: 0;
display: flex;
gap: 1em;
}
.site-banner nav a {
color: #fff;
text-decoration: none;
font-weight: 500;
}
.site-banner nav a:hover {
text-decoration: underline;
}
Funções de região ao vivo definem elementos com conteúdo que mudará dinamicamente. Dessa forma, leitores de tela e outras tecnologias assistivas podem anunciar mudanças para usuários com deficiências visuais. Esses papéis incluem: alert, log, marquee, status e timer.
Aqui está um exemplo de um status:
<link rel="stylesheet" href="styles.css">
<div class="status-demo">
<button id="update-status-btn">Check Status</button>
<div id="status-msg" role="status" class="status-message">
No updates yet.
</div>
</div>
<script src="index.js"></script>
.status-demo {
margin-top: 1em;
}
button {
padding: 0.5em 1em;
background-color: #007acc;
color: #fff;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #005fa3;
}
.status-message {
margin-top: 0.75em;
padding: 0.75em;
background-color: #e8f4ff;
border: 1px solid #b3d8ff;
border-radius: 4px;
font-weight: 500;
}
const button = document.getElementById("update-status-btn");
const statusMessage = document.getElementById("status-msg");
button.addEventListener("click", () => {
statusMessage.textContent = "Your upload has completed successfully.";
});
Funções de janela definem sub-janelas, como diálogos modais pop-up. Esses papéis incluem alertdialog e dialog. Observe que agora é considerado uma boa prática usar o elemento HTML dialog e seus métodos JavaScript associados em vez de criar manualmente um diálogo.
Aqui está um exemplo de uso da função dialog para um diálogo personalizado:
<link rel="stylesheet" href="styles.css">
<button id="open-dialog">Open Dialog</button>
<div id="custom-dialog" role="dialog" aria-modal="true" aria-labelledby="dialog-title" class="dialog">
<div class="dialog-content">
<h3 id="dialog-title">Confirm Action</h3>
<p>Are you sure you want to delete this file?</p>
<div class="dialog-actions">
<button id="confirm-btn">Yes</button>
<button id="close-dialog">Cancel</button>
</div>
</div>
</div>
<script src="index.js"></script>
body {
font-family: Arial, sans-serif;
margin: 2em;
}
button {
padding: 0.5em 1em;
border: none;
border-radius: 4px;
cursor: pointer;
background-color: #007acc;
color: white;
font-size: 1em;
}
button:hover {
background-color: #005fa3;
}
.dialog {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
justify-content: center;
align-items: center;
z-index: 1000;
}
.dialog-content {
background-color: white;
padding: 1.5em;
border-radius: 8px;
width: 90%;
max-width: 400px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.dialog-actions {
display: flex;
justify-content: flex-end;
gap: 0.5em;
margin-top: 1em;
}
const dialog = document.getElementById("custom-dialog");
const openBtn = document.getElementById("open-dialog");
const closeBtn = document.getElementById("close-dialog");
const confirmBtn = document.getElementById("confirm-btn");
openBtn.addEventListener("click", () => {
dialog.style.display = "flex";
});
closeBtn.addEventListener("click", () => {
dialog.style.display = "none";
});
confirmBtn.addEventListener("click", () => {
alert("File deleted.");
dialog.style.display = "none";
});
E finalmente, temos papéis abstratos. Esses papéis ajudam a organizar o documento. Eles são destinados apenas para uso interno pelo navegador, não por desenvolvedores, então você deve saber que eles existem mas não deve usá-los em seus sites ou aplicações web.
Com os papéis ARIA, você pode criar sites e aplicações web acessíveis e inclusivos. Eles fornecem informações semânticas sobre o propósito e a função dos elementos HTML.
Leitores de tela e outras tecnologias assistivas usam essas informações para ajudar os usuários a entender o conteúdo da sua página e definir expectativas sobre como usá-la, o que ajuda a garantir que todos possam ter uma ótima experiência do usuário.Este módulo não possui perguntas. Marque como concluído.