Atributos

Os atributos foram discutidos brevemente na Visão geral do HTML. Agora é hora de nos aprofundarmos.

Os atributos são o que torna o HTML tão eficiente. Os atributos são nomes separados por espaços e pares de nome/valor que aparecem na tag de abertura, fornecendo informações sobre a funcionalidade do elemento.

A tag de abertura, os atributos e a tag de fechamento, identificados em um elemento HTML.

Os atributos definem o comportamento, as vinculações e a funcionalidade dos elementos. Alguns atributos são globais, o que significa que podem aparecer dentro da tag de abertura de qualquer elemento. Outros atributos se aplicam a vários elementos, mas não a todos. Já outros são específicos de um elemento e relevantes apenas para um. Em HTML, todos os atributos, exceto booleanos e, até certo ponto, os enumerados, exigem um valor.

Se um valor de atributo incluir um espaço ou caracteres especiais, ele precisará estar entre aspas. Por esse motivo, e para melhorar a legibilidade, é sempre recomendável fazer citações.

Embora o HTML não diferencie maiúsculas de minúsculas, alguns valores de atributo são. Os valores que fazem parte da especificação HTML são indiferentes a maiúsculas. Os valores de strings definidos, como nomes de classe e ID, diferenciam maiúsculas de minúsculas. Se um valor de atributo diferenciar maiúsculas de minúsculas em HTML, ele será usado como parte de um seletor de atributos em CSS e JavaScript. Caso contrário, não.

<!-- the type attribute is case insensitive: these are equivalent -->
<input type="text">
<input type="TeXt">

<!-- the id attribute is case sensitive: they are not equivalent -->
<div id="myId">
<div id="MyID">

Atributos booleanos

Se um atributo booleano estiver presente, ele será sempre verdadeiro. Os atributos booleanos incluem autofocus, inert, checked, disabled, required, reversed, allowfullscreen, default, loop, autoplay, controls, muted, readonly, multiple, e selected. Se um ou mais desses atributos estiverem presentes, o elemento será desativado, obrigatório, somente leitura etc. Se não estiver presente, ele não está.

Os valores booleanos podem ser omitidos, definidos como uma string vazia ou o nome do atributo, mas o valor não precisa ser definido como a string true. Todos os valores, incluindo true, false e 😀, embora inválidos, serão resolvidos como verdadeiros.

Essas três tags são equivalentes:

<input required>
<input required="">
<input required="required">

Se o valor do atributo for falso, omita o atributo. Se o atributo for verdadeiro, inclua o atributo, mas não forneça um valor. Por exemplo, required="required" não é um valor válido em HTML, mas como required é booleano, valores inválidos são resolvidos como verdadeiros. No entanto, como os atributos enumerados inválidos não necessariamente resolvem para o mesmo valor que os valores ausentes, é mais fácil adotar o hábito de omitir valores do que lembrar quais atributos são booleanos ou enumerados e podem fornecer um valor inválido.

Ao alternar entre verdadeiro e falso, adicione e remova o atributo completamente com JavaScript em vez de alternar o valor.

const myMedia = document.getElementById("mediaFile");
myMedia.removeAttribute("muted");
myMedia.setAttribute("muted");

Em linguagens XML, como SVG, todos os atributos precisam incluir um valor, incluindo atributos booleanos.

Atributos enumerados

Os atributos enumerados às vezes são confundidos com atributos booleanos. São atributos HTML com um conjunto limitado de valores válidos predefinidos. Assim como os atributos booleanos, eles têm um valor padrão se o atributo estiver presente, mas o valor estiver ausente. Por exemplo, se você incluir <style contenteditable>, o padrão será <style contenteditable="true">.

No entanto, ao contrário dos atributos booleanos, omitir o atributo não significa que ele é falso. Um atributo presente com um valor ausente não é necessariamente verdadeiro. O padrão para valores inválidos não é necessariamente o mesmo que uma string nula. Continuando com o exemplo, o padrão de contenteditable é inherit se ausente ou inválido e pode ser definido explicitamente como false.

O valor padrão depende do atributo. Ao contrário dos valores booleanos, os atributos não são "true" automaticamente quando estão presentes. Se você incluir <style contenteditable="false">, o elemento não será editável. Se o valor for inválido, como <style contenteditable="😀">, ou, surpreendentemente, <style contenteditable="contenteditable">, ele será inválido e o padrão será inherit.

