W przypadku HTML / CSS, w jaki sposób mogę utworzyć element, który ma szerokość i / lub wysokość stanowiącą 100% jego elementu nadrzędnego i nadal ma odpowiednie dopełnienie lub marginesy?
Przez „właściwy” rozumiem, że jeśli mój element nadrzędny jest 200px
wysoki i określam za height = 100%
pomocą padding = 5px
, spodziewam się, że powinienem uzyskać 190px
wysoki element ze border = 5px
wszystkich stron, ładnie wyśrodkowany w elemencie nadrzędnym.
Teraz wiem, że nie tak określa się standardowy model pudełkowy, że powinien on działać (chociaż chciałbym wiedzieć, dlaczego dokładnie ...), więc oczywista odpowiedź nie działa:
#myDiv {
width: 100%
height: 100%;
padding: 5px;
}
Wydaje mi się jednak, że musi istnieć NIEZWYKŁY sposób niezawodnego wywołania tego efektu dla rodzica o dowolnej wielkości. Czy ktoś zna sposób na wykonanie tego (pozornie prostego) zadania?
Aha, a dla przypomnienia, nie jestem szczególnie zainteresowany kompatybilnością z IE, więc powinno to (miejmy nadzieję) nieco ułatwić.
EDYCJA: Ponieważ poproszono o przykład, oto najprostszy, jaki mogę wymyślić:
<html style="height: 100%">
<body style="height: 100%">
<div style="background-color: black; height: 100%; padding: 25px"></div>
</body>
</html>
Wyzwanie polega na tym, aby czarna ramka pojawiła się z wypełnieniem 25 pikseli na wszystkich krawędziach, bez powiększania strony do rozmiarów pasków przewijania.
Odpowiedzi:
Nauczyłem się robić takie rzeczy, czytając „ PRO HTML i CSS Design Patterns ”. Jest
display:block
to domyślna wartość wyświetlana dladiv
, ale ja chcę ją wyrazić. Pojemnik musi być odpowiedniego typu;position
atrybut jestfixed
,relative
alboabsolute
.Fiddle przez komentarz Nooshu
źródło
top:0
,bottom:0
Zasadniczo „rozciągania” na zewnątrz tego elementu. Mogę tylko go do pracy zposition:absolute
chociażtop:20px;bottom:20px;left:20px;right:20px;
zamiast marży?W CSS3 pojawiła się nowa właściwość , której można użyć do zmiany sposobu obliczania szerokości / wysokości przez model pola, nazywany jest on wielkością pudełka.
Ustawienie tej właściwości na wartość „obramowanie” powoduje, że dowolny element, który zastosujesz, nie będzie rozciągał się po dodaniu dopełnienia lub ramki. Jeśli zdefiniujesz coś o szerokości 100 pikseli i dopełnieniu 10 pikseli, nadal będzie mieć szerokość 100 pikseli.
Zobacz tutaj, aby uzyskać wsparcie przeglądarki . Nie działa dla IE7 i niższych, jednak uważam, że IE7.js Deana Edwarda dodaje obsługę. Cieszyć się :)
źródło
border-box
jest bohaterem każdego :)Rozwiązaniem jest wcale NIE używać wysokości i szerokości! Przymocuj wewnętrzne pudełko za pomocą górnego, lewego, prawego, dolnego, a następnie dodaj margines.
źródło
Lepszym sposobem jest właściwość calc (). Twoja sprawa wyglądałaby następująco:
Proste, czyste, bez obejść. Upewnij się tylko, że nie zapomnisz odstępu między wartościami a operatorem (np.
(100%-5px)
Spowoduje to przerwanie składni. Ciesz się!źródło
Zgodnie ze specyfikacją w3c wysokość odnosi się do wysokości widocznego obszaru, np. Na monitorze o rozdzielczości 1280x1024 pikseli 100% wysokości = 1024 piksele.
min-wysokość odnosi się do całkowitej wysokości strony łącznie z zawartością, więc na stronie, na której treść jest większa niż 1024px min-wysokość: 100% rozciągnie się, aby objąć całą zawartość.
Innym problemem jest to, że dopełnianie i obramowanie są dodawane do wysokości i szerokości w większości nowoczesnych przeglądarek z wyjątkiem ie6 (tj. 6 jest w rzeczywistości dość logiczne, ale nie jest zgodne ze specyfikacją). Nazywa się to modelem pudełkowym. Więc jeśli określisz
To faktycznie da ci 100% + 5px + 5px dla wysokości. Aby obejść ten problem, potrzebujesz pojemnika na opakowanie.
źródło
1. Pełna wysokość z
padding
2. Pełna wysokość z
margin
3. Pełna wysokość z
border
źródło
Jest to jedna z najbardziej idiotycznych cech CSS - muszę jeszcze zrozumieć rozumowanie (jeśli ktoś wie, proszę wyjaśnij).
100% oznacza 100% wysokości pojemnika - do której dodawane są wszelkie marginesy, obramowania i wypełnienie. Zatem nie jest możliwe uzyskanie pojemnika, który wypełnia jego element nadrzędny i który ma margines, ramkę lub wypełnienie.
Pamiętaj też, że ustawienie wysokości jest również niespójne między przeglądarkami.
Kolejną rzeczą, której się nauczyłem, odkąd to opublikowałem, jest to, że procent jest względny względem długości kontenera , to znaczy jego szerokości, czyniąc procent jeszcze bardziej bezwartościowym dla wysokości.
Obecnie jednostki rzutni vh i vw są bardziej przydatne, ale nadal nie są szczególnie przydatne do niczego poza kontenerami najwyższego poziomu.
źródło
Innym rozwiązaniem jest użycie display: table, która ma inne zachowanie modelu pudełkowego.
Możesz ustawić wysokość i szerokość dla rodzica i dodać dopełnienie bez rozwijania go. Dziecko ma 100% wysokości i szerokości minus poduszki.
JSBIN
Inną opcją byłoby użycie właściwości dostosowywania wielkości pudełka. Jedynym problemem w obu przypadkach byłoby to, że nie działają one w IE7.
źródło
Inne rozwiązanie: Możesz użyć jednostek procentowych dla marginesów i rozmiarów. Na przykład:
Głównym problemem jest to, że marginesy nieznacznie wzrosną / zmniejszą się wraz z rozmiarem elementu macierzystego. Przypuszczalnie funkcjonalność, którą preferujesz, to pozostawienie marginesów na stałym poziomie, a element potomny będzie się powiększał / kurczył, aby wypełnić zmiany odstępów. W zależności od tego, jak ciasno potrzebujesz wyświetlacza, może to być problematyczne. (Wybrałbym również mniejszą marżę, na przykład 0,3%).
źródło
Rozwiązanie z flexbox (działające na IE11): ( lub zobacz na jsfiddle )
( Reset CSS niekoniecznie jest istotny dla faktycznego problemu).
Ważną częścią jest
flex: 1
(w połączeniu zdisplay: flex
rodzicem). Co zabawne, najbardziej wiarygodne wyjaśnienie, jakie znam dla działania właściwości Flex, pochodzi z dokumentacji rodzimej dla reagowania, więc i tak się do niej odwołuję :źródło
Przykład Franka trochę mnie zdezorientował - w moim przypadku nie zadziałało, ponieważ nie rozumiałem jeszcze wystarczająco dobrze pozycjonowania. Ważne jest, aby pamiętać, że element nadrzędny kontenera musi mieć pozycję niestatyczną (wspomniał o tym, ale przeoczyłem go i nie było go w jego przykładzie).
Oto przykład, w którym dziecko - z wypełnieniem i ramką - używa bezwzględnego pozycjonowania, aby wypełnić element nadrzędny w 100%. Rodzic używa pozycjonowania względnego, aby zapewnić punkt odniesienia dla pozycji dziecka, pozostając w normalnym przepływie - nie ma to wpływu na następny element „więcej treści”:
Przydatny link do szybkiego uczenia się pozycjonowania CSS
źródło
Obramuj div, a nie margines treści strony
Inne rozwiązanie - chciałem tylko prostą ramkę wokół krawędzi mojej strony i chciałem 100% wysokości, gdy zawartość była mniejsza.
Border-box nie działał, a ustalone pozycjonowanie wydawało się złe dla tak prostej potrzeby.
Skończyło się na dodaniu ramki do mojego kontenera, zamiast polegać na marginesie strony - wygląda to tak:
źródło
Jest to domyślne zachowanie
display: block
Najszybszym sposobem, aby to naprawić w 2020 r. Jest ustawieniedisplay: 'flex'
elementu nadrzędnego i wypełnienia, np. 20 pikseli, wtedy wszystkie jego dzieci będą miały 100% wysokości w stosunku do wysokości.źródło
Dodanie -webkit i -moz byłoby bardziej odpowiednie
źródło
źródło