2013-04-23 10 views
6

画像やJavaScriptなしで純粋にCSSを使用している角度を持つナビゲーションを作成しようとしているので、非常に具体的な問題があります。私はそれが完全に動作するようにそれを考え出しましたが、私が遭遇する問題は、IE 9とChromeが異なって見えるということです。擬似要素のマージンを変更することで両方を動作させることができますが、両方で動作する単一のソリューションを好むでしょう。誰がなぜマージンが異なるのかを理解できれば、両方のブラウザでうまくいくような単一のCSSソリューションを私に与えることができます。さもなければ私はIEのための別のクラスを追加し、それが別々のCSSのエントリを使用して動作するように強制する必要があります。ここで CSS擬似要素:前と後の動作はInternet Explorerで異なって

はここ arrow-nav

で動作するように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 jsfiddleされている

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

あなたはクロスブラウザのデフォルトを削除/減らすためにCSS-リセットスタイルシートを使用することがありますか? –

+1

私はIE7や8やMozillaブラウザで動作させることができません。それはユーザーの巨大な塊です!これは何かのための内部ですか?もしそうなら、ユーザマシンに標準インストールモジュール/プラグインがありますか?これは非常に頻繁に変更されたブラウザを持っている会社の社内サイトの場合にのみ尋ねるだけです。 –

+0

':before'と':after'はIE8で動作しますが(IE7では動作しません) - http://caniuse.com/#feat=css-gencontent IE8 + – ryanbrill

答えて

7

あなたは、擬似要素の絶対位置を使用してこの問題を解決することができます。これを正しく動作させるには、ul liの位置を相対位置に設定します(これにより、絶対的に配置された要素がliに対して相対的になります)。その後、代わりにmargin-leftleftを使用する擬似要素の位置を更新します。

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

私は非常に長い時間のためにCSSで働いていると奇妙です親要素の相対位置を与えることは、子要素は文書の代わりに親と一緒に作業する。私はいつも絶対的な位置づけを避けました。なぜなら、それはその文書でしか働かないからです。これはまさに私が探していたもので、現在のコードを簡単に更新することです。ありがとう! –

0

あなたは一例topための要素(のための位置を指定する必要があり、 left値)。そして、私は完全には理解していないいくつかの理由のために - li(ないul)にposition: relativeを追加する:

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

+1

で動作する解決策については私の答えを参照してください。 'li'に' position:relative'を追加すると、要素内に絶対配置された要素がドキュメントの代わりに親要素と相対的な位置に新しいコンテキストが作成されます。例えば)。 – ryanbrill

+0

私はそれを認識しています。 :)私には、 ':before'と':after'要素が、 'li'の子とみなされるのが不思議です。 – Kaloyan

+0

はい、 ':before'と':after'は、それらが接続されている要素の子とみなされます。それは周りに境界線を適用するときに明らかになります:http://tinker.io/98f9b – cimmanon

関連する問題