¿Hay una mejor práctica en relación con la anidación de label
y input
elementos HTML?
forma clásica:
<label for="myinput">My Text</label>
<input type="text" id="myinput" />
o
<label for="myinput">My Text
<input type="text" id="myinput" />
</label>
<input />
interior<label>
es que puede omitirfor
yid
:<label>My text <input /></label>
en su ejemplo. Mucho mejor!input
no pertenece semánticamente dentro de unlabel
, noté hoy que los desarrolladores de Bootstrap no están de acuerdo conmigo . Algunos elementos, como las casillas de verificación en línea, tienen un estilo diferente dependiendo de siinput
está dentro o fuera.<label for="id">
ya que tengo varios formularios en la página y no puedo usar elid
atributo para muchos widgets sin caer en launique id per page
trampa. La única forma aceptable de acceder al widget es medianteform + widget_name
.Respuestas:
Desde w3: la etiqueta puede colocarse antes, después o alrededor del control asociado.
o
o
Tenga en cuenta que la tercera técnica no se puede usar cuando se usa una tabla para el diseño, con la etiqueta en una celda y su campo de formulario asociado en otra celda.
Cualquiera de los dos es válido. Me gusta usar el primer o segundo ejemplo, ya que te da más control de estilo.
fuente
<label for="inputbox"><input id="inputbox" type="text" /></label>
es un pase de acuerdo a sus criterios.return false;
al final del controlador, pero si posiblemente tiene otros controladores que necesitan ejecutarse después, y detener la propagación no es una opción, esto se convierte en un problema.yo prefiero
terminado
Principalmente porque hace que el HTML sea más legible. Y realmente creo que mi primer ejemplo es más fácil de diseñar con CSS, ya que CSS funciona muy bien con elementos anidados.
Pero es cuestión de gustos, supongo.
Si necesita más opciones de estilo, agregue una etiqueta span.
El código todavía se ve mejor en mi opinión.
fuente
<label>Expires after <input name="exp" /> days</label>
(la etiqueta es antes y después del elemento de entrada)div
,li
¿o no?firstname
debe seguir la etiquetafirstname
, pero los navegadores necesitan la declaración. Todo es cuestión de gustos y lo que USTED cree que se ve mejor (y es más fácil de depurar) en su código. Prefiero usar anidado ahora, aunque me tomó un tiempo acostumbrarme.Si incluye la etiqueta de entrada en la etiqueta de la etiqueta, no necesita usar el atributo 'for'.
Dicho esto, no me gusta incluir la etiqueta de entrada en mis etiquetas porque creo que son entidades separadas, que no contienen.
fuente
Diferencia de comportamiento: hacer clic en el espacio entre la etiqueta y la entrada
Si hace clic en el espacio entre la etiqueta y la entrada, se activa la entrada solo si la etiqueta contiene la entrada.
Esto tiene sentido ya que en este caso el espacio es solo otro carácter de la etiqueta.
Poder hacer clic entre la etiqueta y el cuadro significa que es:
Los ejemplos de la casilla de verificación Bootstrap v3.3 usan la entrada que se encuentra en el interior: http://getbootstrap.com/css/#forms Puede ser prudente seguirlos. Pero cambiaron de opinión en v4.0 https://getbootstrap.com/docs/4.0/components/forms/#checkboxes-and-radios, así que ya no sé lo que es sabio:
Pregunta de UX que analiza este punto en detalle: /ux/23552/should-the-space-between-the-checkbox-and-label-be-clickable
fuente
margin
de la casilla de verificación. El comportamiento de Firefox en su ejemplo es peculiar y parece un error. Alabel
contendrá los espacios o el relleno alrededor del contenido en línea como cliqueable. Pero dado que el modelo de contenido de una etiqueta está en línea / redactando contenido, el margen de entrada no debe ser cliqueable, a menos que su etiqueta esté hecha,display: block
en cuyo caso el interior de la etiquetablock
se puede hacer clic en todos los navegadores.Personalmente, me gusta mantener la etiqueta afuera, como en tu segundo ejemplo. Es por eso que el atributo FOR está ahí. La razón es que a menudo aplicaré estilos a la etiqueta, como un ancho, para que el formulario se vea bien (abreviatura a continuación):
Lo hace para poder evitar las tablas y toda esa basura en mis formularios.
fuente
<br />
para separar las entradas?<label> <span>My text</span> <input /> </label>
usted tiene todas las opciones de estilo que necesitaría (alguna vez).Consulte http://www.w3.org/TR/html401/interact/forms.html#h-17.9 para ver las recomendaciones de W3.
Dicen que se puede hacer de cualquier manera. Describen los dos métodos como explícito (usando "for" con la identificación del elemento) e implícito (incrustando el elemento en la etiqueta):
Explícito:
Implícito:
fuente
Ambos son correctos, pero poner la entrada dentro de la etiqueta hace que sea mucho menos flexible al diseñar con CSS.
Primero, a
<label>
está restringido en qué elementos puede contener . Por ejemplo, solo puede poner un<div>
entre el<input>
texto de la etiqueta y, si<input>
no está dentro del<label>
.En segundo lugar, si bien existen soluciones alternativas para facilitar el estilo, como ajustar el texto de la etiqueta interna con un espacio, algunos estilos se heredarán de los elementos principales, lo que puede hacer que el estilo sea más complicado.
fuente
Un 'gotcha' notable indica que nunca debe incluir más de un elemento de entrada dentro de un elemento <label> con un atributo explícito "for", por ejemplo:
Si bien esto puede ser tentador para las características de formulario en las que un valor de texto personalizado es secundario a un botón de opción o casilla de verificación, la funcionalidad de enfoque de clic del elemento de etiqueta arrojará inmediatamente el foco al elemento cuya identificación se define explícitamente en su atributo 'for' , lo que hace casi imposible que el usuario haga clic en el campo de texto contenido para ingresar un valor.
Personalmente, trato de evitar elementos de etiqueta con elementos secundarios de entrada. Parece semánticamente inapropiado que un elemento de etiqueta abarque más que la etiqueta misma. Si está anidando entradas en etiquetas para lograr una cierta estética, debería usar CSS en su lugar.
fuente
for
... y si desea usarfor
, entonces tener el control dentro de la etiqueta no tiene mucho sentido .Como la mayoría de la gente ha dicho, ambas formas funcionan, pero creo que solo la primera debería. Siendo semánticamente estricto, la etiqueta no "contiene" la entrada. En mi opinión, la relación de contención (padre / hijo) en la estructura de marcado debe reflejar la contención en la salida visual . es decir, un elemento que rodea a otro en el marcado debe dibujarse alrededor de ese en el navegador . De acuerdo con esto, la etiqueta debe ser el hermano de la entrada, no su padre. Entonces la opción número dos es arbitraria y confusa. Todos los que hayan leído el Zen de Python probablemente estarán de acuerdo (Flat es mejor que anidado, Sparse es mejor que denso, debería haber una, y preferiblemente solo una, forma obvia de hacerlo ...).
Debido a decisiones como esa del W3C y de los principales proveedores de navegadores (permitiendo "la forma que prefieras", en lugar de "hacerlo de la manera correcta") es que la web está tan desordenada hoy y los desarrolladores tenemos que lidiar con problemas y un código heredado tan diverso.
fuente
Normalmente voy con las dos primeras opciones. He visto un escenario en el que se usaba la tercera opción, cuando las opciones de radio estaban incrustadas en etiquetas y el CSS contenía algo como
para asegurar una alineación vertical adecuada para las radios.
fuente
En referencia al WHATWG ( Escritura de la interfaz de usuario de un formulario ), no está mal poner el campo de entrada dentro de la etiqueta. Esto le ahorra código porque el
for
atributo dellabel
ya no es necesario.fuente
Prefiero encapsular elementos dentro de mi
<label>
porque no tengo que generar los identificadores.Soy un desarrollador de Javascript, y React o Angular se utilizan para generar componentes que pueden ser reutilizados por mí u otros. Entonces sería fácil duplicar una identificación en la página, lo que llevaría a comportamientos extraños.
fuente
Una cosa que debe considerar es la interacción de las casillas de verificación y las entradas de radio con javascript.
Usando la siguiente estructura:
Cuando el usuario hace clic en "Etiqueta de texto", la función controlCheckbox () se activará una vez.
Pero cuando se hace clic en la etiqueta de entrada, la función controlCheckbox () puede activarse dos veces en algunos navegadores más antiguos. Esto se debe a que las etiquetas de entrada y etiqueta activan el evento onclick adjunto a la casilla de verificación.
Entonces puede tener algunos errores en su casilla de verificación Estado.
Me he encontrado con este problema últimamente en IE11. No estoy seguro si los navegadores modernos tienen problemas con esta estructura.
fuente
La principal ventaja de colocar
input
dentrolabel
es la eficiencia de escritura para humanos y el almacenamiento de bytes para computadoras.@ Znarkus dijo en su comentario al OP:
Nota: En el código @Znarknus, se incluyó otra eficiencia que no se indicó explícitamente en el comentario.
type="text"
también se puede omitir yinput
mostrará un cuadro de texto de forma predeterminada.Una comparación lado a lado de las pulsaciones de teclas y bytes [1].
31 pulsaciones de teclas, 31 bytes
58 pulsaciones de teclas, 58 bytes
De lo contrario, los fragmentos son visualmente iguales y ofrecen el mismo nivel de accesibilidad del usuario. Un usuario puede hacer clic o tocar la etiqueta para colocar el cursor en el cuadro de texto.
[1] Archivos de texto (.txt) creados en el Bloc de notas en Windows, bytes de las propiedades del Explorador de archivos de Windows
fuente