Użycie: przed pseudoelementem CSS, aby dodać obraz do modalu

116

Mam klasę CSS, Modalktóra jest pozycjonowana absolutnie, indeksowana z-indeksem nad jej rodzicem i ładnie pozycjonowana za pomocą JQuery. Chcę dodać obraz karetki (^) na górze pola modalnego i patrzyłem na użycie :beforepseudo selektora CSS, aby zrobić to czysto.

Obraz musi być pozycjonowany absolutnie i indeksowany z-indeksem powyżej modalu, ale nie znalazłem sposobu, aby dodać odpowiednią klasę do obrazu w contentatrybucie:

.Modal:before{
  content:url('blackCarrot.png') /* with class ModalCarrot ??*/
}

.ModalCarrot{
   position:absolute;
   left:50%;
   margin-left:-8px;
   top:-16px;
}

Druga najlepsza opcja - czy mogę dodać style bezpośrednio do atrybutu content?

RSG
źródło

Odpowiedzi:

175

http://caniuse.com/#search=:after

:afteri :beforeze contentto w porządku, aby używać jak są one obsługiwane w każdym większym przeglądarki innej niż Internet Explorer w wersji co najmniej 5 powrotem. Internet Explorer ma pełne wsparcie w wersji 9+ i częściowe wsparcie w wersji 8.

Czy tego szukasz?

.Modal:after{
  content:url('blackCarrot.png'); /* with class ModalCarrot ??*/
  position:relative; /*or absolute*/
  z-index:100000; /*a number that's more than the modal box*/
  left:-50px;
  top:10px;
}

.ModalCarrot{
   position:absolute;
   left:50%;
   margin-left:-8px;
   top:-16px;
}

Jeśli nie, czy możesz trochę lepiej wyjaśnić?

lub możesz użyć jQuery, jak powiedział Joshua:

$(".Modal").before("<img src='blackCarrot.png' class='ModalCarrot' />");

android.nick
źródło
2
To. Jednak uwaga Joshuy dotycząca kompatybilności przeglądarki jest również słuszna - IE8 renderuje obraz w: after content, ale nie renderuje jego części, które są poza granicami rodzica.
RSG,
Obecnie (w 2017 r.) IE 11 jest jedyną wersją IE nadal obsługiwaną przez Microsoft; więc nie ma sensu martwić się o zgodność z IE8. Ponadto rozwiązanie CSS jest prawie zawsze lepsze niż rozwiązanie jQuery, ponieważ zwykle ładuje się znacznie szybciej, a jQuery może powodować migotanie ekranu, przepisując układ po załadowaniu strony.
Nosajimiki
1
@Nosajimiki to, czy powinieneś martwić się o starsze przeglądarki, zależy głównie od odwiedzających.
Jose Faeti
35

Powinieneś użyć atrybutu background, aby nadać obraz temu elementowi, a ja użyłbym :: after zamiast before, w ten sposób powinien być już narysowany na twoim elemencie.

.Modal:before{
  content: '';
  background:url('blackCarrot.png');
  width: /* width of the image */;
  height: /* height of the image */;
  display: block;
}
Jose Faeti
źródło
Dzięki za sugestię - modal ma obramowanie, więc nie sądzę, żebym mógł użyć obrazu tła do umieszczenia obrazu marchwi nad obramowaniem / kolorem bg w razie potrzeby.
RSG,
Dlaczego nie? jeśli absolutnie ustawisz ten pseudoelement, możesz go przesuwać z marginesami. Zostanie narysowany na innych krawędziach elementów i / lub kolorze tła.
Jose Faeti
Obraz tła nie może wystawać poza granicę elementu div?
RSG,
12
Prawdopodobnie musisz dodać zawartość: ''; do tego, aby się pojawiło
Willster,
13

1. to moja odpowiedź na twój problem.

.ModalCarrot::before {
content:'';
background: url('blackCarrot.png'); /*url of image*/
height: 16px; /*height of image*/
width: 33px;  /*width of image*/
position: absolute;
}
hoang thao
źródło
5
Dodałem, background-size: 33px 16px; background-repeat: no-repeat;aby przeskalować obraz!
Hasse Björk
-4

Treść i wcześniejsze wersje są wysoce zawodne w różnych przeglądarkach. Sugerowałbym pozostanie przy jQuery, aby to osiągnąć. Nie jestem pewien, co robisz, aby dowiedzieć się, czy ta marchewka musi zostać dodana, czy nie, ale powinieneś mieć ogólny pomysł:

$(".Modal").before("<img src='blackCarrot.png' class='ModalCarrot' />");
Joshua
źródło
1
To mnie smuci. Mamy na szczęście ograniczony zestaw przeglądarek docelowych, więc nadal jestem zainteresowany tym, co jest możliwe dzięki CSS.
RSG,
Nawet jeśli zawartość jest intensywnie używana w CSS3, z tego, co widziałem, nadal jest jedną z tych, które nie są nigdzie w pełni obsługiwane. Uważam, że ma to związek z pewnym strachem przed wstrzykiwaniem złych rzeczy. Uważam też, że treść wymaga już istniejącego elementu do wstrzyknięcia - nie jestem pewien, czy potrafię samodzielnie manipulować DOM.
Joshua,
4
Ta odpowiedź jest błędna, ponieważ ma niewiarygodną obsługę w różnych przeglądarkach. Contenti after/beforesą bardzo niezawodne we wszystkich głównych przeglądarkach, działają od ie8, co najmniej FF3.5, co najmniej Chrome 9, co najmniej Opera 10.6, co najmniej Safari 3.2, każdej wersji iOS Safari, każdej wersji Opery mini, każdej wersji Opera Mobile i zawsze wersja przeglądarki Android. jeśli chcesz wiedzieć, czy coś jest obsługiwane w różnych przeglądarkach, sprawdź: caniuse.com/#search=:after
android.nick
Tylko dlatego, że Internet mówi, że tak, nie oznacza, że ​​jest to prawda. Pracuj z nimi, w każdej przeglądarce działają inaczej. IE 7 jest nadal bardzo popularną przeglądarką, która nie obsługuje żadnego z nich.
Joshua,
3
Faktycznie, jesteś lepiej z CSSnad JavaScriptna ten jeden. Bez względu na to, jak zaawansowana jest przeglądarka, użytkownik nadal może ją JavaScriptwyłączyć ... Na szczęście w tym przypadku selektory :beforei :aftersą szeroko obsługiwane; quirksmode.org/css/selectors
Steve Buzonas