Meilleur moyen de mise en page dans les formulaires HTML?
Je veux afficher un formulaire HTML contenant étiqueté champs de texte, comme ceci:
Prénom: [_____________] Nom De Famille: [_____________] Date de Naissance: [________]
Mon approche évidente est d'utiliser un <TABLE>
et il suffit de placer les étiquettes et les champs de texte dans les cellules, mais est-il une meilleure façon de faire, par exemple, une fonction de CSS approche?
EDIT:
- Je suis à la recherche d'une manière qui réduit le niveau de verbosité dans le fichier HTML.
- Et oui, je suis à la recherche pour le redimensionnement automatique des étiquettes. Voir un liés à la question sur les étiquettes d'emballage
Vous devez vous connecter pour publier un commentaire.
Si vous avez besoin d'étiquettes à gauche des champs comme ça, juste aller de l'avant et à l'utilisation d'une table. Non seulement les tables de dégrader parfaitement sur les navigateurs plus anciens, mais ils automatique de la taille de la colonne d'étiquettes pour le texte en eux (en supposant que vous utilisez
white-space: no-wrap
sur les cellules contenant les étiquettes et/ou — et cela est vrai de l'hérésie — le bon vieuxnowrap
attribut sur lath
tag), ils manipulent des faits assez étroit bien, et ils sont faciles. Faire de chaque cellule de l'étiquette d'un en-tête et de chaque champ de la cellule une cellule normale. Et c'est une douleur, mais assurez-vous que les étiquettes sont vraimentlabel
s et des liens vers leurs champs, parce que les questions d'accessibilité, même si (et peut-être surtout si vous êtes en utilisant une table non sémantiquement.J'aimerais beaucoup entendre parler de CSS solutions que la détection automatique de la taille de l'étiquette de colonnes, la poignée étant étroit bien, et n'impliquent pas de 18 hacks pour faire face à des incohérences dans les navigateurs. Je serais ravi de les voir. Mais chaque fois que j'ai regardé (et qui est plusieurs), c'est encore un écart. Un vide qu'il faut remplir, IMV, afin que nous puissions arrêter de faire cela sans porter de hairshirts.
Pour tous ceux qui lisent, qui n'est pas besoin de les étiquettes à gauche comme ça, découvrez jball réponse pour une bonne recherche, sémantique alternative.
<table/>
s, c'est de cesser d'utiliser<table/>
s à rendre des mises en page tabulaire. Mais si vous êtes réellement rendu d'une table... utiliser un<table/>
! C'est le point de vue sémantique, le bon choix.th
contenus (dire) "prénom:" et autd
contenus "Sam", la ligne suivante estth
était "nom:", et a été suivi partd
= "Samson", qui serait tablular de données. Alors pourquoi n'est-il pas de tableaux de données si le "Sam" et "Samson" sont des champs? C'est une question intéressante...En termes de facilité d'utilisation et si l'espace vertical est pas un facteur limitant, une liste de champs avec l'étiquette au-dessus de chaque champ est le moyen le plus rapide pour lire et remplir, et peut être fait en terme d'esthétisme. Voir de nombreuses études d'utilisabilité sur le web pour plus d'info, par exemple. http://www.lukew.com/resources/articles/web_forms.html
Je voudrais utiliser les listes de définition (
<dl>
) ils ont tendance à être sémantiquement correct.Une étiquette est définie par une saisie de l'utilisateur. Il n'a de sens pour moi.
<dl>
exprime la sémantique du contenu avec plus de précision que d'une table.Voici un exemple
Par la façon dont ils se dégrader gracieusement dans tous les navigateurs, même à base de texte.
display: inline-block
faire le tour de redimensionnement automatique ?width:33%
, pas ladisplay: inline-block
(bien que vous le faites aussi besoin que avecdt
s pour cette). Cela signifie que ledt
s seront tous au moins 33% du conteneur, mais une longue label serait plus, résultant en quinconce look. Peut-être pas une grosse affaire quand vous avez fait les étiquettes, grand (~17% de la largeur de la fenêtre du navigateur), mais vous n'avez pas l'habitude d'avoir beaucoup d'espace pour travailler avec.Je pense que quelque chose comme cela, c'est ce que je fais, mais aussi de ne pas autosize à la longueur du texte, mais c'est plus propre à mon avis
clear:both
pour l'étiquette etdisplay: block
pour les deuxlabel
etinput
.L'article est un peu vieux, mais j'ai toujours trouvé une liste à part les conseils pour être solide: (si vous ne voulez vous débarrasser de vos tables)
http://www.alistapart.com/articles/prettyaccessibleforms/
CSS Tableau d'Affichage
À partir de IE8+ vous pouvez utiliser les CSS Tableau d'Affichage pour cette:
Utiliser un framework CSS comme Plan et de l'utiliser pour le style de l'formes.
Une autre astuce serait de créer virual "colonnes" avec les css et les faire flotter à côté de l'autre. Les étiquettes dans une colonne et les entrées dans l'autre. Mettre (deux colonnes) dans un div avec une assez grande largeur et flotter les colonnes de l'opposé de ce que vous souhaitez aligner.
Voici un code (parce que je suis entrain de créer un formulaire) que sera de travail pour les formes de base. La seule contrainte est la grande marge de droite sur les intrants.
Et la mise en page comme
Sur le dessus de cette petite, de justesse code écrit, il y a un intégralité de l'article liées à la création de tableless formes en CSS.
En général, j'ai trouvé qu'il y a au moins certains problèmes lorsque vous n'utilisez pas de Tables pour les formulaires. Le général des choses que je n'ai pas été en mesure de résoudre:
J'ai peut-être manqué quelques choses, mais le plus flexible mark-up si vous êtes en utilisant le CSS est comme ci-dessous:
Vous avez des questions, si vous souhaitez que plusieurs champs par section de l'étiquette, de sorte que vous avez à introduire un autre div pour contenir les entrées (pour permettre à l'étiquette continuent de flotter à gauche etc):
Avec la marque ci-dessus, vous pouvez obtenir une très grande flexibilité des formes, je ne vais pas poster le CSS car il est très similaire à un 2 Colonnes de Mise en page.
J'ai encore besoin de s'asseoir et essayer de comprendre si pur CSS les formulaires sont viables pour toutes les occasions mais tbh il est très peu probable!
Formes sont la pire chose pour un style à l'aide de CSS. La seule grande Croix Navigateur problèmes que j'ai eu sont quand à la coiffure de la FieldSet et Legend éléments. Pas de réel hacks, mais ils prennent un peu de travail pour bien paraître.
Un problème avec les tables de la bug espace. Lorsque vous n'utilisez pas de tables, vous pouvez écrire votre étiquette et entrée comme ceci:
qui encapsule l'entrée et de l'étiquette.
Dans un tableau, sur l'autre main, vous êtes de ceux qui sont séparés:
Cela signifie que la zone entre le </label> et le <input/> ne répond pas aux clics de la souris.
C'est pas trop mal avec plaine de champs, c'est vraiment ennuyeux avec des boutons radio et des cases à cocher si (ou peut-être que je vais être super pointilleux.)
Maintenant, pour répondre à votre question: je ne pense pas qu'il y est une bonne façon de faire de la mise en forme d'une colonne dans le CSS (à moins que la largeur de la colonne est connu--vous pourriez obtenir que feat avec JavaScript...) Afin de T. J. Crowder a certainement une excellente réponse.
Cependant, il y a un argument pour le CSS (et forcé de largeur) que dans un cas, j'ai créé une très grande forme qui a couvert la totalité de l'écran. Tous les champs apparaissent dans un seul écran (Que le client voulait) et le CMS n'a pas de sortie d'une table. Mais même si, une table aurait été un cauchemar, tout simplement parce que tous les champs ont été pendant de nombreuses placé en non-alignés en colonnes. Qu'il serait assez difficile avec une table (beaucoup de rowspan à l'aide de la table comme une grille qui seraient un tableau pour la mise en page!).
Mise à jour:
Comme par commentaire ci-dessous, singe31 dit que
<input/>
ne peut pas être définie à l'intérieur de la<label>
tag. Ce qui est faux. Le DTD HTML 4.01 est facile à lire et nous voyons que:Donc, en d'autres termes, une
<input/>
peuvent apparaître dans un<label>
tag. Il est parfaitement légal.HTML 5 montre clairement que c'est légal dans la documentation sur le w3c ici:
http://www.w3.org/html/wg/drafts/html/master/forms.html#the-label-element
Descendez un peu jusqu'à la "Exemple de Code" et vous voyez:
<input>
ne devrait pas être dans le<label>
au premier abord. Avant ou après, jamais à l'intérieur