Mam odwieczny problem div
zawijania dwu kolumnowego układu. Mój pasek boczny jest pływający, więc mój pojemnik div
nie zawija zawartości i paska bocznego.
<div id="container">
<div id="content"></div>
<div id="sidebar"></div>
</div>
Wydaje się, że istnieje wiele metod naprawiania wyraźnego błędu w Firefoksie:
<br clear="all"/>
overflow:auto
overflow:hidden
W mojej sytuacji jedynym, który wydaje się działać poprawnie <br clear="all"/>
, jest nieco niechlujne rozwiązanie. overflow:auto
daje mi paskudne paski przewijania i na overflow:hidden
pewno musi mieć skutki uboczne. Ponadto IE7 najwyraźniej nie powinien cierpieć z powodu tego problemu z powodu jego nieprawidłowego zachowania, ale w mojej sytuacji cierpi tak samo jak Firefox.
Która obecnie dostępna metoda jest najbardziej niezawodna?
Odpowiedzi:
W zależności od produkowanego projektu każde z poniższych rozwiązań CSS clearfix ma swoje zalety.
Clearfix ma przydatne aplikacje, ale został również wykorzystany jako hack. Zanim użyjesz poprawki, być może te nowoczesne rozwiązania css mogą być przydatne:
Nowoczesne rozwiązania Clearfix
Pojemnik z
overflow: auto;
Najprostszym sposobem na wyczyszczenie elementów pływających jest użycie stylu
overflow: auto
na elemencie zawierającym. To rozwiązanie działa we wszystkich nowoczesnych przeglądarkach.Jeden minus, użycie pewnych kombinacji marginesu i dopełnienia na elemencie zewnętrznym może spowodować pojawienie się pasków przewijania, ale można to rozwiązać, umieszczając margines i dopełnienie na innym elemencie zawierającym element nadrzędny.
Użycie opcji „przepełnienie: ukryte” jest również rozwiązaniem typu clearfix, ale nie będzie miało pasków przewijania, jednak użycie
hidden
spowoduje wycięcie dowolnej zawartości umieszczonej poza elementem zawierającym.Uwaga: Element pływający jest
img
znacznikiem w tym przykładzie, ale może być dowolnym elementem HTML.Clearfix Reloaded
Thierry Koblentz na CSSMojo napisał: Ponownie załadowano najnowszą wersję Clearfix . Zauważył, że rezygnując z obsługi oldIE, rozwiązanie można uprościć do jednej instrukcji css. Dodatkowo użycie
display: block
(zamiastdisplay: table
) pozwala na prawidłowe zwijanie marginesów, gdy elementy z clearfix są rodzeństwem.To najnowocześniejsza wersja poprawki.
⋮
⋮
Starsze rozwiązania Clearfix
Poniższe rozwiązania nie są konieczne w przypadku nowoczesnych przeglądarek, ale mogą być przydatne do kierowania na starsze przeglądarki.
Pamiętaj, że te rozwiązania opierają się na błędach przeglądarki i dlatego powinny być używane tylko wtedy, gdy żadne z powyższych rozwiązań nie działa dla Ciebie.
Są one wymienione z grubsza w porządku chronologicznym.
„Beat That ClearFix”, poprawka do nowoczesnych przeglądarek
Thierry koblentz”z CSS Mojo wskazał, że podczas kierowania nowoczesnych przeglądarek, możemy teraz upuść
zoom
i::before
nieruchomości / wartości i po prostu użyć:To rozwiązanie celowo nie obsługuje IE 6/7…!
Thierry oferuje również: „ Słowo przestrogi : jeśli zaczynasz nowy projekt od zera, idź do niego, ale nie zamieniaj tej techniki na tę, którą masz teraz, ponieważ nawet jeśli nie obsługujesz oldIE, istniejące zasady uniemożliwiają malejące marginesy ”.
Micro Clearfix
Najnowsze i globalnie przyjęte rozwiązanie Clearfix, Micro Clearfix firmy Nicolas Gallagher .
Znana obsługa: Firefox 3.5+, Safari 4+, Chrome, Opera 9+, IE 6+
Właściwość przepełnienia
Ta podstawowa metoda jest preferowana w zwykłym przypadku, gdy pozycjonowana zawartość nie będzie wyświetlana poza granicami kontenera.
http://www.quirksmode.org/css/clearing.html - wyjaśnia, jak rozwiązać typowe problemy związane z tą techniką, a mianowicie ustawienie
width: 100%
kontenera.Zamiast używać
display
właściwości do ustawiania „hasLayout” dla IE, można użyć innych właściwości do wyzwalania „hasLayout” dla elementu .Innym sposobem na wyczyszczenie pływaków za pomocą
overflow
właściwości jest użycie hakowania podkreślenia . IE zastosuje wartości poprzedzone znakiem podkreślenia, inne przeglądarki nie.zoom
Własność wyzwala hasLayout w IE:Podczas gdy to działa ... nie jest idealne używanie hacków.
SROKA: Łatwa metoda czyszczenia
Ta starsza metoda „łatwego czyszczenia” ma tę zaletę, że pozwala pozycjonowanym elementom wisieć poza granicami kontenera, kosztem bardziej skomplikowanego CSS.
To rozwiązanie jest dość stare, ale możesz dowiedzieć się wszystkiego o łatwym rozliczaniu pozycji jest wszystkim: http://www.positioniseverything.net/easyclearing.html
Element używający właściwości „wyczyść”
Szybkie i brudne rozwiązanie (z pewnymi wadami) do szybkiego łączenia czegoś:
Wady
<br style="clear: both" />
znaczników zaśmieconych wokół znaczników.źródło
overflow: hidden
luboverflow: auto
nie usuwa pływaków (kategoryzowanie go jako „clearfix” jest mylące); zamiast tego powoduje, że element tworzy nowy kontekst formatowania, w którym mogą być zawarte zmiennoprzecinkowe. Powoduje to rozciągnięcie pojemnika do wysokości pływaków w celu ich przechowywania. Nie wymaga to żadnego prześwitu - powiedzmy jednak, że nadal możesz zdecydować się wyczyścić lub nie wyczyścić pływaków w pojemniku, w zależności od układu.Jakie problemy próbujemy rozwiązać?
Istnieją dwie ważne kwestie dotyczące pływających elementów:
Zawierające pływające potomki. Oznacza to, że element ten staje się wystarczająco wysoki, aby owinąć wszystkich pływających potomków. (Nie wiszą na zewnątrz.)
Izolowanie potomków od zewnętrznych pływaków. Oznacza to, że potomkowie wewnątrz elementu powinni móc korzystać z niego
clear: both
i nie wchodzić w interakcje z elementami pływającymi na zewnątrz elementu.Blokuj konteksty formatowania
Jest tylko jeden sposób na zrobienie obu tych rzeczy. I to jest ustanowienie nowego kontekstu formatowania bloku . Elementy tworzące kontekst formatowania bloku są izolowanym prostokątem, w którym elementy pływające oddziałują na siebie. Kontekst formatowania bloków zawsze będzie wystarczająco wysoki, aby wizualnie zawinąć pływających potomków, a żadne elementy pływające poza kontekstem formatowania bloków nie mogą wchodzić w interakcje z elementami wewnątrz. Ta dwustronna izolacja jest dokładnie tym, czego chcesz. W IE ta sama koncepcja nazywa się hasLayout , którą można ustawić za pomocą
zoom: 1
.Istnieje kilka sposobów, aby ustanowić bloku formatowania kontekstu, ale rozwiązanie polecam jest
display: inline-block
zwidth: 100%
. (Oczywiście, nie są zwykłe ostrzeżenia o użyciuwidth: 100%
, więc użyciebox-sizing: border-box
lub putpadding
,margin
iborder
na innym elemencie).Najbardziej niezawodne rozwiązanie
Prawdopodobnie najczęstszym zastosowaniem pływaków jest układ dwukolumnowy. (Można rozszerzyć do trzech kolumn.)
Najpierw struktura znaczników.
A teraz CSS.
Spróbuj sam
Idź do JS Bin aby pobawić się kodem i zobaczyć, jak to rozwiązanie jest budowane od podstaw.
Tradycyjne metody usuwania błędów uważane za szkodliwe
Problem z tradycyjnymi rozwiązaniami Clearfix polega na tym, że używają dwóch różnych koncepcji renderowania, aby osiągnąć ten sam cel dla IE i wszystkich innych. W IE używają hasLayout do ustanowienia nowego kontekstu formatowania bloku, ale dla wszystkich innych używają wygenerowanego pola ( ) z , który nie ustanawia nowego kontekstu formatowania bloku. Oznacza to, że rzeczy nie zachowają się tak samo we wszystkich sytuacjach. Aby uzyskać wyjaśnienie, dlaczego jest to złe, zobacz Wszystko, co wiesz o Clearfix jest błędne .
:after
clear: both
źródło
width: 100%
”? Czy sugerujesz także użyciezoom: 1
w ¶1 z §2?overflow: hidden
jaką koncepcją renderowania się przywołuje? A czym może się różnićhasLayout
?position: absolute
, to jest w porządku i będzie częścią tej samej koncepcji renderowania?overflow: hidden
egzekwuje coś, co różni się od tego, co robi funkcja Layout?hasLayout
na stronie stackoverflow.com/questions/1794350/what-is-haslayout . Uważam to za równoznaczne z ustanowieniem nowego kontekstu formatowania bloków. Elementy, które to robią, są zasadniczo odpowiedzialne za układ wszystkich swoich elementów potomnych. Jednym z rezultatów jest to, że elementy, które ustanawiają nowy kontekst formatowania bloku, zawierają pływające elementy potomne, a elementy pływające na zewnątrz elementu nie wchodzą w interakcje zclear: left|right|both
elementami wewnątrz. (To jest odpowiedź powyżej.)Nowy standard używany przez Inuit.css i Bourbon - dwa bardzo szeroko stosowane i dobrze utrzymane frameworki CSS / Sass:
Notatki
Należy pamiętać, że poprawki są zasadniczo włamaniem do tego, co układy Flexbox mogą teraz zapewnić w znacznie mądrzejszy sposób . Elementy zmiennoprzecinkowe CSS zostały pierwotnie zaprojektowane z myślą o przepływie treści wbudowanych - jak obrazy w długim artykule tekstowym - a nie układach siatki i tym podobnych. Jeśli Twoje docelowe przeglądarki obsługują Flexbox , warto się temu przyjrzeć.
To nie obsługuje IE7. Nie powinieneś wspierać IE7. Takie postępowanie nadal naraża użytkowników na nieusunięte exploity bezpieczeństwa i utrudnia życie wszystkim innym twórcom stron internetowych, ponieważ zmniejsza presję na użytkowników i organizacje na przechodzenie na nowoczesne przeglądarki.
Ta poprawka została ogłoszona i wyjaśniona przez Thierry Koblentza w lipcu 2012 r. Zrzuca zbędną wagę z mikro- poprawki Nicolasa Gallaghera z 2011 r . W ten sposób uwalnia pseudoelement do własnego użytku. Zostało to zaktualizowane, aby użyć
display: block
zamiastdisplay: table
(ponownie, kredyt dla Thierry Koblentz).źródło
Zalecam użycie następujących, pobranych z http://html5boilerplate.com/
źródło
Właściwość przelewu może być używana do usuwania pływaków bez dodatkowego narzutu:
Działa to we wszystkich przeglądarkach oprócz IE6, gdzie wszystko, co musisz zrobić, to włączyć hasLayout (zoom jest moją preferowaną metodą):
http://www.quirksmode.org/css/clearing.html
źródło
overflow:hidden
ma wpływ zawartości obcinania; ma efekt ubocznyZnalazłem błąd w oficjalnej metodzie CLEARFIX: DOT nie ma rozmiaru czcionki. A jeśli ustawisz
height = 0
i pierwszy element w drzewie DOM ma klasę „clearfix”, zawsze będziesz mieć margines na dole strony o wielkości 12 pikseli :)Musisz to naprawić w następujący sposób:
Jest teraz częścią układu YAML ... Spójrz na to - to bardzo interesujące! http://www.yaml.de/en/home.html
źródło
To dość schludne rozwiązanie:
Od http://nicolasgallagher.com/micro-clearfix-hack/
źródło
overflow: hidden
).Clearfix z bootstrap:
źródło
Po prostu używam:
Działa najlepiej i jest zgodny z IE8 + :)
źródło
Biorąc pod uwagę ogromną liczbę odpowiedzi, których nie zamierzałem publikować. Jednak ta metoda może komuś pomóc, ponieważ pomogła mi.
Zawsze, gdy to możliwe, trzymaj się z dala od pływaków
Warto wspomnieć, unikam pływaków jak Ebola. Jest wiele powodów i nie jestem sam; Przeczytaj odpowiedź Rikudo o tym, co jest poprawką, a zobaczysz, co mam na myśli. Jego własnymi słowami:
...the use of floated elements for layout is getting more and more discouraged with the use of better alternatives...
Istnieją inne dobre (a czasem lepsze) opcje inne niż zmiennoprzecinkowe. Wraz z postępem i ulepszaniem technologii, flexbox (i inne metody) będą szeroko stosowane, a zmiennoprzecinkowe stanie się po prostu złą pamięcią. Może CSS4?
Niewłaściwe zachowanie pływaka i nieudane czyszczenie
Po pierwsze, czasami możesz myśleć, że jesteś bezpieczny przed pływakami, dopóki twój ratownik nie zostanie przekłuty, a przepływ HTML zacznie spadać:
W codepen http://codepen.io/omarjuvera/pen/jEXBya poniżej praktyka czyszczenia pływaka za pomocą
<div classs="clear"></div>
(lub innego elementu) jest powszechna, ale marszczy brwi i jest antysemantyczna.CSS
Jednak tylko wtedy, gdy pomyślałeś, że twój pływak jest godny żagla ... bum! Gdy rozmiar ekranu staje się coraz mniejszy, widać dziwne zachowania, takie jak na poniższej grafice (Same http://codepen.io/omarjuvera/pen/jEXBya ):
Dlaczego powinno Cię to obchodzić? Nie jestem pewien dokładnej liczby, ale około 80% (lub więcej) używanych urządzeń to urządzenia mobilne z małymi ekranami. Komputery stacjonarne / laptopy nie są już królem.
To się nie kończy
To nie jedyny problem z pływakami. Jest ich wiele, ale w tym przykładzie niektórzy mogą powiedzieć
all you have to do is to place your floats in a container
. Ale jak widać na codepen i grafice, tak nie jest. Najwyraźniej pogorszyło to sytuację:HTML
CSS
Co do wyniku?
To jest to samo!
Co najmniej wiesz, że zaczniesz imprezę CSS, zapraszając na nią wszelkiego rodzaju selektory i właściwości; robiąc większy bałagan w CSS niż od tego, co zacząłeś. Po prostu napraw swój pływak.
CSS Clearfix na ratunek
Ten prosty i bardzo elastyczny kawałek CSS jest pięknem i „wybawcą”:
Otóż to! To naprawdę działa bez łamania semantyki i czy wspominałem, że działa? :
Z tej samej próbki ... HTML
CSS
Teraz już nie potrzebujemy
<div classs="clear"></div> <!-- Acts as a wall -->
i utrzymujemy radość semantycznej policji. To nie jedyna korzyść. Ta poprawka reaguje na każdy rozmiar ekranu bez użycia@media
w najprostszej formie. Innymi słowy, utrzyma kontrolę nad pływakiem i zapobiegnie powodziom. Wreszcie, obsługuje stare przeglądarki w jednym małym kotletu karate =)Oto znowu poprawka
źródło
clear
nazwie klasy nie działa, jest to, że atrybutclass
jest niepoprawny. To, co napisałeś, jestclasss
z dodatkowyms
.Zawsze przesuwam główne sekcje mojej siatki i odnoszę się
clear: both;
do stopki. To nie wymaga dodatkowej dywizji lub klasy.źródło
szczerze; wszystkie rozwiązania wydają się być włamaniem do naprawy błędu renderowania ... czy się mylę?
uważam, że
<br clear="all" />
jest najłatwiejszy, najprostszy. widzenieclass="clearfix"
wszędzie nie może wywołać wrażliwości kogoś, kto sprzeciwia się obcym elementom markeup, prawda? po prostu malujesz problem na innym płótnie.Używam również
display: hidden
rozwiązania, które jest świetne i nie wymaga żadnych dodatkowych deklaracji klasy ani znaczników HTML ... ale czasami potrzebujesz elementów, aby przepełnić kontener, na przykład. ładne wstążki i skrzydłaźródło
overflow: hidden
Myślę, że masz na myśliźródło
Wypróbowałem wszystkie te rozwiązania, duży margines zostanie dodany do
<html>
elementu automatycznie, gdy użyję poniższego kodu:Wreszcie rozwiązałem problem marży, dodając
font-size: 0;
do powyższego CSS.źródło
.
, po prostu użyjcontent: ""
W przypadku SASS poprawka to:
i jest używany jak:
jeśli chcesz nowego clearfix:
źródło
Za pomocą LESS ( http://lesscss.org/ ) można stworzyć przydatnego pomocnika usuwania błędów:
A następnie użyj go z problematycznymi pojemnikami, na przykład:
źródło
Użycie
overflow:hidden
/auto
i wysokość dla ie6 wystarczy, jeśli pływający pojemnik ma element nadrzędny.Każdy z #testów może działać, ponieważ podany poniżej kod HTML usuwa pływaki.
W przypadkach, gdy odmawia pracy z ie6, po prostu ustaw element nadrzędny, aby wyczyścić element zmiennoprzecinkowy.
Nigdy tak naprawdę nie potrzebowałem żadnego innego rodzaju czyszczenia. Może w ten sposób piszę mój HTML.
źródło
Nowa wartość wyświetlania wydaje się zadaniu w jednym wierszu.
Ze specyfikacji W3: „Element generuje pudełko kontenera bloków i określa jego zawartość za pomocą układu przepływu. Zawsze ustanawia nowy kontekst formatowania bloku dla swojej zawartości”.
Informacje: https://www.w3.org/TR/css-display-3/#valdef-display-flow-root https://www.chromestatus.com/feature/5769454877147136
※ Jak pokazano w powyższym linku, wsparcie jest obecnie ograniczone, więc może być przydatne wsparcie zastępcze, takie jak poniżej: https://github.com/fliptheweb/postcss-flow-root
źródło
Też bym się unosił
#content
, w ten sposób obie kolumny zawierają zmiennoprzecinkowe . Również dlatego, że pozwoli ci wyczyścić elementy w środku#content
bez usuwania paska bocznego.Tak samo jest z opakowaniem, trzeba by uczynić go kontekstem formatowania bloku, aby zawinąć dwie kolumny.
W tym artykule wymieniono kilka wyzwalaczy, których można użyć: konteksty formatowania bloków .
źródło
Clearfix to sposób na automatyczne czyszczenie elementu po sobie, dzięki czemu nie trzeba dodawać dodatkowych znaczników.
Zwykle musisz zrobić coś w następujący sposób:
Dzięki clearfix wystarczy
źródło
Dlaczego po prostu próbujesz użyć hacka css, aby zrobić to, co robi 1 linia HTML. A dlaczego nie użyć semantycznego html tu put break, aby powrócić do wiersza?
Dla mnie naprawdę lepiej jest użyć:
A jeśli nie chcesz żadnego stylu w swoim html, musisz po prostu użyć klasy na przerwę i umieścić
.clear { clear:both; }
w CSS.Zaleta tego:
źródło
Zakładając, że używasz tej struktury HTML:
Oto CSS, którego chciałbym użyć:
Używam tego zestawu cały czas i działa dobrze dla mnie, nawet w IE6.
źródło
W przeciwieństwie do innych wyraźnych poprawek, tutaj jest otwarty bez pojemników
Inne poprawki albo wymagają, aby element pływający znajdował się w dobrze oznakowanym pojemniku, albo wymagają dodatkowego, semantycznie pustego
<div>
. I odwrotnie, wyraźne oddzielenie treści i znaczników wymaga ścisłego rozwiązania tego problemu przez CSS .Sam fakt, że należy zaznaczyć koniec pływaka, nie pozwala na bezobsługowe składanie CSS .
Jeśli twoim celem jest ten ostatni, zmiennoprzecinkowy powinien pozostać otwarty na wszystko (akapity, uporządkowane i nieuporządkowane listy itp.), Aby go owijać, dopóki nie pojawi się „clearfix”. Na przykład poprawka może być ustawiona przez nowy nagłówek.
Dlatego używam następującej poprawki z nowymi nagłówkami:
To rozwiązanie jest szeroko stosowane na mojej stronie internetowej w celu rozwiązania problemu: tekst obok miniatury pływającej jest krótki, a górny margines następnego obiektu czyszczącego nie jest przestrzegany.
Zapobiega także ręcznej interwencji podczas automatycznego generowania plików PDF z witryny. Oto przykładowa strona .
źródło
Zawsze używam mikro-clearfix :
W Cascade Framework nawet domyślnie stosuję go do elementów na poziomie bloku. IMO, stosując go domyślnie do elementów na poziomie bloku, zapewnia elementom na poziomie bloku bardziej intuicyjne zachowanie niż ich tradycyjne zachowanie. Ułatwiło mi to także dodanie obsługi starszych przeglądarek do Cascade Framework (która obsługuje IE6-8, a także nowoczesne przeglądarki).
źródło
Możesz również umieścić to w swoim CSS:
I dodaj klasę „cb” do div rodzica:
Nie musisz dodawać nic więcej do oryginalnego kodu ...
źródło
źródło
Czy próbowałeś tego:
Nie miałem żadnych problemów z tą metodą.
źródło
<div/>
jest zgodny z X (HT) ML, ale nie jest kompatybilny z HTML , więc w przypadku dokumentów obsługiwanych, ponieważtext/html
wszystkie przeglądarki będą traktować go jako niezamknięty tag. Niestety nie ma takich tagów jak samozamykające siętext/html
dokumenty, niezależnie od typu dokumentu .Moją ulubioną metodą jest utworzenie klasy clearfix w moim dokumencie css / scss, jak poniżej
A następnie wywołaj go w moim dokumencie HTML, jak pokazano poniżej
źródło
To takie proste, poprawka usuwa problem, gdy używamy właściwości float wewnątrz elementu div. Jeśli używamy dwóch elementów div, jeden jako float: left; a drugi jako float: prawo; możemy użyć clearfix dla elementu nadrzędnego dla dwóch elementów div. Jeśli odmówimy skorzystania z clearfix, niepotrzebne spacje wypełnij treścią poniżej, a struktura witryny ulegnie zniszczeniu.
źródło