Angenommen, ich habe diesen HTML-Code:
<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>
und dieses CSS:
li { text-align:center; display:inline-block; padding:0.1em 1em }
img { width:64px; display:block; margin:0 auto }
Das Ergebnis ist hier zu sehen: http://jsfiddle.net/YMN7U/1/
Stellen Sie sich nun vor, ich möchte dies in drei Spalten aufteilen, was einer Injektion <br>
nach der dritten entspricht <li>
. (Eigentlich wäre das semantisch und syntaktisch ungültig.)
Ich weiß, wie man den dritten <li>
in CSS auswählt , aber wie erzwinge ich einen Zeilenumbruch danach? Das funktioniert nicht:
li:nth-child(4):after { content:"xxx"; display:block }
Ich weiß auch, dass dieser spezielle Fall durch Verwenden von float
anstelle von möglich ist inline-block
, aber ich bin nicht an Lösungen interessiert, die verwendenfloat
. Ich weiß auch, dass dies bei Blöcken mit fester Breite möglich ist, indem die Breite des übergeordneten Elements ul
auf etwa das Dreifache dieser Breite eingestellt wird. Diese Lösung interessiert mich nicht. Ich weiß auch, dass ich verwenden könnte, display:table-cell
wenn ich echte Spalten wollte; Diese Lösung interessiert mich nicht. Ich bin an der Möglichkeit interessiert, eine Pause in Inline-Inhalten zu erzwingen.
Bearbeiten : Um klar zu sein, ich interessiere mich für "Theorie", nicht die Lösung für ein bestimmtes Problem. Kann CSS einen Zeilenumbruch in die Mitte von display:inline(-block)?
Elementen einfügen oder ist dies unmöglich? Wenn Sie sicher sind, dass dies unmöglich ist, ist dies eine akzeptable Antwort.
Antworten:
Ich konnte es für Inline-LI-Elemente verwenden. Leider funktioniert es nicht, wenn die LI-Elemente Inline-Block sind:
Live-Demo: http://jsfiddle.net/dWkdp/
Oder die Cliff Notes-Version:
quelle
:after
immer versucht habe, wird als gerader Text gedruckt.\A
ist der Zeilenvorschubcharakter ... es ist eine FluchtSie interessieren sich nicht für viele "Lösungen" für Ihr Problem. Ich glaube nicht, dass es wirklich einen guten Weg gibt, das zu tun, was Sie tun möchten. Alles, was Sie mit
:after
und einfügencontent
hat genau die gleiche syntaktische und semantische Gültigkeit, die es getan hätte, wenn Sie es gerade selbst dort geschrieben hätten.Die Tools CSS bieten Arbeit. Sie sollten einfach das
li
s schweben lassen und dann,clear: left
wenn Sie eine neue Zeile beginnen möchten, wie Sie erwähnt haben:Siehe ein Beispiel: http://jsfiddle.net/marcuswhybrow/YMN7U/5/
quelle
:after
können, ist syntaktisch gültig oder eine gute Idee, da bereits Tools vorhanden sind, um dies zu tun. Daher die Antwort.float: center
.Wenn das Umschreiben des HTML-Codes zulässig ist, können Sie
<ul>
s innerhalb von verschachteln<ul>
und das innere<li>
s einfach als Inline-Block anzeigen lassen . Dies wäre meiner Meinung nach auch semantisch sinnvoll, da sich die Gruppierung auch im HTML widerspiegelt.Demo
quelle
Eine einfache Möglichkeit, Listen in Zeilen aufzuteilen, besteht darin, die einzelnen Listenelemente zu verschieben und dann das Element, das Sie in die nächste Zeile verschieben möchten, zu löschen.
beispielsweise
quelle
float
Einstellung die Einstellung überschreibtinline-block
. Sie koexistieren nicht wirklich zusammenIch weiß, dass Sie keine Floats verwenden wollten und die Frage war nur Theorie, aber falls jemand dies nützlich findet, ist hier eine Lösung mit Floats.
Fügen
li
Sie Ihren Elementen, die Sie schweben möchten, eine Klasse von Links hinzu :und ändern Sie Ihr CSS wie folgt:
http://jsfiddle.net/chut319/xJ3pe/
Sie müssen keine Breiten oder Inline-Blöcke angeben und arbeiten bereits im IE6.
quelle
Ich habe dies erreicht, indem ich einen :: before-Selektor für das erste Inline-Element in der Zeile erstellt und diesen Selektor zu einem Block mit einem oberen oder unteren Rand gemacht habe, um die Zeilen ein wenig zu trennen.
quelle
Beachten Sie, dass dies funktioniert, je nachdem, wie Sie die Seite rendern. Aber wie wäre es einfach mit dem Starten einer neuen ungeordneten Liste?
dh
quelle
Eine bessere Lösung ist die Verwendung von -webkit-Spalten: 2;
http://jsfiddle.net/YMN7U/889/
quelle
Vielleicht ist es nur mit CSS völlig möglich, aber ich ziehe es vor, "float" so weit wie möglich zu vermeiden, weil es die Größe der Eltern beeinträchtigt.
Wenn Sie jQuery verwenden, können Sie ein einfaches "wrapN" -Plugin erstellen, das "wrapAll" ähnelt, außer dass es nur "N" -Elemente umschließt und dann die nächsten "N" -Elemente mit einer Schleife bricht und umschließt. Setzen Sie dann Ihre Wrapper-Klasse auf `display: block;`.
Hier ist eine JSFiddle des fertigen Produkts:
http://jsfiddle.net/dustinpoissant/L79ahLoz/
quelle