2013-04-23 12 views
6

Mam bardzo specyficzny problem, ponieważ próbuję stworzyć nawigację, która ma kąty używając czysto CSS bez obrazów lub javascript. Zorientowałem się, że działa idealnie, ale problem, który napotykam, polega na tym, że IE 9 i Chrome wyglądają inaczej. Mogę obaj pracować, zmieniając marginesy pseudo elementów, ale wolałbym, aby jedno rozwiązanie działało w obu. Jeśli ktokolwiek może zrozumieć, dlaczego marginesy są różne i dać mi jedno rozwiązanie CSS do pracy w obu przeglądarkach, byłoby świetnie. W przeciwnym razie będę musiał dodać oddzielną klasę dla IE i zmusić ją do pracy przy użyciu oddzielnego wpisu CSS.Pseudoelementy CSS: before &: after work inaczej w Internet Explorerze

Oto jsfiddle pracować arrow-nav

Oto 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> 

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

Czy korzystal arkusza stylów CSS resetowania, aby zmniejszyć/usunąć domyślnych różnych przeglądarkach? –

+1

Nie mogę uruchomić go w IE7 lub 8 ani w przeglądarkach Mozilli. To ogromny kawał użytkowników! Czy to coś wewnętrznego? A jeśli tak, to czy są jakieś standardowe moduły/wtyczki na komputerach użytkowników? Po prostu pytam, czy jest to strona wewnętrzna firmy, która często ma zmienione przeglądarki. –

+0

': before' i': after' działają w IE8 (ale nie IE7) - http://caniuse.com/#feat=css-gencontent. Zobacz moją odpowiedź poniżej dla rozwiązania, które będzie działać w IE8 + – ryanbrill

Odpowiedz

7

Można to naprawić za pomocą pozycjonowania bezwzględnego na elementach pseudo. Aby to działało poprawnie, ustaw pozycję względną (co spowoduje, że elementy umieszczone absolutnie w niej będą względne względem li). Następnie aktualizowania położenia elementów pseudo używać left zamiast margin-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

To dziwne, że pracowałem z CSS przez bardzo długi czas i nigdy nie zdawałem sobie sprawy, że podanie względnej pozycji elementu nadrzędnego pozwoliło na bezwzględne pozycjonowanie element potomny do pracy z rodzica zamiast dokumentu. Zawsze unikałem pozycjonowania absolutnego, ponieważ działa ono tylko z dokumentem. Właśnie tego szukałem i łatwo zaktualizowałem mój obecny kod. Dzięki! –

0

musisz określić pozycję dla elementów (na przykład top i left wartości). I z jakiegoś powodu, którego nie w pełni zrozumieć - aby dodać position: relative do li (nie ul):

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

+1

Dodanie 'position: relative' do' li' tworzy nowy kontekst pozycjonowania, w którym elementy umieszczone absolutnie w elemencie będą względne względem elementu nadrzędnego (zamiast dokumentu, na przykład). – ryanbrill

+0

Jestem tego świadomy. :) Zastanawiam się, czy są w tym przypadku elementy ': before' i': after', uważane za dzieci 'li'. – Kaloyan

+0

Tak, ': before' i': after' są uważane za dzieci elementu, do którego są dołączone. Staje się to oczywiste po zastosowaniu obramowania: http://tinker.io/98f9b – cimmanon

Powiązane problemy