Utilizzo: prima dello pseudo elemento CSS per aggiungere un'immagine al modale


116

Ho una classe CSS Modalche è assolutamente posizionata, z-indexed sopra il suo genitore e ben posizionata con JQuery. Voglio aggiungere un'immagine accento circonflesso (^) nella parte superiore della casella modale e stavo cercando di utilizzare il:before pseudo selettore CSS per farlo in modo pulito.

L'immagine deve essere posizionata in modo assoluto e z-indexed sopra il modale, ma non ho trovato alcun modo per aggiungere la classe appropriata all'immagine contentnell'attributo:

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

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

Seconda migliore opzione: posso aggiungere gli stili in linea nell'attributo di contenuto?

Risposte:


175

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

:aftere :beforecon contentsono bene utilizzare come sono supportate in tutti i principali browser diverso da Internet Explorer almeno 5 versioni indietro. Internet Explorer ha il supporto completo nella versione 9+ e un supporto parziale nella versione 8.

È questo quello che stai cercando?

.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;
}

In caso contrario, puoi spiegare un po 'meglio?

oppure potresti usare jQuery, come ha detto Joshua:

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


2
Questo. Anche il punto di Joshua sulla compatibilità del browser è giusto: IE8 rende l'immagine nel contenuto: after, ma non ne renderà le parti che si trovano al di fuori del bordo del genitore.
RSG

Ora (nel 2017), IE 11 è l'unica versione di IE ancora supportata da Microsoft; quindi, non ha molto senso preoccuparsi della compatibilità con IE8. Inoltre, una soluzione CSS è quasi sempre migliore della soluzione jQuery perché tende a caricarsi molto più velocemente e jQuery può causare sfarfallio dello schermo riscrivendo il layout dopo il caricamento della pagina.
Nosajimiki

1
@Nosajimiki se ti devi preoccupare o meno dei browser meno recenti dipende principalmente dai tuoi visitatori.
Jose Faeti

35

Dovresti usare l'attributo background per dare un'immagine a quell'elemento, e io userei :: after invece di prima, in questo modo dovrebbe essere già disegnato sopra il tuo elemento.

.Modal:before{
  content: '';
  background:url('blackCarrot.png');
  width: /* width of the image */;
  height: /* height of the image */;
  display: block;
}

Grazie per il suggerimento: il modale ha un bordo, quindi non credo di poter usare l'immagine di sfondo per posizionare l'immagine della carota sopra il bordo / colore bg secondo necessità.
RSG

Perchè no? se posizioni assolutamente quello pseudo elemento puoi spostarlo con i margini. Verrà disegnato sopra i bordi degli altri elementi e / o il colore bg.
Jose Faeti

L'immagine di sfondo non può estendersi al di fuori del bordo del div?
RSG

12
Probabilmente dovrai aggiungere un contenuto: ''; a questo per farlo apparire
Willster

13

1.questa è la mia risposta al tuo problema.

.ModalCarrot::before {
content:'';
background: url('blackCarrot.png'); /*url of image*/
height: 16px; /*height of image*/
width: 33px;  /*width of image*/
position: absolute;
}

5
Ho aggiunto background-size: 33px 16px; background-repeat: no-repeat;in scala l'immagine!
Hasse Björk,

-4

I contenuti e le versioni precedenti sono entrambi altamente inaffidabili nei browser. Suggerirei di attenersi a jQuery per ottenere questo risultato. Non sono sicuro di cosa stai facendo per capire se questa carota deve essere aggiunta o meno, ma dovresti farti un'idea generale:

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

1
Questo mi rende triste. Abbiamo un set fortunatamente limitato di browser mirati, quindi sono ancora interessato a ciò che è possibile con i CSS.
RSG

Anche con il contenuto ampiamente utilizzato in CSS3, da quello che ho visto è ancora uno di quelli che non sono completamente supportati da nessuna parte. Credo che questo abbia a che fare con una certa paura di poter iniettare cose malvagie. Inoltre, credo che il contenuto abbia bisogno di un elemento già esistente a cui iniettare, non sono sicuro di poter manipolare il DOM così tanto da solo.
Joshua

4
Questa risposta è sbagliata perché ha un supporto inaffidabile su tutti i browser. Contente after/beforesono molto affidabili su ogni singolo browser principale, funziona da ie8, almeno FF3.5, almeno Chrome 9, almeno Opera 10.6, almeno Safari 3.2, ogni versione di iOS Safari, ogni versione di Opera mini, ogni versione di Opera Mobile e sempre la versione del browser Android. se vuoi sapere se qualcosa è supportato cross-browser, controlla: caniuse.com/#search=:after
android.nick

Solo perché Internet dice che lo è, non significa che sia vero. Lavora con loro, agiscono in modo diverso in ogni browser. E IE 7 è ancora un browser molto popolare, che non supporta nessuno dei due.
Joshua,

3
In realtà, si sta meglio con CSSoltre JavaScriptsu questo. Non importa quanto sia all'avanguardia il browser, l'utente può comunque averlo JavaScriptdisabilitato ... Fortunatamente in questo caso i selettori :beforee :aftersono ampiamente supportati; quirksmode.org/css/selectors
Steve Buzonas
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.