He estado usando Twitter Bootstrap para construir un sitio, y gran parte de su funcionalidad depende de envolver las cosas <a>
, incluso si solo van a ejecutar Javascript. He tenido problemas con la href="#"
táctica que recomienda la documentación de Bootstrap, así que estaba tratando de encontrar una solución diferente.
Pero luego intenté simplemente eliminar el href
atributo por completo. He estado usando <a class='bunch of classes' data-whatever='data'>
, y tener Javascript maneja el resto. Y funciona.
Sin embargo, algo me dice que no debería estar haciendo esto. ¿Correcto? Quiero decir, técnicamente <a>
se supone que es un enlace a algo, pero no estoy completamente seguro de por qué esto es un problema. ¿O es eso?
html
anchor
semantic-markup
htmlbutton
Zacqary
fuente
fuente
Respuestas:
El
<a>
elemento nchor es simplemente un ancla hacia o desde algún contenido. Originalmente, la especificación HTML permitía anclajes con nombre (<a name="foo">
) y anclajes vinculados (<a href="#foo">
).El formato de anclaje con nombre se usa con menos frecuencia, ya que el identificador de fragmentos ahora se usa para especificar un
[id]
atributo (aunque para la compatibilidad con versiones anteriores todavía puede especificar[name]
atributos). Un<a>
elemento sin[href]
atributo sigue siendo válido .En lo que respecta a la semántica y el estilo, el
<a>
elemento no es un enlace (:link
) a menos que tenga un[href]
atributo. Un efecto secundario de esto es que un<a>
elemento sin[href]
no estará en el orden de tabulación por defecto.La verdadera pregunta es si el
<a>
elemento solo es una representación apropiada de a<button>
. En un nivel semántico, hay una clara diferencia entre alink
y abutton
.Un botón es algo que cuando se hace clic hace que ocurra una acción.
Un enlace es un botón que provoca un cambio en la navegación en el documento actual. La navegación que se produce podría moverse dentro del documento en el caso de identificadores de fragmentos (
#foo
) o moverse a un nuevo documento en el caso de urls (/bar
).Como los enlaces son un tipo especial de botón, a menudo se han anulado sus acciones para realizar funciones alternativas. Continuar usando un ancla como botón está bien desde el punto de vista de la consistencia, aunque no es semánticamente bastante preciso.
Si le preocupa la semántica y la accesibilidad del uso de un
<a>
elemento (o<span>
, o<div>
) como botón, debe agregar los siguientes atributos:La función del botón le dice al usuario que el elemento en particular se está tratando como un botón como una anulación para cualquier semántica que pueda haber tenido el elemento subyacente.
Para
<span>
y<div>
elementos, es posible que desee agregar oyentes clave de JavaScript para Spaceo Enterpara activar elclick
evento.<a href>
y los<button>
elementos hacen esto de manera predeterminada, pero los elementos que no son botones no lo hacen. A veces tiene más sentido vincular elclick
gatillo a una tecla diferente. Por ejemplo, un botón de "ayuda" en una aplicación web podría estar vinculado F1.fuente
[role="button"]
no hace nada concreto, aún necesita escuchar el evento de clic (pero lo haría de todos modos para hacer un botón JS). Está destinado a ser utilizado para la navegación asistida (también conocido como lectores de pantalla) para que el lector de pantalla sepa representar el elemento como un botón en lugar de su valor semántico original. Agregar[tabindex]
agrega el elemento al orden de tabulación. En circunstancias especiales, es posible que no desee / necesite el botón navegable en el orden de tabulación, por lo que es un atributo opcional. Los elementos que ya son botones no necesitan,[role="button"]
ya que es redundante.[href]
, probablemente deberías estar usando a<span>
para el botón.Creo que puede encontrar su respuesta aquí: ¿Es segura una etiqueta de anclaje sin el atributo href?
Además, si no desea ninguna operación de enlace con href, puede usarlo como:
fuente
javascript:undefined
<a href="javascript:;">text</a>
?javascript:;
solía romper cosas como efectos de rollover e incluso animaciones gif en IE6. Y para ninguna operación de enlace hay elementos HTML dedicados comobutton
. Al mismo tiempo, cosas como los enlaces AJAX pueden usar sushref
s para acciones de reserva si JS falla.Sí, es válido usar la etiqueta de anclaje sin un
href
atributo.Sí, puede utilizar
class
y otros atributos, pero no se puede utilizartarget
,download
,rel
,hreflang
, ytype
.En cuanto a la parte " ¿Debería? ", Vea la primera cita: " donde de otro modo se podría haber colocado un enlace si hubiera sido relevante ". Entonces preguntaría " Si no tuviera JavaScript, ¿usaría esta etiqueta como un enlace? ". Si la respuesta es sí, entonces sí, debe usar
<a>
sinhref
. Si no, entonces aún lo usaría, porque la productividad es más importante para mí que la semántica de los casos límite, pero esta es solo mi opinión personal.Además, debe tener cuidado con diferentes comportamientos y estilos (por ejemplo, sin subrayado, sin puntero, no a
:link
).Fuente: Recomendación HTML5 W3C
fuente
Es válido. Puede, por ejemplo, usarlo para mostrar modales (o cosas similares que responden
data-toggle
ydata-target
atributos).Algo como:
Aquí uso el ícono de font-awesome, que es mejor como
a
etiqueta en lugar de comobutton
, para mostrar un modal. Además, la configuraciónrole="button"
hace que el puntero cambie a un tipo de acción. Sinhref
orole="button"
, el puntero del cursor no cambia.fuente
aria-hidden
? El icono, tal vez, pero los usuarios de lectores de pantalla no deberían tener una experiencia disminuida.