Valable pour utiliser <a> (balise d'ancrage) sans attribut href?

153

J'utilise Twitter Bootstrap pour créer un site, et une grande partie de ses fonctionnalités dépend de l'encapsulation des choses <a>, même si elles vont simplement exécuter Javascript. J'ai eu des problèmes avec la href="#"tactique recommandée par la documentation de Bootstrap, alors j'essayais de trouver une solution différente.

Mais ensuite, j'ai essayé de supprimer hrefcomplètement l' attribut. J'utilise et j'ai <a class='bunch of classes' data-whatever='data'>Javascript pour gérer le reste. Et il fonctionne.

Pourtant, quelque chose me dit que je ne devrais pas faire ça. Droite? Je veux dire, techniquement, <a>c'est censé être un lien vers quelque chose, mais je ne suis pas tout à fait sûr de savoir pourquoi c'est un problème. Ou est-ce?

Zacqary
la source

Réponses:

245

L' <a>élément nchor est simplement une ancre vers ou depuis un contenu. À l'origine, la spécification HTML autorisait les ancres nommées ( <a name="foo">) et les ancres liées ( <a href="#foo">).

Le format d'ancrage nommé est moins couramment utilisé, car l'identificateur de fragment est maintenant utilisé pour spécifier un [id]attribut (bien que pour la compatibilité ascendante, vous puissiez toujours spécifier des [name]attributs). Un <a>élément sans [href]attribut est toujours valide .

En ce qui concerne la sémantique et le style, l' <a>élément n'est pas un lien ( :link) à moins qu'il n'ait un [href]attribut. Un effet secondaire de ceci est qu'un <a>élément sans [href]ne sera pas dans l'ordre de tabulation par défaut.

La vraie question est de savoir si l' <a>élément seul est une représentation appropriée de a <button>. Sur le plan sémantique, il existe une nette différence entre a linket a button.

Un bouton est quelque chose qui, lorsqu'il est cliqué, provoque une action.

Un lien est un bouton qui provoque une modification de la navigation dans le document courant. La navigation qui se produit peut être le déplacement dans le document dans le cas des identificateurs de fragment ( #foo) ou le déplacement vers un nouveau document dans le cas des urls ( /bar).

Les liens étant un type spécial de bouton, leurs actions ont souvent été remplacées pour exécuter des fonctions alternatives. Continuer à utiliser une ancre comme bouton est acceptable du point de vue de la cohérence, bien que ce ne soit pas tout à fait précis sémantiquement.

Si vous êtes préoccupé par la sémantique et l'accessibilité de l'utilisation d'un <a>élément (ou <span>, ou <div>) comme bouton, vous devez ajouter les attributs suivants:

<a role="button" tabindex="0" ...>...</a>

Le rôle de bouton indique à l'utilisateur que l'élément particulier est traité comme un bouton comme un remplacement pour la sémantique que l'élément sous-jacent peut avoir.

Pour les éléments <span>et <div>, vous pouvez ajouter des écouteurs de clé JavaScript pour Spaceou Enterpour déclencher l' clickévénement. <a href>et les <button>éléments le font par défaut, mais pas les éléments sans bouton. Parfois, il est plus logique de lier le clickdéclencheur à une clé différente. Par exemple, un bouton "Aide" dans une application Web peut être lié à F1.

zzzzBov
la source
1
@Zacqary, [role="button"]ne fait rien de concret, vous devez quand même écouter l'événement de clic (mais vous le feriez quand même pour créer un bouton JS). Il est destiné à être utilisé pour la navigation assistée (ou lecteurs d'écran) afin que le lecteur d'écran sache représenter l'élément sous forme de bouton plutôt que sa valeur sémantique d'origine. L'ajout [tabindex]ajoute l'élément à l'ordre de tabulation. Dans des circonstances particulières, vous pourriez ne pas vouloir / avoir besoin du bouton navigable dans l'ordre de tabulation, c'est donc un attribut facultatif. Les éléments qui sont déjà des boutons n'ont pas besoin [role="button"]car ils sont redondants.
zzzzBov
Est-ce du HTML valide d'avoir une balise d'ancrage sans href et sans nom? Dans notre application, nous avons des liens de suppression qui sont désactivés (donc pas d'attribut href), mais toujours affichés à l'utilisateur.
Joshua Muheim
1
@JoshuaMuheim, j'espère que cela ne vous dérange pas, mais j'ai posté votre question en tant que question distincte .
zzzzBov
Je voulais juste ajouter une note que si vous l'utilisez pour créer des `` boutons '' pour les actions javascript ... la suppression complète de l'attribut href entraînera également l'arrêt de Chrome (et probablement d'autres navigateurs) de changer le curseur au passage de la souris. De toute évidence, c'est facile à rajouter avec CSS - mais juste une tête en haut.
Mir du
@Mir, si vous n'utilisez pas [href], vous devriez probablement utiliser un <span>pour le bouton.
zzzzBov
45

Je pense que vous pouvez trouver votre réponse ici: une balise d'ancrage sans l'attribut href est-elle sûre?

De plus, si vous ne voulez pas d'opération de lien avec href, vous pouvez l'utiliser comme:

<a href="javascript:void(0);">something</a>
swati
la source
3
Devrait réellement êtrejavascript:undefined
rybo111
2
@ rybo111 vous avez raison mais je préfère toujours void (0); essentiellement parce que ça a l'air mieux. Je n'aime pas que mes clients voient les choses comme "indéfinies" ;-)
Alex
9
<a href="javascript:;">text</a>?
diynevala
javascript:;utilisé pour casser des choses comme les effets de survol et même les animations gif dans IE6. Et pour aucune opération de lien, il existe des éléments HTML dédiés comme button. Dans le même temps, des éléments tels que les liens AJAX peuvent utiliser leurs hrefs pour des actions de secours si JS échoue.
Ilya Streltsyn
14

