Jak sprawić, by element pozycjonowany bezwzględnie przestrzegał dopełnienia swojego rodzica? Chcę, aby wewnętrzny element DIV rozciągał się na szerokość swojego elementu nadrzędnego i był umieszczony na dole tego elementu nadrzędnego, czyli w zasadzie w stopce. Ale dziecko musi uszanować wyściółkę rodzica i tego nie robi. Dziecko jest przyciśnięte do krawędzi rodzica.
Więc chcę tego:
ale rozumiem to:
<html>
<body>
<div style="background-color: blue; padding: 10px; position: relative; height: 100px;">
<div style="background-color: gray; position: absolute; left: 0px; right: 0px; bottom: 0px;">css sux</div>
</div>
</body>
</html>
Mogę to zrobić z marginesem wokół wewnętrznego div, ale wolałbym nie musieć tego dodawać.
css
padding
css-position
d512
źródło
źródło
style="background-color: gray; position: absolute; left: 10px; right: 10px; bottom: 10px;"
?left:
iright:
na (pozycjonowanym bezwzględnie) dziecku, problem zostanie rozwiązany. Dodaję ten b / c, to jest odpowiedź, której prawdopodobnie szukają inni z tym samym problemem.Odpowiedzi:
Najpierw zobaczmy, dlaczego tak się dzieje.
Powodem jest to, że, co zaskakujące, kiedy pudełko ma
position: absolute
swoje pudełko zawierające, jest to pole wyściółki rodzica (to znaczy pudełko wokół jego wypełnienia). Jest to zaskakujące, ponieważ zwykle (to znaczy, gdy używasz pozycjonowania statycznego lub względnego), pole zawierające jest polem zawartości nadrzędnej .Oto odpowiednia część specyfikacji CSS :
Najprostszym podejściem - zgodnie z sugestią Wintera - jest użycie
padding: inherit
na pozycjach absolutnie pozycjonowanychdiv
. Działa to jednak tylko wtedy, gdy nie chcesz, aby pozycja absolutnadiv
miała własne dodatkowe wypełnienie. Myślę, że najbardziej uniwersalne rozwiązania (w tym, że oba elementy mogą mieć własne niezależne wypełnienie) to:Dodaj dodatkowe względnie ustawione
div
(bez wyściółki) wokół absolutnie pozycjonowanegodiv
. Ten nowydiv
będzie uwzględniał wypełnienie swojego rodzica, a absolutnie pozycjonowanydiv
wypełni go.Wadą jest oczywiście to, że modyfikujesz kod HTML tylko w celach prezentacyjnych.
Powtórz wypełnienie (lub dodaj do niego) na absolutnie pozycjonowanym elemencie.
Wadą jest to, że musisz powtarzać wartości w swoim CSS, co jest kruche, jeśli piszesz CSS bezpośrednio. Jeśli jednak używasz narzędzia do wstępnego przetwarzania, takiego jak
SASS
lubLESS
możesz uniknąć tego problemu, używając zmiennej. To jest metoda, której osobiście używam.źródło
position: absolute
? Zaskakujące jest to, że pole zawierające jest pudełkiem wyściółkowym, ale musiał być ku temu powód, tak jak jestem pewien, że istnieje powód, dla którego (bezbox-sizing
)width
&height
nie zawierają wypełnienia ani obramowania.box-sizing
majątek rodzica lub dziecka. Dzieje się tak, ponieważ wpływa to na rozmiar , jak na szerokość / wysokość, ale nie na pole zawierające, chociaż przyznaję, że miałoby to większy sens, gdyby miało to wpływ na oba.padding: inherit
działa dobrze, jeśli pozycja absolutnie pozycjonowanadiv
nie wymaga własnego dopełnienia i dodałem wzmiankę o tej technice. Jest jednak mniej elastyczny, ponieważ nie możesz dodać żadnego dodatkowego wypełnienia do pozycji absolutnejdiv
(tj. Nie możesz tego powiedziećpadding: inherit + 5px
). Dlatego wolę techniki, o których tu wspominam.position:absolute
dopełnienia w elemencie potomnym rzeczywiście działa, jeśli po prostu szukasz dziecka, aby szanowało wypełnienie rodzica. Jeśli jednak chcesz dodać dodatkowe wypełnienie dziecku, musisz zachować proporcję wypełnienia w swoim kodzie. Nie ma prostego sposobu na zrobienie tego za pomocą samego CSS.Jedną z rzeczy, które możesz spróbować, jest użycie następującego CSS:
Pozwala elementowi podrzędnemu dziedziczyć wypełnienie po rodzicu, a następnie ustawić dziecko tak, aby pasowało do szerokości i wypełnienia rodziców.
Używam
box-sizing: border-box;
również elementów zaangażowanych.Nie testowałem tego we wszystkich przeglądarkach, ale wygląda na to, że działa w Chrome, Firefox i IE10.
źródło
Cóż, może to nie być najbardziej eleganckie rozwiązanie (semantycznie), ale w niektórych przypadkach będzie działać bez żadnych wad: zamiast wypełnienia użyj przezroczystej ramki na elemencie nadrzędnym. Elementy podrzędne pozycjonowane bezwzględnie będą honorować obramowanie i będą renderowane dokładnie tak samo (z wyjątkiem tego, że do stylizacji używasz obramowania elementu nadrzędnego).
źródło
Użyj marginesu zamiast dopełnienia w nadrzędnym div: http://blog.vjeux.com/2012/css/css-absolute-position-taking-into-account-padding.html
źródło
Oto moja najlepsza szansa. Dodałem kolejny element Div, uczyniłem go czerwonym i zmieniłem wysokość rodzica na 200 pikseli, aby go przetestować. Chodzi o to, że dziecko staje się teraz wnukiem, a rodzic staje się dziadkiem. Więc rodzic szanuje swojego rodzica. Mam nadzieję, że zrozumiesz mój pomysł.
Edytować:
Myślę, że tego, co próbujesz zrobić, nie da się zrobić. Absolutna pozycja oznacza, że zamierzasz nadać mu współrzędne, które musi uszanować. A co, jeśli rodzic ma wypełnienie 5 pikseli. I absolutnie umieszczasz dziecko na górze: -5px; po lewej: -5px . Jak można szanować rodzica i Ciebie w tym samym czasie?
Moje rozwiązanie
Jeśli chcesz, aby to szanowało rodzica, nie pozycjonuj go wtedy absolutnie.
źródło
1.) nie możesz użyć dużej ramki na rodzicu - w przypadku, gdy chcesz mieć określone obramowanie
2.) nie możesz dodać marginesu - w przypadku, gdy Twój rodzic jest częścią innego pojemnika i chcesz, aby rodzic odebrał całą szerokość tego dziadka.
Jedynym rozwiązaniem, które powinno mieć zastosowanie, jest owinięcie dzieci w inny pojemnik, tak aby rodzic stał się dziadkiem, a następnie zastosowanie wyściółki do opakowania / rodzica nowego dziecka. Lub możesz bezpośrednio zastosować wyściółkę do dzieci.
W Twoim przypadku:
źródło
Można to było łatwo zrobić przy użyciu dodatkowego poziomu Div.
Demo: https://jsfiddle.net/soxv3vr0/
źródło
dodaj dopełnienie: dziedzicz w swojej pozycji bezwzględnej
źródło