Na maioria dos casos com atributos enumerados, os valores ausentes e inválidos são iguais. Por exemplo, se o atributo type em um <input> estiver ausente, presente, mas sem valor ou tiver um valor inválido, o padrão vai ser text. Embora esse comportamento seja comum, não é uma regra. Por isso, é importante saber quais atributos são booleanos ou enumerados. Se possível, omita os valores para não errar e procure o valor conforme necessário.

Atributos globais

Os atributos globais são aqueles que podem ser definidos em qualquer elemento HTML, incluindo elementos em <head>. Há mais de 30 atributos globais. Embora, em teoria, todos eles possam ser adicionados a qualquer elemento HTML, alguns atributos globais não têm efeito quando definidos em alguns elementos. Por exemplo, definir hidden em um <meta> como conteúdo meta não é exibido.

id

O atributo global id é usado para definir um identificador exclusivo para um elemento. Ele tem várias finalidades, incluindo: - O destino do identificador de fragmento de um link. - Identificar um elemento para script. - Associar um elemento de formulário ao rótulo. - Fornecer um marcador ou uma descrição para tecnologias assistivas. - Estilos de segmentação com (alta especificidade ou como seletores de atributos) no CSS.

O valor id é uma string sem espaços. Se ele contiver um espaço, o documento não vai ser corrompido, mas será necessário segmentar o id com caracteres de escape no HTML, CSS e JS. Todos os outros caracteres são válidos. Um valor de id pode ser 😀 ou .class, mas não é uma boa ideia. Para facilitar a programação para você atual e futuro, transforme o primeiro caractere de id em uma letra e use apenas letras ASCII, dígitos, _ e -. É uma prática recomendada criar uma convenção de nomenclatura id e segui-la, já que os valores de id diferenciam maiúsculas de minúsculas.

O id precisa ser exclusivo para o documento. O layout da página provavelmente não será corrompido se um id for usado mais de uma vez, mas as interações do JavaScript, dos links e do elemento podem não funcionar como esperado.

A barra de navegação inclui quatro links. Abordaremos o elemento de link mais tarde, mas, por enquanto, observe que os links não são restritos a URLs baseados em HTTP. Eles podem ser identificadores de fragmento para seções da página no documento atual (ou em outros documentos).

No site do workshop de machine learning, a barra de navegação no cabeçalho da página inclui quatro links:

