Mam pojemnik na płyn DIV.
W tym mam 4 DIV-y wszystkie 300px x 250px ...
<div id="container">
<div class="box1"> </div>
<div class="box2"> </div>
<div class="box3"> </div>
<div class="box4"> </div>
</div>
To, co chcę się wydarzyć, to przesunięcie pola 1 w lewo, pola 4 w prawo i pola 2 i 3 w równych odstępach między nimi. Chcę, aby odstępy były płynne, więc ponieważ przeglądarka jest mniejsza, przestrzeń staje się również mniejsza.
html
css
fluid-layout
Lee Price
źródło
źródło
display:inline-block;
zamiast float?inline-block
nainline
elementachOdpowiedzi:
Zobacz: http://jsfiddle.net/thirtydot/EDp8R/
text-align: justify
w połączeniu z.stretch
tym, co obsługuje pozycjonowanie.display:inline-block; *display:inline; zoom:1
poprawkiinline-block
dla IE6 / 7, patrz tutaj .font-size: 0; line-height: 0
naprawia drobny problem w IE6.Dodatkową
span
(.stretch
) można zastąpić:after
.To nadal działa we wszystkich tych samych przeglądarkach, co powyższe rozwiązanie.
:after
nie działa w IE6 / 7, ale i tak używajądistribute-all-lines
, więc to nie ma znaczenia.Zobacz: http://jsfiddle.net/thirtydot/EDp8R/3/
Ma to niewielką wadę
:after
: aby ostatni wiersz działał idealnie w Safari, musisz uważać na białe znaki w HTML.W szczególności to nie działa:
I to robi:
Możesz użyć tego dla dowolnej liczby dzieci
div
bez dodawaniaboxN
klasy do każdego przez zmianędo
Spowoduje to wybranie dowolnego div, który jest pierwszym dzieckiem
#container
div, i żadnych innych poniżej. Aby uogólnić kolory tła, możesz użyć selektora n-tego rzędu CSS3 , chociaż jest on obsługiwany tylko w IE9 + i innych nowoczesnych przeglądarkach:staje się:
Zobacz tutaj przykład jsfiddle.
źródło
<div/><div/><div/>
to nie działa. Musisz mieć<div/> <div/> <div/>
.justify
nad takim przypadkiem, ale dziękuję za dostarczenie działającego rozwiązania. zaoszczędziło mi wielu eksperymentów (pomimo debugowania przez 3 godziny: D). Ponadto mogę dodać notatkę, że jeśli chcesz, aby twój ostatni rząd był wyrównany do lewej, powinieneś dodać dodatkowe niewidoczne pola (aby uzupełnić rząd).stretch
/:after
jest potrzebne, ponieważ (zazwyczaj) z tekstem wyrównanym ostatni wiersz nie jest uzasadniony . Chcemy tutaj, aby ostatnia linia była uzasadniona, stąd potrzeba:after
. Co do twojego drugiego pytania, zbadałem to jakiś czas temu w poprzedniej odpowiedzi . W tej odpowiedzi wymagany był JavaScript. Jeśli potrzebujesz obsługi starszych przeglądarek (IE8), uważam, że potrzebujesz JavaScript.Najłatwiejszym sposobem na zrobienie tego jest teraz Flexbox:
http://css-tricks.com/snippets/css/a-guide-to-flexbox/
CSS jest wtedy po prostu:
demo: http://jsfiddle.net/QPrk3/
Jest to jednak obecnie obsługiwane tylko przez stosunkowo nowe przeglądarki ( http://caniuse.com/flexbox ). Ponadto specyfikacja układu Flexbox zmieniła się kilka razy, więc można objąć większą liczbą przeglądarek, dodając dodatkowo starszą składnię:
http://css-tricks.com/old-flexbox-and-new-flexbox/
http://css-tricks.com/using-flexbox/
źródło
Jeśli css3 jest opcją, można to zrobić za pomocą
calc()
funkcji css .Przypadek 1: Wyrównanie pól w jednym wierszu ( FIDDLE )
Znaczniki są proste - kilka div z pewnym elementem kontenera.
CSS wygląda następująco:
gdzie -1px, aby naprawić błąd obliczania / zaokrąglania IE9 + - patrz tutaj
Przypadek 2: Wyrównanie pól w wielu wierszach ( FIDDLE )
Tutaj oprócz
calc()
funkcjimedia queries
są konieczne.Podstawową ideą jest skonfigurowanie zapytania medialnego dla każdego stanu #kolumny, gdzie następnie używam calc () do opracowania marginesu po prawej stronie dla każdego elementu (oprócz tych w ostatniej kolumnie).
Brzmi to jak dużo pracy, ale jeśli używasz LESS lub SASS, można to zrobić dość łatwo
(Nadal można to zrobić za pomocą zwykłego css, ale wtedy będziesz musiał wykonać wszystkie obliczenia ręcznie, a następnie, jeśli zmienisz szerokość pudełka - musisz wszystko jeszcze raz wypracować)
Poniżej znajduje się przykład użycia LESS: (Możesz skopiować / wkleić ten kod tutaj, aby się nim bawić, [jest to również kod, którego użyłem do wygenerowania wyżej wspomnianego skrzypka])
Zasadniczo najpierw musisz wybrać szerokość pudełka i minimalny margines, jaki chcesz między nimi.
Dzięki temu możesz obliczyć, ile miejsca potrzebujesz na każdy stan.
Następnie użyj funkcji calc (), aby obliczyć prawy margines, a n-to dziecko, aby usunąć prawy margines z pól w ostatniej kolumnie.
Zaletą tego odpowiedź na odpowiedź przyjętą który wykorzystuje
text-align:justify
to, że jeśli masz więcej niż jeden rząd skrzynek - pudełka na ostatnim rzędzie nie dostać „uzasadnione” np: Jeśli istnieją 2 pudełka pozostające w końcowym wierszu - I nie chcę, aby pierwsze pole znajdowało się po lewej stronie, a następne po prawej - ale raczej, aby pola następowały po sobie w kolejności.Odnośnie obsługi przeglądarki : To będzie działać na IE9 +, Firefox, Chrome, Safari6.0 + - (zobacz tutaj, aby uzyskać więcej informacji)
Jednak zauważyłem, że w IE9 + jest trochę usterki między stanami zapytań o media. [jeśli ktoś wie, jak to naprawić, naprawdę chciałbym wiedzieć :)]<- NAPRAWIONO TUTAJźródło
Inne posty wspominały o flexboksie , ale jeśli potrzebny jest więcej niż jeden rząd elementów ,
space-between
właściwość flexboksa zawodzi (patrz koniec postu)Do tej pory jedynym czystym rozwiązaniem tego problemu jest
Moduł układu siatki CSS ( demo Codepen )
Zasadniczo odpowiedni niezbędny kod sprowadza się do tego:
1) Ustaw element kontenera w kontener siatkowy
2) Ustaw siatkę z „automatyczną” ilością kolumn - w razie potrzeby. Odbywa się to w przypadku responsywnych układów. Szerokość każdej kolumny będzie wynosić 120 pikseli. (Zwróć uwagę na użycie
auto-fit
(zgodnie z przeznaczeniemauto-fill
), które (dla układu 1-rzędowego) zwija puste ścieżki do 0 - pozwalając elementom na rozwinięcie się, aby zająć pozostałe miejsce. (Sprawdź to demo, aby zobaczyć, o czym mówię )).3) Ustaw odstępy / rynny dla rzędów i kolumn siatki - tutaj, ponieważ chcesz mieć układ „odstępu” - odstęp będzie faktycznie odstępem minimalnym, ponieważ będzie się powiększał w miarę potrzeby.
4) i 5) - Podobne do Flexbox.
Demo Codepen (zmiana rozmiaru, aby zobaczyć efekt)
Obsługa przeglądarki - Caniuse
Obecnie obsługiwany przez Chrome (Blink), Firefox, Safari i Edge! ... przy częściowym wsparciu IE (zobacz ten post Rachel Andrew)
NB:
Właściwość Flexbox
space-between
działa świetnie dla jednego rzędu przedmiotów, ale po nałożeniu na elastyczny pojemnik, który otacza jego przedmioty - (zflex-wrap: wrap
) - zawodzi, ponieważ nie masz kontroli nad wyrównaniem ostatniego rzędu przedmiotów; ostatni wiersz zawsze będzie uzasadniony (zwykle nie to, co chcesz)Aby zademonstrować:
Pokaż fragment kodu
Codepen (Zmień rozmiar, aby zobaczyć o czym mówię)
Dalsza lektura na temat siatek CSS:
źródło
Działa to dla mnie z 5 obrazami w różnych rozmiarach.
Działa to z powodu justify-content: space-between i znajduje się na liście, wyświetlanej poziomo.
Na CSS
Na html
źródło
w
jQuery
was może kierować bezpośrednio Parent.Pozwoli to
parent
rosnąć poziomo, gdychildren
zostaną dodane beng.UWAGA: Zakłada się, że
'.children'
mają onewidth
iHeight
SetMam nadzieję, że to pomaga.
źródło
Jeśli znasz liczbę elementów na „wiersz” i szerokość kontenera, możesz użyć selektora, aby dodać margines do elementów, których potrzebujesz, aby uzyskać uzasadniony wygląd.
Miałem rzędy trzech div, które chciałem usprawiedliwić, więc użyłem:
.tile:nth-child(3n+2) { margin: 0 10px }
pozwala to środkowej podziałce w każdym rzędzie mieć margines, który wymusza 1. i 3. podziałkę na zewnętrzne krawędzie pojemnika
Doskonały także do innych rzeczy, takich jak kolory tła obramowania itp
źródło