2013-04-23 14 views
6

Ho un problema molto specifico mentre sto cercando di creare una navigazione che abbia angoli usando puramente CSS senza immagini o javascript. L'ho capito in modo che funzioni perfettamente, ma il problema che sto incontrando è che IE 9 e Chrome sembrano diversi. Posso lavorare entrambi cambiando i margini degli pseudo elementi, ma preferirei che una soluzione singola funzionasse in entrambi. Se qualcuno riesce a capire perché i margini sono diversi e mi dà una soluzione CSS unica per lavorare su entrambi i browser sarebbe fantastico. Altrimenti dovrò aggiungere una classe separata per IE e forzarla a funzionare usando una voce CSS separata.CSS Pseudo-elementi: prima e: dopo il lavoro differentemente in Internet Explorer

Ecco il jsfiddle di lavorare con arrow-nav

Ecco l'HTML

<ul> 
    <li><a href="#" >Some Navigation</a></li> 
    <li><a href="#">More navigation</a></li> 
    <li><a href="#">Another Nav</a></li> 
    <li><a href="#">Test Nav</a></li> 
    <li><a href="#">A Test Navigation</a></li> 
</ul> 

Il CSS

ul { 
    float:right; 
    list-style-type:none; 
    margin:0; 
    padding:0; 
    width: 300px; 
} 
ul li a { 
    float:left; 
    width:300px; 
} 
ul li{ 
    float:left; 
    width: 300px; 
    height:50px; 
    line-height:50px; 
    text-indent:10%; 
    background: grey; 
    margin-bottom:10px; 
    border:1px solid black; 
} 
ul li:before { 
    content:""; 
    position:absolute; 
    margin-top:-1px; 
    border-top: 26px solid transparent; 
    border-bottom: 26px solid transparent; 
    border-right: 21px solid black; 
    margin-left:-22px; 
} 
ul li:after { 
    content:""; 
    position:absolute; 
    border-top: 25px solid transparent; 
    border-bottom: 25px solid transparent; 
    border-right: 20px solid grey; 
    margin-left:-320px; 
} 
+2

Hai usato un foglio di stile CSS-reset per ridurre/eliminare le impostazioni predefinite cross-browser? –

+1

Non riesco a farlo funzionare in IE7 o 8 né nei browser mozilla. Che un'enorme fetta di utenti! È per qualcosa di interno? E se sì, ci sono moduli/plug-in di installazione standard sulle macchine degli utenti? Basta chiedere se questo è per un sito interno di un'azienda che molto spesso ha browser alterati. –

+0

': before' e': after' funzionano in IE8 (ma non in IE7) - http://caniuse.com/#feat=css-gencontent. Vedere la mia risposta sotto per una soluzione che funzionerà in IE8 + – ryanbrill

risposta

7

È possibile risolvere questo problema utilizzando il posizionamento assoluto sugli elementi pseudo. Per fare in modo che funzioni correttamente, imposta la posizione di ul li in relativa (che farà sì che gli elementi posizionati in modo assoluto all'interno siano relativi al li). Quindi, aggiornare la posizione degli elementi pseudo da utilizzare al posto di leftmargin-left:

ul li{ 
    position: relative; // Add this. 
    float:left; 
    width: 300px; 
    height:50px; 
    line-height:50px; 
    text-indent:10%; 
    background: grey; 
    margin-bottom:10px; 
    border:1px solid black; 
} 
ul li:before { 
    content:""; 
    position:absolute; 
    margin-top:-1px; 
    border-top: 26px solid transparent; 
    border-bottom: 26px solid transparent; 
    border-right: 21px solid black; 
    left:-22px; // Update from margin-left to left 
} 
ul li:after { 
    content:""; 
    position:absolute; 
    border-top: 25px solid transparent; 
    border-bottom: 25px solid transparent; 
    border-right: 20px solid grey; 
    left:-20px; // Update from margin-left to left 
} 

http://jsfiddle.net/ryanbrill/jSdWR/5/

+4

È strano che io abbia lavorato con i CSS per un tempo molto lungo e non ho mai realizzato che dare un parente di posizione all'elemento genitore permettesse il posizionamento assoluto di l'elemento figlio per lavorare con il genitore invece del documento. Ho sempre evitato il posizionamento assoluto perché funzionava solo con il documento. Questo è esattamente quello che stavo cercando e semplice aggiornare il mio codice attuale. Grazie! –

0

È necessario specificare la posizione per gli elementi (ad esempio top e Valori left). E per qualche ragione, che io non comprendo pienamente - di aggiungere position: relative al li (non il ul):

http://jsfiddle.net/jSdWR/4/

+1

L'aggiunta di 'position: relative' al' li' crea un nuovo contesto di posizionamento, dove gli elementi posizionati assolutamente all'interno dell'elemento saranno relativi all'elemento padre (invece del documento, per esempio). – ryanbrill

+0

Ne sono consapevole. :) Ciò che mi fa meravigliare sono gli elementi ': before' e': after' considerati figli del 'li' in questo caso. – Kaloyan

+0

Sì, ': before' e': after' sono considerati figli dell'elemento a cui sono associati. Diventa ovvio quando si applica un bordo attorno ad esso: http://tinker.io/98f9b – cimmanon

Problemi correlati