Disons que j'ai ce HTML:
<h3>Features</h3>
<ul>
<li><img src="alphaball.png">Smells Good</li>
<li><img src="alphaball.png">Tastes Great</li>
<li><img src="alphaball.png">Delicious</li>
<li><img src="alphaball.png">Wholesome</li>
<li><img src="alphaball.png">Eats Children</li>
<li><img src="alphaball.png">Yo' Mama</li>
</ul>
et ce CSS:
li { text-align:center; display:inline-block; padding:0.1em 1em }
img { width:64px; display:block; margin:0 auto }
Le résultat peut être vu ici: http://jsfiddle.net/YMN7U/1/
Imaginez maintenant que je veux diviser cela en trois colonnes, l'équivalent d'injecter un <br>
après le troisième <li>
. (En fait, cela serait invalide sémantiquement et syntaxiquement.)
Je sais comment sélectionner le troisième <li>
en CSS, mais comment puis-je forcer un saut de ligne après lui? Cela ne fonctionne pas:
li:nth-child(4):after { content:"xxx"; display:block }
Je sais également que ce cas particulier est possible en utilisant float
au lieu de inline-block
, mais je ne suis pas intéressé par les solutions en utilisant float
. Je sais également qu'avec des blocs à largeur fixe, cela est possible en définissant la largeur sur le parent ul
à environ 3 fois cette largeur; Je ne suis pas intéressé par cette solution. Je sais aussi que je pourrais utiliser display:table-cell
si je voulais de vraies colonnes; Je ne suis pas intéressé par cette solution. Je suis intéressé par la possibilité de forcer une rupture dans le contenu en ligne.
Edit : Pour être clair, je m'intéresse à la «théorie», pas à la solution à un problème particulier. Le CSS peut-il injecter un saut de ligne au milieu des display:inline(-block)?
éléments, ou est-ce impossible? Si vous êtes certain que c'est impossible, c'est une réponse acceptable.
Réponses:
J'ai pu le faire fonctionner sur des éléments LI en ligne. Malheureusement, cela ne fonctionne pas si les éléments LI sont en bloc:
Démo en direct: http://jsfiddle.net/dWkdp/
Ou la version des notes de falaise:
la source
:after
toujours imprime en texte simple.\A
est le personnage de saut de ligne ... c'est une évasionVous n'êtes pas intéressé par beaucoup de "solutions" à votre problème. Je ne pense pas qu'il existe vraiment un bon moyen de faire ce que vous voulez faire. Tout ce que vous insérez en utilisant
:after
etcontent
a exactement la même validité syntaxique et sémantique qu'il l'aurait fait si vous l'aviez écrit vous-même.Les outils CSS fournissent du travail. Vous devez simplement faire flotter le
li
s puisclear: left
lorsque vous voulez commencer une nouvelle ligne, comme vous l'avez mentionné:Voir un exemple: http://jsfiddle.net/marcuswhybrow/YMN7U/5/
la source
:after
ne sera syntaxiquement valide ou une bonne idée, car il existe déjà des outils pour le faire. D'où la réponse.float: center
.Lorsque la réécriture du code HTML est autorisée, vous pouvez imbriquer les
<ul>
s dans le<ul>
et laisser les<li>
s intérieurs s'afficher sous forme de bloc en ligne. Cela aurait également un sens sémantique à mon humble avis, car le regroupement est également reflété dans le html.Démo
la source
Un moyen simple de fractionner des listes en lignes consiste à faire flotter les éléments de liste individuels, puis l'élément que vous souhaitez atteindre à la ligne suivante, vous pouvez effacer le flottant.
par exemple
la source
float
paramètre remplace leinline-block
paramètre. Ils ne coexistent pas vraiment ensembleJe sais que vous ne vouliez pas utiliser de flotteurs et la question n'était qu'une théorie, mais au cas où quelqu'un trouverait cela utile, voici une solution utilisant des flotteurs.
Ajoutez une classe de gauche à vos
li
éléments que vous souhaitez faire flotter:et modifiez votre CSS comme suit:
http://jsfiddle.net/chut319/xJ3pe/
Vous n'avez pas besoin de spécifier des largeurs ou des blocs en ligne et cela remonte à IE6.
la source
J'ai accompli cela en créant un sélecteur :: before pour le premier élément en ligne de la ligne, et en faisant de ce sélecteur un bloc avec une marge supérieure ou inférieure pour séparer un peu les lignes.
la source
Notez que cela fonctionnera, selon la façon dont vous rendez la page. Mais que diriez-vous de commencer une nouvelle liste non ordonnée?
c'est à dire
la source
Une meilleure solution consiste à utiliser -webkit-columns: 2;
http://jsfiddle.net/YMN7U/889/
la source
Peut-être que c'est complètement possible avec seulement CSS mais je préfère éviter de "flotter" autant que possible car cela interfère avec la hauteur de son parent.
Si vous utilisez jQuery, vous pouvez créer un simple plugin `wrapN` qui est similaire à` wrapAll` sauf qu'il enveloppe uniquement les éléments "N", puis rompt et encapsule les éléments "N" suivants à l'aide d'une boucle. Ensuite, définissez votre classe wrappers sur `display: block;`.
Voici un JSFiddle du produit fini:
http://jsfiddle.net/dustinpoissant/L79ahLoz/
la source