Oui, il est valide d'utiliser la balise d'ancrage sans hrefattribut.

Si l' aélément n'a pas d' hrefattribut, alors l'élément représente un espace réservé pour l'endroit où un lien aurait autrement pu être placé, s'il avait été pertinent, constitué uniquement du contenu de l'élément.

Oui, vous pouvez utiliser classet d' autres attributs, mais vous ne pouvez pas utiliser target, download, rel, hreflangettype .

Le target, download, rel, hreflang, et les typeattributs doivent être supprimés si l'attribut href est pas présent.

Quant à la partie « Dois-je? », Voir la première citation: « où un lien aurait pu autrement être placé s'il avait été pertinent ». Je demanderais donc " Si je n'avais pas de JavaScript, est-ce que j'utiliserais cette balise comme lien? " Si la réponse est oui, alors oui, vous devriez utiliser <a>sans href. Si non, je l'utiliserais toujours, car la productivité est plus importante pour moi que la sémantique des cas de pointe, mais ce n'est que mon opinion personnelle.

De plus, vous devez faire attention aux différents comportements et styles (par exemple, pas de soulignement, pas de pointeur, pas de a :link).

Source: recommandation HTML5 du W3C

Tamás Bolvári
la source
Il ne s'agit pas tant de «sémantique de cas de pointe» que d'accessibilité, c'est de s'assurer que les personnes handicapées peuvent utiliser et comprendre le contenu d'un site Web
neiya
3

C'est valable. Vous pouvez, par exemple, l'utiliser pour afficher des modaux (ou des éléments similaires qui répondent à data-toggleet des data-targetattributs).

Quelque chose comme:

<a role="button" data-toggle="modal" data-target=".bs-example-modal-sm" aria-hidden="true"><i class="fa fa-phone"></i></a>

Ici, j'utilise l'icône font-awesome, qui est mieux comme une abalise que comme un button, pour afficher un modal. En outre, le paramètre role="button"transforme le pointeur en un type d'action. Sans l'un hrefou l' autre role="button", le pointeur du curseur ne change pas.

védant
la source
2
Vous devriez utiliser un bouton dans ce cas. C'est plus approprié du point de vue sémantique et accessibilité. Les ancres devraient vous emmener quelque part, pas effectuer une action. Aussi, pourquoi cachez-vous l'ancre entière avec aria-hidden? L'icône, peut-être, mais les utilisateurs de lecteurs d'écran ne devraient pas avoir une expérience diminuée.
isherwood