Powiedzmy, że mam ten kod 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>
i ten CSS:
li { text-align:center; display:inline-block; padding:0.1em 1em }
img { width:64px; display:block; margin:0 auto }
Wynik można zobaczyć tutaj: http://jsfiddle.net/YMN7U/1/
Teraz wyobraź sobie, że chcę rozbić to na trzy kolumny, co odpowiada wstrzyknięciu <br>
po trzeciej <li>
. (W rzeczywistości byłoby to nieprawidłowe semantycznie i składniowo).
Wiem, jak wybrać trzeci <li>
w CSS, ale jak wymusić przerwanie linii po nim? To nie działa:
li:nth-child(4):after { content:"xxx"; display:block }
Wiem też, że ten konkretny przypadek jest możliwy przy użyciu float
zamiast inline-block
, ale nie interesują mnie rozwiązania float
. Wiem również, że w przypadku bloków o stałej szerokości jest to możliwe poprzez ustawienie szerokości nadrzędnej ul
na około 3x tę szerokość; Nie jestem zainteresowany tym rozwiązaniem. Wiem też, że mógłbym użyć, display:table-cell
gdybym chciał prawdziwych kolumn; Nie jestem zainteresowany tym rozwiązaniem. Interesuje mnie możliwość wymuszenia przerwy w treści wbudowanej.
Edycja : Dla jasności interesuje mnie „teoria”, a nie rozwiązanie konkretnego problemu. Czy CSS może wprowadzić przerwanie linii pośrodku display:inline(-block)?
elementów, czy jest to niemożliwe? Jeśli masz pewność, że jest to niemożliwe, jest to akceptowalna odpowiedź.
Odpowiedzi:
Udało mi się sprawić, że będzie działać na elementach wbudowanych LI. Niestety nie działa, jeśli elementy LI są wbudowane w blok:
Demo na żywo: http://jsfiddle.net/dWkdp/
Lub wersja z notatkami na klifie:
źródło
:after
zawsze drukuje jako zwykły tekst.\A
to znak kanału ... to ucieczkaNie interesuje Cię wiele „rozwiązań” swojego problemu. Nie sądzę, aby naprawdę był dobry sposób na robienie tego, co chcesz. Cokolwiek wstawisz za pomocą
:after
icontent
ma dokładnie taką samą poprawność składniową i semantyczną, co zrobiłby, gdybyś sam to tam napisał.Narzędzia CSS zapewniają pracę. Powinieneś po prostu przesunąć
li
s, a następnie,clear: left
kiedy chcesz rozpocząć nową linię, jak już wspomniałeś:Zobacz przykład: http://jsfiddle.net/marcuswhybrow/YMN7U/5/
źródło
:after
będzie poprawne pod względem składniowym lub dobrym pomysłem, ponieważ istnieją już narzędzia do tego. Stąd odpowiedź.float: center
.Gdy przepisywanie html jest dozwolone, możesz zagnieździć
<ul>
s wewnątrz<ul>
i po prostu pozwolić wewnętrznemu<li>
s wyświetlać się jako blok wbudowany. Miałoby to również semantyczny sens w przypadku IMHO, ponieważ grupowanie jest również odzwierciedlane w pliku HTML.Próbny
źródło
Łatwym sposobem podziału list na wiersze jest przestawienie poszczególnych pozycji listy, a następnie element, który chcesz przejść do następnego wiersza, możesz wyczyścić pływak.
na przykład
źródło
float
ustawienie zastępujeinline-block
ustawienie. Tak naprawdę nie współistnieją razemWiem, że nie chciałeś używać pływaków, a pytanie było tylko teorią, ale na wypadek gdyby ktoś uznał to za przydatne, oto rozwiązanie wykorzystujące pływaki.
Dodaj klasę left do
li
elementów, które chcesz unosić:i zmień swój CSS w następujący sposób:
http://jsfiddle.net/chut319/xJ3pe/
Nie musisz określać szerokości ani bloków śródliniowych i działa już w IE6.
źródło
Osiągnąłem to, tworząc selektor :: before dla pierwszego elementu śródrzędnego w wierszu i tworząc selektor bloku z górnym lub dolnym marginesem, aby nieco oddzielić rzędy.
źródło
Pamiętaj, że to zadziała, w zależności od sposobu renderowania strony. Ale co powiesz na rozpoczęcie nowej, nieuporządkowanej listy?
to znaczy
źródło
Lepszym rozwiązaniem jest użycie -webkit-columns: 2;
http://jsfiddle.net/YMN7U/889/
źródło
Być może jest to całkowicie możliwe tylko z CSS, ale wolę unikać „unosić się” tak bardzo, jak to możliwe, ponieważ przeszkadza to wysokości jego rodzica.
Jeśli używasz jQuery, możesz stworzyć prostą wtyczkę `wrapN`, która jest podobna do` wrapAll` oprócz tego, że otacza tylko elementy „N”, a następnie łamie i otacza kolejne elementy „N” za pomocą pętli. Następnie ustaw swoją klasę opakowań na `display: block;`.
Oto JSFiddle gotowego produktu:
http://jsfiddle.net/dustinpoissant/L79ahLoz/
źródło