2013-04-23 42 views
6

我有一个非常具体的问题,因为我试图创建一个导航,使用纯粹的CSS没有图像或JavaScript的角度。我已经弄明白了,所以它可以很好地工作,但我遇到的问题是IE 9和Chrome看起来不一样。我可以通过改变伪元素的边界来让它们工作,但我更喜欢单个解决方案在两者中工作。如果任何人都能弄清楚为什么边距不同,并给我一个单一的CSS解决方案在两个浏览器中工作,那将是非常棒的。否则,我将不得不为IE添加一个单独的类,并强制它使用单独的CSS条目工作。CSS伪元素:之前和:在Internet Explorer中以不同的方式工作

这里是的jsfiddle与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

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复位样式表来减少/消除跨浏览器的默认设置? – 2013-04-23 16:17:55

+1

我无法在IE7或8以及Mozilla浏览器中使用它。这是一大块用户!这是为了内部的东西吗?如果是这样,用户机器上是否有标准安装模块/插件?只是为了防止这种情况发生在经常改变浏览器的公司内部网站上。 – 2013-04-23 16:23:29

+0

':之前'和':之后'工作在IE8(但不是IE7) - http://caniuse.com/#feat=css-gencontent。在IE8 + – ryanbrill 2013-04-23 16:29:56

回答

7

您可以通过使用伪元素绝对定位解决这个问题。为了使其正确工作,请将ul li的位置设置为相对位置(这将导致绝对位于其中的元素相对于li)。然后,更新伪元素的位置使用left,而不是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

奇怪的是,我已经与CSS工作了很长时间,从来没有意识到给出一个父元素相对位置允许的绝对定位子元素与父代而不是文档一起使用。我总是避免绝对定位,因为它只与文档一起工作。这正是我正在寻找并简单更新我当前的代码。谢谢! – 2013-04-23 17:34:41

0

你需要指定的元素(例如top位置和left值)。出于某种原因,我不完全理解 - 要添加position: relativeli(不是ul):

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

+1

中查看我的答案以解决方案将'position:relative'添加到'li'会创建一个新的定位上下文,其中绝对位于元素内的元素将相对于父元素(而不是文档,例如)。 – ryanbrill 2013-04-23 16:28:34

+0

我意识到这一点。 :)让我想知道的是,在这种情况下,':before'和':after'元素考虑了'li'的子元素。 – Kaloyan 2013-04-23 16:31:33

+0

是的,':之前'和':之后'被视为他们所属元素的子项。它变得很明显,当你在它周围应用一个边框时:http://tinker.io/98f9b – cimmanon 2013-04-23 17:04:19

相关问题