Mam problem ze zrozumieniem zachowania :after
właściwości CSS . Zgodnie ze specyfikacją ( tutaj i tutaj ):
Jak ich nazwy wskazują, że
:before
i:after
pseudo-elementy określić lokalizację zawartości przed i po zawartości drzewa dokument elementu.
Wydaje się, że nie nakłada to ograniczeń na to, które elementy mogą mieć :after
(lub :before
) właściwość. Jednakże wydaje się, aby pracować tylko z określonych elementów ... <p>
prac, <img>
nie, <input>
nie, <table>
nie. Mógłbym przetestować więcej, ale o to chodzi. Zauważ, że wydaje się to dość spójne w różnych przeglądarkach. Co decyduje o tym, czy obiekt może przyjąć właściwość :before
i :after
?
źródło
<before></before>
w źródle coś takiego jak „ ”.<before></before>
. Powinienem był powiedzieć „udawaj DOM” czy coś. Chodziło o to, aby to pokazać:before
i:after
znaleźć się wewnątrz elementu, a nie na zewnątrz.:before
i:after
nie działa dla wymienionych elementów; mówi tylko, że nie „w pełni” definiuje, jak i to zostanie zdefiniowane w przyszłości (co do tej pory nie miało miejsca). To, co dzieje się w DOM, nie ma tutaj znaczenia. Chociaż przeglądarki nie obsługują tych pseudoelementów dla niektórych elementów, nie ma tego w specyfikacjach, tylko co robią implementacje.::before
i::after
nie działa dla elementu void (pustego), który nigdy nie ma rzeczywistej treści, przed / po której można je zastosować. Ale, co zaskakujące, działają dlahr
elementu w prawie wszystkich przeglądarkach.:before
i:after
nie są wymagane do pracy z zastępowanymi elementami, a specyfikacje CSS nie określają, jak miałyby one działać, a koncepcja zastępowanego elementu jest nieco niejasna.Specyfikacja CSS 2.1 jasno sugeruje , że mogą one działać dla zastąpionych elementów, po prostu mówiąc, że nie „w pełni” definiuje, jak. Wiąże się to z tym, że zastępowany element ma mieć własne renderowanie wizualne, które nie jest kontrolowane przez CSS, podczas gdy pseudoelementy powinny dodawać coś do zawartości elementu. W specyfikacji dodano, że zostanie to określone „bardziej szczegółowo” w przyszłej specyfikacji, ale do tej pory nie miało to miejsca.
Producenci przeglądarek postanowili po prostu uniknąć problemów, nie implementując w ogóle tych pseudoelementów dla niektórych elementów.
W ogóle nie jest jasne, co oznacza „zastąpiony element” i wydaje się, że znaczenie nieco się zmieniło. Często jest interpretowane jako oznaczające to samo co pusty element (element z
EMPTY
zadeklarowaną zawartością, tj. Element, który nie może mieć żadnej treści), ale sam CSS 2.1 pokazuje przykładowy arkusz stylów z selektorembr:before
(chociaż przeglądarki zignorowały to, implementującbr
własne sposób). Można argumentować, że coraz więcej elementów znalazło się w zakresie renderowania CSS, przynajmniej częściowo. Na przykładinput
elementem (łącznie z czcionką, kolorami itp.) Można w większości sterować za pomocą CSS w nowoczesnych przeglądarkach.Aktualne przeglądarek (Firefox, IE, Chrome) nie wydają się wspierać
:after
i:before
pseudo-elementy do pustych elementów innych niżhr
. Dlahr
IE i Chrome umieścić wygenerowany zawartość wewnątrz pudełka, która graniczy jest realizacjahr
; zawartość sprawia, że pudełko jest wyższe. Firefox umieszcza zawartość obu (!) Pseudoelementów za poziomą regułą, jaką jest jego implementacjahr
. Ta odmiana ilustruje rodzaje problemów „interakcji”, o których mowa w CSS 2.1.Często twierdzi się, że te pseudoelementy nie mogą być używane dla pustych elementów, ponieważ ich definicje HTML nie zezwalają na jakąkolwiek zawartość. To jest błąd kategorii. Reguły składniowe języka znaczników nie ograniczają tego, co możesz zrobić w CSS
Podsumowując,
:after
i:before
obecnie nie można ich używać dla pustych elementów (z wyjątkiem marginalnie dlahr
), ale jest to głównie spowodowane implementacjami i może się zmienić w przyszłości.źródło
Elementy, które nie mają tagu zamykającego, są elementami void i nie mogą wyświetlać w nich zawartości:
https://www.w3.org/TR/html5/syntax.html#void-elements
Wszystkie przeglądarki Blink, Webkit i Quantum pozwalają na tworzenie pseudoelementów tylko na polach wyboru, ale jest to kontrowersyjne, ponieważ żadna specyfikacja nie zezwala na takie zachowanie.
Tutaj przykład: https://codepen.io/equinusocio/pen/BOBaEM/
źródło