Mam strukturę strony jako:
<div class="parent">
<div class="child-left floatLeft">
</div>
<div class="child-right floatLeft">
</div>
</div>
Teraz child-left
DIV będzie zawierał więcej treści, więc parent
wysokość DIV wzrasta zgodnie z DIV dziecka.
Problem w tym, że child-right
wysokość się nie zwiększa. Jak mogę wyrównać jego wysokość do jego rodzica?
Odpowiedzi:
Dla
parent
elementu dodaj następujące właściwości:następnie dla
.child-right
tych:Znajdź bardziej szczegółowe wyniki z przykładami CSS tutaj i więcej informacji na temat kolumn o równej wysokości tutaj .
źródło
Wspólne rozwiązanie tego problemu wykorzystuje pozycjonowanie bezwzględne lub przycięte zmiennoprzecinkowe, ale są one trudne, ponieważ wymagają obszernego dostrajania, jeśli liczba kolumn zmienia się pod względem liczby i rozmiaru, i że musisz upewnić się, że kolumna „główna” jest zawsze najdłuższa. Zamiast tego sugeruję użycie jednego z trzech bardziej niezawodnych rozwiązań:
display: flex
: zdecydowanie najprostsze i najlepsze rozwiązanie oraz bardzo elastyczne - ale nieobsługiwane przez IE9 i starsze.table
lubdisplay: table
: bardzo prosty, bardzo kompatybilny (prawie każda przeglądarka kiedykolwiek), dość elastyczny.display: inline-block; width:50%
z hackowaniem marginesów ujemnych: dość proste, ale obramowanie dolnej kolumny jest trochę trudne.1.
display:flex
Jest to naprawdę proste i łatwe do dostosowania do bardziej złożonych lub bardziej szczegółowych układów - ale Flexbox jest obsługiwany tylko przez IE10 lub nowszą wersję (oprócz innych nowoczesnych przeglądarek).
Przykład: http://output.jsbin.com/hetunujuma/1
Odpowiedni HTML:
Odpowiednie css:
Flexbox obsługuje wiele innych opcji, ale wystarczy mieć dowolną liczbę kolumn, wystarczy powyższe!
2.
<table>
lubdisplay: table
Prostym i niezwykle kompatybilnym sposobem na wykonanie tego jest
table
- polecam najpierw spróbować, jeśli potrzebujesz obsługi starego IE . Masz do czynienia z kolumnami; divs + float po prostu nie jest najlepszym sposobem na zrobienie tego (nie wspominając o tym, że wiele poziomów zagnieżdżonych div tylko po to, by włamać się do ograniczeń css, nie jest bardziej „semantyczne” niż zwykła tabela). Jeśli nie chcesz używać tegotable
elementu, rozważ cssdisplay: table
(nieobsługiwany przez IE7 i starsze).Przykład: http://jsfiddle.net/emn13/7FFp3/
Odpowiedni HTML: (ale
<table>
zamiast tegorozważ użycie zwykłego)Odpowiednie css:
To podejście jest znacznie bardziej niezawodne niż w
overflow:hidden
przypadku pływaków. Możesz dodać prawie dowolną liczbę kolumn; możesz je skalować automatycznie, jeśli chcesz; i zachowujesz zgodność ze starymi przeglądarkami. W przeciwieństwie do rozwiązania typu float, nie musisz wcześniej wiedzieć, która kolumna jest najdłuższa; wysokość dobrze się skaluje.KISS: nie używaj haków pływakowych, chyba że potrzebujesz. Jeśli IE7 stanowi problem, nadal wybieram zwykłą tabelę z kolumnami semantycznymi zamiast trudnego w utrzymaniu, mniej elastycznego rozwiązania trick-CSS każdego dnia.
Nawiasem mówiąc, jeśli potrzebujesz, aby układ był responsywny (np. Brak kolumn na małych telefonach komórkowych), możesz użyć
@media
zapytania, aby powrócić do zwykłego układu bloków dla małych szerokości ekranu - działa to niezależnie od tego, czy używasz,<table>
czy innegodisplay: table
elementu.3.
display:inline block
z ujemnym włamaniem do marginesu.Inną alternatywą jest użycie
display:inline block
.Przykład: http://jsbin.com/ovuqes/2/edit
Odpowiedni html: (brak spacji między
div
znacznikami jest znaczący!)Odpowiednie css:
Jest to nieco trudne, a ujemny margines oznacza, że „prawdziwy” dół kolumn jest zasłonięty. To z kolei oznacza, że nie możesz ustawić niczego względem dołu tych kolumn, ponieważ jest to odcięte
overflow: hidden
. Pamiętaj, że oprócz bloków wbudowanych możesz osiągnąć podobny efekt za pomocą pływaków.TL; DR : użyj Flexboksa, jeśli możesz zignorować IE9 i starsze; w przeciwnym razie wypróbuj tabelę (css). Jeśli żadna z tych opcji nie jest dla ciebie odpowiednia, występują hacki o ujemnym marginesie, ale mogą powodować dziwne problemy z wyświetlaniem, których łatwo przeoczyć podczas programowania, i istnieją ograniczenia dotyczące układu, o których musisz pamiętać.
źródło
border-spacing:10px;
na stole wprowadzi odstępy podobne do marginesów. Alternatywnie możesz dodać dodatkowe (puste) kolumny, w których chcesz uzyskać dodatkowe miejsce. Możesz także dodać dopełnienie w komórkach tabeli; to wypełnienie zostanie uwzględnione w tle, więc może nie być to, czego chcesz. Ale masz rację, że nie jest tak elastyczny jak zwykły margines. I nie możesz ustawić niczego względem kolumn, co może stanowić problem.Dla rodzica:
Dla dzieci:
Powinieneś dodać kilka prefiksów, sprawdź caniuse.
źródło
Znalazłem wiele odpowiedzi, ale prawdopodobnie najlepszym rozwiązaniem dla mnie jest
Możesz sprawdzić inne rozwiązania tutaj http://css-tricks.com/fluid-width-equal-height-columns/
źródło
Proszę ustawić div div, aby
overflow: hidden
w divach potomnych można było ustawić dużą ilość dla padding-bottom. na przykład
padding-bottom: 5000px
wtedy
margin-bottom: -5000px
i wtedy wszystkie div div dziecka będą wysokością rodzica.
Oczywiście to nie zadziała, jeśli próbujesz wstawić treść do nadrzędnego div (poza innymi div div)
Przykład: http://jsfiddle.net/Tareqdhk/DAFEC/
źródło
Czy rodzic ma wzrost? Jeśli tak ustawisz wysokość rodziców.
Następnie możesz sprawić, by dziecko rozciągało się na pełną wysokość w ten sposób.
EDYTOWAĆ
Oto, jak zrobiłbyś to za pomocą JavaScript.
źródło
Wyświetlanie tabeli CSS jest idealne do tego:
Oryginalna odpowiedź (zakładając, że dowolna kolumna może być wyższa):
Próbujesz uzależnić wzrost rodzica od wzrostu dziecka, a wzrost dziecka od wzrostu rodzica. Nie da się obliczyć. Sztuczne kolumny CSS to najlepsze rozwiązanie. Jest na to więcej niż jeden sposób. Wolałbym nie używać JavaScript.źródło
display: table
+display: table-cell
przyniesie pożądany rezultat.float
: stackoverflow.com/questions/20110217/…Ostatnio zrobiłem to na mojej stronie przy użyciu jQuery. Kod oblicza wysokość najwyższego div i ustawia pozostałe div na tę samą wysokość. Oto technika:
http://www.broken-links.com/2009/01/20/very-quick-equal-height-columns-in-jquery/
Nie wierzę,
height:100%
że zadziała, więc jeśli nie znasz wyraźnie wysokości podziałów, nie sądzę, że istnieje czyste rozwiązanie CSS.źródło
Użyłem tego w sekcji komentarzy:
Możesz przesunąć dziecko w prawo, ale w tym przypadku dokładnie obliczyłem szerokość każdego diva.
źródło
Jeśli znasz bootstrap, możesz to łatwo zrobić za pomocą właściwości „flex”. Wystarczy, że podasz właściwości css do rodzica div
gdzie
.homepageSection
jest mój rodzic div. Teraz dodaj div div w swoim HTML jakogdzie abc jest moim div dziecka. Możesz sprawdzić równość wysokości w obu div dziecka, niezależnie od granicy, po prostu nadając granicy div dziecka
źródło
Użyłem stylu inline tylko po to, aby dać pomysł.
źródło
Dowiedziałem się o tej zgrabnej sztuczce podczas rozmowy o staż. Pierwotne pytanie brzmi: w jaki sposób zapewnić wysokość każdego górnego komponentu w trzech kolumnach o tej samej wysokości, która pokazuje całą dostępną zawartość. Zasadniczo utwórz niewidoczny komponent podrzędny, który renderuje maksymalną możliwą wysokość.
źródło