contain
Obiecuje przeglądarce, że wnętrze elementu nie wpływa na resztę strony, więc może ona ograniczyć przeliczanie układu i rysowanie.
- Wartość domyślna
none- Dziedziczona
- Nie
- Animowalna
- nie
- Dotyczy
- wszystkie elementy, ale size, layout i paint nie działają na zwykłych elementach liniowych i wewnętrznych elementach tabel (poza komórkami)
- JavaScript
element.style.contain = "content"
Przykład
#.feed {
display: grid;
gap: 8px;
}
.feed-item {
contain: content;
padding: 10px 12px;
border-radius: 10px;
background: #18181b;
}<ul class="feed" style="margin: 0; padding: 0; list-style: none;">
<li class="feed-item"><strong>Ania</strong> ukończyła moduł Flexbox <small style="color: #a1a1aa;">· 2 min temu</small></li>
<li class="feed-item"><strong>Kuba</strong> ma już 7 dni serii <small style="color: #a1a1aa;">· 5 min temu</small></li>
<li class="feed-item"><strong>Ola</strong> dołączyła do świata Python <small style="color: #a1a1aa;">· 12 min temu</small></li>
</ul>Każdy wpis jest odgrodzony od reszty. Gdy w jednym zmieni się coś, co nie wpływa na jego rozmiar, na przykład licznik polubień, przeglądarka może przeliczyć tylko ten wpis zamiast całej strony. content nie wymaga podawania wymiarów, więc wpisy dalej dopasowują wysokość do treści.
Definicja i zastosowanie
#Właściwość contain pozwala odgrodzić fragment strony od reszty. Deklarujesz, że to, co dzieje się w środku elementu, nie wpłynie na otoczenie, a przeglądarka może wtedy przeliczać i malować tylko ten fragment. Przydaje się w długich listach, widżetach i panelach, które często się zmieniają.
Rodzaje zawierania można łączyć: size (rozmiar elementu nie zależy od treści), inline-size (to samo tylko dla rozmiaru liniowego), layout (układ w środku nie wpływa na zewnątrz), paint (potomkowie nie rysują się poza elementem) i style (liczniki CSS zmieniane w środku nie działają poza elementem). Skrót content oznacza layout paint style, a strict to wszystkie te trzy razem z size.
Każdy rodzaj ma widoczne skutki uboczne. Przy layout i paint element staje się blokiem zawierającym dla potomków z position: absolute i fixed oraz tworzy nowy kontekst stosu. paint dodatkowo przycina wszystko, co wystaje, podobnie jak overflow: clip. Przy size element bez podanych wymiarów jest mierzony tak, jakby był pusty, więc jego wysokość spada do zera.
Na co dzień rzadko ustawia się contain ręcznie, bo często robią to za Ciebie inne właściwości: container-type włącza zawieranie rozmiaru, a content-visibility: auto włącza zawieranie i dodatkowo pomija renderowanie fragmentów poza ekranem.
Składnia
#contain: none | strict | content | [ [ size | inline-size ] || layout || style || paint ];Wartości
#- Brak zawierania. Plakietka ustawia się względem zewnętrznej ramki, bo to ona ma
position: relative. - Karta staje się blokiem zawierającym, więc plakietka przeskakuje do jej rogu. Nic nie jest przycinane.
- Plakietka też trafia do rogu karty, ale jej część wystająca poza kartę zostaje ucięta.
- Wysokość karty przestaje zależeć od treści. Bez podanego rozmiaru karta zapada się do samego paddingu, a tekst wylewa się poniżej.
layout paint style
Najbezpieczniejszy zestaw: karta izoluje układ i rysowanie, ale nadal dopasowuje wysokość do treści. Wygląda tak samo jakpaint.size layout paint style
Wszystko naraz. Karta bez wymiarów zapada się, apaintprzycina całą treść, więc zostaje pusty pasek. Używaj tylko z ustalonym rozmiarem.
Wartości w praktyce
#none
position: relative..demo { contain: none; }layout
.demo { contain: layout; }paint
.demo { contain: paint; }size
.demo { contain: size; }content
paint..demo { contain: content; }strict
paint przycina całą treść, więc zostaje pusty pasek. Używaj tylko z ustalonym rozmiarem..demo { contain: strict; }Obsługa przeglądarek
#Szeroko dostępne · od 2022 roku
Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.
- Chrome
- Edge
- Firefox
- Safari
Dobre praktyki
#contain: contentto rozsądny wybór dla niezależnych widżetów i elementów długich list. Nie wymaga wymiarów i rzadko coś psuje, o ile nic nie musi wystawać poza element.sizeistrictstosuj tylko z ustalonymi wymiarami albo razem zcontain-intrinsic-size, inaczej element zapadnie się do zera.- Jeśli po dodaniu
containokno zposition: fixedprzestało zakrywać cały ekran, to skutek nowego bloku zawierającego. Przenieś okno poza zawierany element albo użyj<dialog>otwieranego metodąshowModal().
Powiązane hasła
#- content-visibilityPozwala przeglądarce pominąć renderowanie treści, której nie widać, i dzięki temu przyspieszyć długie strony.
- container-typeZamienia element w kontener, o którego rozmiar mogą pytać reguły @container. Obejmuje też container-name i skrót container.
- overflowDecyduje, co zrobić z treścią, która nie mieści się w elemencie.
- positionWybiera sposób pozycjonowania elementu: w przepływie, względnie, absolutnie, na stałe lub przyklejony.
- z-indexUstala, który element leży wyżej, gdy elementy na siebie nachodzą.
Widzisz błąd albo brakuje przykładu? Napisz do nas.