O atributo href fornece o hiperlink para onde o usuário é direcionado à ativação do link. Quando um URL inclui uma marca de hash (#) seguida por uma string de caracteres, ela é um identificador de fragmento. Se essa string corresponder a um id de um elemento na página da Web, o fragmento será uma âncora, ou um favorito, desse elemento. O navegador rolará até o ponto em que a âncora for definida.

Esses quatro links apontam para quatro seções da nossa página identificadas pelo atributo id. Quando o usuário clica em qualquer um dos quatro links na barra de navegação, rola a tela para o elemento vinculado pelo identificador do fragmento, que contém o ID correspondente, menos o #.

O conteúdo <main> do workshop de machine learning tem quatro seções com IDs. Quando o visitante do site clica em um dos links no <nav>, a seção com esse identificador de fragmento é exibida. A marcação é semelhante a:

<section id="reg">
  <h2>Machine Learning Workshop Tickets</h2>
</section>

<section id="about">
  <h2>What you'll learn</h2>
</section>

<section id="teachers">
  <h2>Your Instructors</h2>
  <h3>Hal 9000 <span>&amp;</span> EVE</h3>
</section>

<section id="feedback">
  <h2>What it's like to learn good and do other stuff good too</h2>
</section>

Comparando os identificadores de fragmento nos links <nav>, você vai perceber que cada um corresponde ao id de um <section> em <main>. O navegador nos fornece um link sem custo financeiro "parte superior da página". Se href="#top" não diferencia maiúsculas de minúsculas ou é simplesmente href="#", o usuário é levado até a parte de cima da página.

O separador de marca de hash em href não faz parte do identificador de fragmento. O identificador de fragmento é sempre a última parte do URL e não é enviado ao servidor.

Seletores de CSS

No CSS, é possível segmentar cada seção usando um seletor de ID, como #feedback, ou, para especificidade menor, um seletor de atributos que diferencia maiúsculas de minúsculas, [id="feedback"].

Criação dos roteiros

No MLW.com, há um easter egg apenas para usuários de mouse. Clicar no interruptor ativa e desativa a página.

A marcação para a imagem do interruptor de luz é: html <img src="svg/switch2.svg" id="switch" alt="light switch" class="light" /> O atributo id pode ser usado como parâmetro para o método getElementById() e, com um prefixo #, como parte de um parâmetro para os métodos querySelector() e querySelectorAll().

const switchViaID = document.getElementById("switch");
const switchViaSelector = document.querySelector("#switch");

Nossa única função JavaScript usa essa capacidade de segmentar elementos pelo atributo id:

<script>
  /* switch is a reserved word in js, so we us onoff instead */
  const onoff = document.getElementById('switch');
  onoff.addEventListener('click', function(){
    document.body.classList.toggle('black');
  });
</script>

<label>

O elemento HTML <label> tem um atributo for que toma como valor o id do controle de formulário com o qual está associado. Criar um rótulo explícito incluindo um id em todos os controles de formulário e parear cada um com o atributo for do rótulo garante que cada controle de formulário tenha um rótulo associado.

Cada rótulo pode ser associado a exatamente um controle de formulário, mas um controle de formulário pode ter mais de um rótulo associado.

Se o controle de formulário estiver aninhado entre as tags de abertura e fechamento <label>, os atributos for e id não serão obrigatórios: isso é chamado de rótulo "implícito". Os rótulos informam a todos os usuários para que serve cada controle de formulário.

<label>
  Send me a reminder <input type="number" name="min"> before the workshop resumes
</label>.

A associação entre for e id disponibiliza as informações para os usuários de tecnologias adaptativas. Além disso, clicar em qualquer lugar de um rótulo focaliza o elemento associado, ampliando a área de clique do controle. Isso não é útil apenas para pessoas com problemas de destreza, tornando o mouse menos preciso, mas também ajuda todos os usuários de dispositivos móveis com dedos mais largos do que um botão de opção.

Neste exemplo de código, a quinta pergunta falsa de um teste falso é de múltipla escolha de seleção única. Cada controle de formulário tem um rótulo explícito, com um id exclusivo para cada um. Para não duplicar acidentalmente um ID, o valor do ID é uma combinação do número da pergunta e do valor.

Ao incluir botões de opção, conforme os rótulos descrevem o valor deles, incluímos todos os botões com o mesmo nome em uma <fieldset>, com <legend> sendo o rótulo ou a pergunta de todo o conjunto.

Outros usos da acessibilidade

O uso de id na acessibilidade e usabilidade não se limita a rótulos. Na introdução ao texto, um <section> foi convertido em ponto de referência da região, referenciando o id de um <h2> como o valor do aria-labelledby do <section> para fornecer o nome acessível:

<section id="about" aria-labelledby="about_heading">
<h2 id="about_heading">What you'll learn</h2>

Mais de 50 estados e propriedades de aria-* podem ser usados para garantir a acessibilidade. aria-labelledby, aria-describedby, aria-details e aria-owns assumem como valor uma lista de referência id separada por espaços. aria-activedescendant, que identifica o elemento descendente em foco no momento, tem como valor uma única referência id: a do único elemento que está em foco (somente um elemento pode ser focado por vez).

class

O atributo class fornece outra maneira de segmentar elementos com CSS (e JavaScript), mas não tem nenhuma outra finalidade em HTML, embora as bibliotecas e as bibliotecas de componentes possam usá-los. O atributo class usa como valor uma lista separada por espaços das classes que diferenciam maiúsculas de minúsculas para o elemento.

Construir uma estrutura semântica sólida permite a segmentação de elementos com base no posicionamento e na função deles. A estrutura sonora permite o uso de seletores de elementos descendentes, relacionais e de atributos. À medida que você aprende sobre atributos nesta seção, considere como estilizar elementos com os mesmos atributos ou valores de atributos. Não é que você não deva usar o atributo de classe, só que a maioria dos desenvolvedores não percebe que muitas vezes não precisam fazer isso.

Até agora, o MLW não usou nenhuma classe. Um site pode ser iniciado sem um único nome de classe? O que veremos.

style

O atributo style permite aplicar estilos inline, que são estilos aplicados a um único elemento em que o atributo é definido. O atributo style usa como valor os pares de valor da propriedade CSS, com a sintaxe do valor igual ao conteúdo de um bloco de estilo CSS. As propriedades são seguidas por dois pontos, como no CSS, e pontos e vírgulas terminam em cada declaração, depois do valor.

Os estilos são aplicados somente ao elemento em que o atributo é definido, com os descendentes herdam valores de propriedades herdadas se não forem substituídos por outras declarações de estilo em elementos aninhados ou em blocos <style> ou folhas de estilo. Como o valor compreende o conteúdo de um único bloco de estilo aplicado somente a esse elemento, ele não pode ser usado para conteúdo gerado, para criar animações de frame-chave ou aplicar outras regras.

Embora o style seja um atributo global, não é recomendável usá-lo. Em vez disso, defina estilos em arquivos separados. O atributo style pode ser útil durante o desenvolvimento para permitir um estilo rápido, por exemplo, para testes. Em seguida, cole o estilo "solução" no arquivo CSS vinculado.

tabindex

O atributo tabindex pode ser adicionado a qualquer elemento para que ele receba foco. O valor tabindex define se ele é adicionado à ordem da tabulação e, opcionalmente, em uma ordem de tabulação não padrão.

O atributo tabindex usa como valor um número inteiro. Um valor negativo (a convenção é usar -1) torna um elemento capaz de receber foco, como via JavaScript, mas não adiciona o elemento à sequência de tabulação. Um valor tabindex de 0 torna o elemento focalizável e acessível por meio de tabulação, adicionando-o à ordem de tabulação padrão da página na ordem do código-fonte. Um valor de 1 ou mais coloca o elemento em uma sequência de foco priorizada e não é recomendado.

Nesta página, há uma funcionalidade de compartilhamento usando um elemento personalizado <share-action> que atua como <button>. O tabindex de zero é incluído para adicionar o elemento personalizado à ordem de tabulação padrão do teclado:

<share-action authors="@estellevw" data-action="click" data-category="web.dev" data-icon="share" data-label="share, twitter" role="button" tabindex="0">
  <svg aria-label="share" role="img" xmlns="http://www.w3.org/2000/svg">
    <use href="#shareIcon" />
  </svg>
  <span>Share</span>
</share-action>

O role de button informa aos usuários do leitor de tela que esse elemento precisa se comportar como um botão. O JavaScript é usado para garantir que a promessa de funcionalidade do botão seja mantida, incluindo o processamento de eventos click e keydown e o gerenciamento de teclas Enter e Espaço.

Controles de formulários, links, botões e elementos de conteúdo editável podem receber foco. Quando um usuário de teclado pressiona a tecla "Tab", o foco passa para o próximo elemento focalizável, como se ele tivesse tabindex="0" definido. Outros elementos não são focalizáveis por padrão. Adicionar o atributo tabindex a esses elementos permite que eles recebam foco quando não receberiam de outra forma.

Se um documento incluir elementos com um tabindex de 1 ou mais, eles serão incluídos em uma sequência de guias separada. Como você pode notar no codepen, a tabulação começa em uma sequência separada, na ordem do valor menor para o maior, antes de passar pelos na sequência regular na ordem de origem.

Alterar a ordem das guias pode criar uma experiência muito ruim para o usuário. Isso dificulta a dependência de tecnologias adaptativas, como teclados e leitores de tela, para navegar pelo conteúdo. Também é difícil para os desenvolvedores gerenciar e manter. O foco é importante, porque há um módulo inteiro discutindo o foco e a ordem do foco.

role

O atributo role faz parte da especificação ARIA, e não da especificação HMTL WhatWG. O atributo role pode ser usado para fornecer significado semântico ao conteúdo, permitindo que os leitores de tela informem aos usuários do site sobre a interação esperada do usuário de um objeto.

Há alguns widgets de IU comuns, como comboboxes, barras de menu, listas de guias e grades de árvores, que não têm equivalentes em HTML nativo. Por exemplo, ao criar um padrão de design com guias, os papéis tab, tablist e tabpanel podem ser usados. Alguém que pode ver fisicamente a interface do usuário aprendeu por experiência a navegar pelo widget e tornar diferentes painéis visíveis clicando nas guias associadas. A inclusão do papel tab com <button role="tab"> quando um grupo de botões é usado para mostrar painéis diferentes permite que o usuário do leitor de tela saiba que o <button> em foco no momento pode alternar um painel relacionado em vez de implementar uma funcionalidade típica de botão.

O atributo role não muda o comportamento do navegador nem as interações do teclado ou do dispositivo ponteiro. Adicionar role="button" a um <span> não o transforma em um <button>. É por isso que é recomendado usar elementos HTML semânticos para a finalidade pretendida. No entanto, quando não é possível usar o elemento certo, o atributo role permite informar aos usuários de leitores de tela quando um elemento não semântico foi adaptado para o papel de um elemento semântico.

contenteditable

Um elemento com o atributo contenteditable definido como true é editável, pode ser focalizado e é adicionado à ordem da tabulação como se tabindex="0" estivesse definido. Contenteditable é um atributo enumerado que aceita os valores true e false, com um valor padrão de inherit se o atributo não estiver presente ou tiver um valor inválido.

Estas três tags de abertura são equivalentes:

<style contenteditable>
<style contenteditable="">
<style contenteditable="true">

Se você incluir <style contenteditable="false">, o elemento não vai ser editável (a menos que seja por padrão, como <textarea>). Se o valor for inválido, como <style contenteditable="😀"> ou <style contenteditable="contenteditable">, ele vai ser inherit por padrão.

Para alternar entre estados, consulte o valor da propriedade somente leitura HTMLElement.isContentEditable.

const editor = document.getElementById("myElement");
if(editor.contentEditable) {
  editor.setAttribute("contenteditable", "false");
} else {
  editor.setAttribute("contenteditable", "");
}

Como alternativa, essa propriedade pode ser especificada definindo editor.contentEditable como true, false ou inherit.

Os atributos globais podem ser aplicados a todos os elementos, até mesmo a elementos <style>. Você pode usar atributos e um pouco de CSS para criar um editor de CSS ativo.

<style contenteditable>
style {
  color: inherit;
  display:block;
  border: 1px solid;
  font: inherit;
  font-family: monospace;
  padding:1em;
  border-radius: 1em;
  white-space: pre;
}
</style>

Tente mudar o color do style para algo diferente de inherit. Em seguida, tente mudar o style para um seletor p. Não remova a propriedade de exibição. Caso contrário, o bloco de estilo vai desaparecer.

Atributos personalizados

Abordamos somente a superfície dos atributos globais do HTML. Há ainda mais atributos que se aplicam a apenas um elemento ou a um conjunto limitado de elementos. Mesmo com centenas de atributos definidos, você pode precisar de um atributo que não esteja na especificação. O HTML pode ajudar.

É possível criar qualquer atributo personalizado adicionando o prefixo data-. É possível dar ao seu atributo qualquer nome que comece com data-, seguido de qualquer série em letras minúsculas de caracteres que não comecem com xml e que não contenham dois-pontos (:).

Embora o HTML seja permissivo e não seja corrompido se você criar atributos não compatíveis que não comecem com data ou mesmo se iniciar seu atributo personalizado com xml ou incluir um :, há benefícios na criação de atributos personalizados válidos que começam com data-. Com os atributos de dados personalizados, você sabe que não está usando acidentalmente um nome de atributo existente. Os atributos de dados personalizados são preparados para o futuro.

Embora os navegadores não implementem comportamentos padrão para nenhum atributo data- específico prefixado, há uma API de conjunto de dados integrada para iterar seus atributos personalizados. As propriedades personalizadas são uma excelente forma de comunicar informações específicas do aplicativo via JavaScript. Adicione atributos personalizados a elementos na forma de data-name e acesse-os pelo DOM usando dataset[name] no elemento em questão.

<blockquote data-machine-learning="workshop"
  data-first-name="Blendan" data-last-name="Smooth"
  data-formerly="Margarita Maker" data-aspiring="Load Balancer"
  data-year-graduated="2022">
  HAL and EVE could teach a fan to blow hot air.
</blockquote>

Você pode usar getAttribute() com o nome completo do atributo ou aproveitar a propriedade dataset, que é mais simples.

el.dataset[machineLearning]; // workshop
e.dataset.machineLearning; // workshop

A propriedade dataset retorna um objeto DOMStringMap dos atributos data- de cada elemento. Existem vários atributos personalizados no <blockquote>. A propriedade do conjunto de dados significa que você não precisa saber quais são esses atributos personalizados para acessar os nomes e valores deles:

for (let key in el.dataset) {
  customObject[key] = el.dataset[key];
}

Os atributos neste artigo são globais, o que significa que eles podem ser aplicados a qualquer elemento HTML, embora nem todos tenham impacto sobre esses elementos. A seguir, analisaremos os dois atributos da imagem de introdução que não abordamos (target e href) e vários outros atributos específicos de elementos à medida que analisamos melhor os links.

Teste seu conhecimento

Teste seu conhecimento sobre atributos.

Um id precisa ser exclusivo no documento.

Falso
Tente novamente.
Verdadeiro
Correto.

Selecione o atributo personalizado com a formatação correta.

data-birthday
Resposta correta
birthday
Tente novamente.
data:birthday
Tentar de novo