Chciałbym zapytać, jak działa wysokość i pływak. Mam zewnętrzny div i wewnętrzny div, który zawiera w sobie treść. Jego wysokość może się różnić w zależności od zawartości wewnętrznego div, ale wydaje się, że mój wewnętrzny div przepełni swój zewnętrzny div. Jaki byłby to właściwy sposób?
<html>
<body>
<div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange">
<div style="width:500px; height:200px; background-color:black; float:right"></div>
</div>
</body>
</html>
Odpowiedzi:
Elementy pływające nie zwiększają wysokości elementu kontenera, a zatem jeśli ich nie wyczyścisz, wysokość kontenera nie wzrośnie ...
Pokażę ci wizualnie:
Więcej wyjaśnień:
Możesz także dodawać
overflow: hidden;
elementy kontenera, ale sugeruję użycieclear: both;
zamiast tego.Również jeśli chcesz samodzielnie wyczyścić element, którego możesz użyć
Jak działa CSS Float?
Czym jest dokładnie float i co robi?
float
Nieruchomość jest niezrozumiany przez większość początkujących. Co dokładnie robifloat
? Początkowofloat
właściwość została wprowadzona do przepływu tekstu wokół obrazów, które są pływająceleft
lubright
. Oto kolejne wyjaśnienie @Madara Uchicha.Czy zatem niewłaściwe jest używanie tej
float
właściwości do umieszczania pól obok siebie? Odpowiedź brzmi: nie ; nie ma problemu, jeśli użyjesz tejfloat
właściwości do ustawiania pól obok siebie.Przestawienie elementu
Próbnyinline
lubblock
poziomu spowoduje, że element będzie się zachowywał jakinline-block
element.Jeśli umieścisz element
left
lub elementright
,width
element będzie ograniczony do zawartości, która zawiera, chyba żewidth
zostanie wyraźnie określony ...Nie możesz
float
elementucenter
. Jest to największy problem, jaki zawsze widziałem dla początkujących, którzy używają, co nie jest prawidłową wartościąfloat: center;
float
właściwości.float
jest zwykle używany dofloat
/ przenoszenia treści na bardzo lewo lub na prawo . Istnieją tylko cztery ważne wartości dlafloat
IE nieruchomościleft
,right
,none
(domyślnie) iinherit
.Element macierzysty zwija się, gdy zawiera pływające elementy potomne, aby temu zapobiec, używamy
clear: both;
właściwości do usuwania pływających elementów po obu stronach, co zapobiegnie zwijaniu się elementu macierzystego. Aby uzyskać więcej informacji, możesz odnieść się do mojej innej odpowiedzi tutaj .(Ważne) Pomyśl o tym, gdzie mamy stos różnych elementów. Kiedy używamy
float: left;
lubfloat: right;
element przesuwa się ponad stos o jeden. Dlatego elementy w normalnym obiegu dokumentów ukryją się za elementami pływającymi, ponieważ znajdują się na poziomie stosu powyżej normalnych elementów pływających. (Proszę nie odnosić się do tego,z-index
ponieważ jest to zupełnie inne.)Biorąc przykład za przykład, aby wyjaśnić, jak działają ruchy CSS, zakładając, że potrzebujemy prostego układu 2 kolumn z nagłówkiem, stopką i 2 kolumnami, więc oto, jak wygląda plan ...
W powyższym przykładzie będziemy unosić się tylko na czerwonych polach, albo możesz
float
zarówno doleft
, lub możeszfloat
doleft
, a także do innegoright
, zależy od układu, jeśli są to 3 kolumny, możeszfloat
2 kolumny doleft
innych jeden do tegoright
zależy, chociaż w tym przykładzie mamy uproszczony układ 2 kolumn, więcfloat
jedna doleft
drugiej, a druga doright
.Znaczniki i style tworzenia układu wyjaśnione dalej ...
Przejdźmy krok po kroku z układem i zobaczmy, jak działa float ..
Przede wszystkim, używamy główny element otoki, można po prostu założyć, że to twoja rzutni, a następnie używamy
header
i przypisaćheight
od50px
tak tam nic nadzwyczajnego. Jest to po prostu zwykły, nieopływający element poziomu bloku, który zajmie100%
przestrzeń poziomą, chyba że zostanie uniesiony lub przypisamyinline-block
go.Pierwszą prawidłową wartością dla parametru
float
jestleft
więc w naszym przykładzie,float: left;
dla.floated_left
którego zamierzamy przenieść blok doleft
elementu naszego kontenera.Kolumna przesunęła się w lewo
I tak, jeśli widzisz, element nadrzędny, który jest
.wrapper
zwinięty, ten z zieloną ramką nie rozwinął się, ale powinien mieć rację? Wrócimy do tego za chwilę, na razie mamy kolumnę przeniesionąleft
.Przechodząc do drugiej kolumny, pozwólmy, by
float
ta trafiła doright
Kolejna kolumna unosiła się w prawo
Tutaj mamy
300px
szeroką kolumnę, którą myfloat
doright
, która będzie siedzieć obok pierwszej kolumny, gdy jest ona unoszona doleft
, a ponieważ jest unoszona doleft
, stworzyła pustą rynnę doright
, a ponieważ było dużo miejsca naright
naszymright
element pływający idealnie pasował doleft
tego.Mimo to element nadrzędny jest zwinięty, więc naprawmy to teraz. Istnieje wiele sposobów zapobiegania zwinięciu elementu nadrzędnego.
clear: both;
przed zakończeniem elementu nadrzędnego, który zawiera elementy pływające, teraz ten jest tanim rozwiązaniem dlaclear
elementów pływających, które wykonają zadanie za Ciebie, ale odradzam korzystanie z tego.Dodaj,
<div style="clear: both;"></div>
przed.wrapper
div
końcami, jakPróbny
Cóż, to naprawia bardzo dobrze, nie ma już zwiniętego
overflow: hidden;
elementu nadrzędnego, ale dodaje niepotrzebne znaczniki do DOM, więc niektórzy sugerują, aby użyć elementu nadrzędnego zawierającego pływające elementy potomne, które działają zgodnie z przeznaczeniem.Użyj
overflow: hidden;
na.wrapper
Próbny
To oszczędza nam elementu za każdym razem, gdy potrzebujemy,
clear
float
ale ponieważ testowałem różne przypadki z tym, zawiodło w jednym, który wykorzystujebox-shadow
elementy potomne.Demo (nie widać cienia ze wszystkich 4 stron,
overflow: hidden;
powoduje ten problem)Co teraz? Zapisz element,
overflow: hidden;
więc nie idź po wyraźny hack naprawczy, użyj poniższego fragmentu kodu w swoim CSS i tak jak używaszoverflow: hidden;
elementu nadrzędnego, wywołajclass
poniższy element nadrzędny, aby sam wyczyścić.Próbny
W tym przypadku cień działa zgodnie z przeznaczeniem, samoczynnie usuwa element macierzysty, co zapobiega jego zawaleniu.
I wreszcie, używamy stopki po
clear
tym, jak pływamy elementy.Próbny
Kiedy i tak jest
float: none;
używany, ponieważ jest to domyślny, więc czy ma to jakiś celfloat: none;
?Cóż, to zależy, jeśli wybierasz responsywny projekt, użyjesz tej wartości wiele razy, gdy chcesz, aby elementy pływające renderowały się jeden pod drugim w określonej rozdzielczości. Ponieważ ta
float: none;
właściwość odgrywa tam ważną rolę.Kilka rzeczywistych przykładów tego, jak
float
przydatne.img
pływających,p
które umożliwi przepływ naszych treści.Demo (bez pływającego
img
)Demo 2 (
img
wprowadzono doleft
)float
do tworzenia menu poziomego - DemoPrzestaw także drugi element lub użyj „margin”
Na koniec, chcę wyjaśnić ten konkretny przypadek, w którym
float
tylko jeden element do jednego,left
ale niefloat
do drugiego, więc co się stanie?Załóżmy, że jeśli usuniemy
float: right;
z naszego.floated_right
class
,div
będą renderowane z ekstremalnych,left
ponieważ nie są pływające.Próbny
Więc w tym przypadku, albo możesz
float
doleft
jak dobrzeLUB
Możesz użyć,
margin-left
która będzie równa wielkości lewej pływającej kolumny, tj200px
. Szerokiej .źródło
clear: both;
, ale to jest w porządku, jeśli czujesz EDIT uzasadnia więc pozwala zachować w ten sposóbMusisz dodać
overflow:auto
do rodzica div, aby obejmował on wewnętrzny div div:Przykład jsFiddle
źródło
Napotykasz błąd float (choć nie jestem pewien, czy to technicznie błąd z powodu liczby przeglądarek wykazujących takie zachowanie). Oto co się dzieje:
W normalnych okolicznościach, zakładając, że nie została ustawiona żadna wyraźna wysokość, element na poziomie bloku, taki jak div, ustawi wysokość na podstawie zawartości. Dół rodzica div będzie wystawał poza ostatni element. Niestety, przestawienie elementu uniemożliwia rodzicowi uwzględnienie elementu pływającego przy określaniu jego wysokości. Oznacza to, że jeśli twój ostatni element jest zmiennoprzecinkowy, nie „rozciągnie” elementu nadrzędnego w taki sam sposób, jak normalny element.
Clearing
Istnieją dwa typowe sposoby rozwiązania tego problemu. Pierwszym jest dodanie elementu „czyszczącego”; to znaczy kolejny element poniżej pływającego elementu, który zmusi rodzica do rozciągnięcia. Dodaj następujący HTML jako ostatnie dziecko:
Nie powinien być widoczny, a używając clear: oba, upewniasz się, że nie będzie siedział obok elementu pływającego, ale po nim.
Przelewowy:
Druga metoda, która jest preferowana przez większość ludzi (myślę), polega na zmianie CSS elementu nadrzędnego, aby przepełnienie nie było „widoczne”. Tak więc ustawienie przelewu na „ukryte” zmusi rodzica do rozciągnięcia poza dno pływającego dziecka. Jest to prawdą tylko wtedy, gdy nie ustawiłeś wysokości nadrzędnego.
Jak powiedziałem, druga metoda jest preferowana, ponieważ nie wymaga od ciebie dodawania semantycznie nieistotnych elementów do znaczników, ale są chwile, kiedy potrzebujesz
overflow
być widoczny, w którym to przypadku dodanie elementu usuwającego jest więcej niż dopuszczalne .źródło
To z powodu pływaka div. Dodaj
overflow: hidden
element zewnętrzny.Próbny
źródło
Mylisz sposób, w jaki przeglądarki renderują elementy, gdy są elementy pływające. Jeśli jeden element bloku jest zmiennoprzecinkowy (w twoim przypadku wewnętrzny div), inne elementy blokowe go zignorują, ponieważ przeglądarka usuwa elementy pływające z normalnego przepływu strony internetowej. Następnie, ponieważ zmiennoprzecinkowy element div został usunięty z normalnego przepływu, element zewnętrzny div jest wypełniony, tak jakby wewnętrznego elementu div nie było. Jednak elementy wbudowane (obrazy, łącza, tekst, czarne cytaty) będą respektować granice elementu pływającego. Jeśli wprowadzisz tekst w div div, tekst zostanie umieszczony wokół div div.
Innymi słowy, elementy blokowe (nagłówki, akapity, div itp.) Ignorują elementy pływające i wypełniają je, a elementy wbudowane (obrazy, łącza, tekst itp.) Przestrzegają granic elementów pływających.
Przykład skrzypiec tutaj
źródło
Spróbuj tego
źródło
możesz użyć właściwości przepełnienia do div kontenera, jeśli nie masz div do wyświetlenia nad kontenerem, np .:
Oto następujący css:
-----------------------LUB-------------------------- ----
Oto następujący css:
źródło