【问题标题】:CSS Pseudo-elements :before & :after work differently in Internet ExplorerCSS 伪元素 :before & :after 在 Internet Explorer 中的工作方式不同
【发布时间】:2013-04-16 22:56:36
【问题描述】:

我有一个非常具体的问题,因为我正在尝试使用没有图像或 JavaScript 的纯 CSS 创建具有角度的导航。我已经弄清楚它可以完美运行,但我遇到的问题是 IE 9 和 Chrome 看起来不同。我可以通过更改伪元素的边距来让两者都工作,但我更喜欢一个解决方案来同时工作。如果有人能弄清楚为什么边距不同,并给我一个单一的 CSS 解决方案,可以在两种浏览器中工作,那就太好了。否则我将不得不为 IE 添加一个单独的类并强制它使用单独的 CSS 条目工作。

这里是使用 arrow-nav 的 jsfiddle

这里是 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;
}

【问题讨论】:

  • 您是否使用 CSS 重置样式表来减少/删除跨浏览器默认设置?
  • 我无法让它在 IE7 或 8 以及 mozilla 浏览器中运行。庞大的用户群!这是为了内部的东西吗?如果是这样,用户机器上是否有任何标准安装模块/插件?只是询问这是针对公司内部网站的情况,该网站经常更改浏览器。
  • :before:after 在 IE8(但不是 IE7)中工作 – caniuse.com/#feat=css-gencontent。请参阅下面的答案,了解适用于 IE8+ 的解决方案

标签: html css internet-explorer pseudo-element


【解决方案1】:

您可以通过在伪元素上使用绝对定位来解决此问题。为了使其正常工作,请将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/

【讨论】:

  • 奇怪的是,我使用 CSS 工作了很长时间,却从未意识到给父元素相对位置允许子元素的绝对定位与父元素而不是文档一起使用。我总是避免使用绝对定位,因为它只适用于文档。这正是我一直在寻找的,并且更新我当前的代码很简单。谢谢!
【解决方案2】:

您需要指定元素的位置(例如topleft 值)。出于某种原因,我不完全理解 - 将position: relative 添加到li(不是ul):

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

【讨论】:

  • position: relative 添加到li 会创建一个新的定位上下文,其中绝对定位在元素内的元素将相对于父元素(例如,而不是文档)。
  • 我知道这一点。 :) 让我感到奇怪的是 :before:after 在这种情况下被认为是 li 的子元素。
  • 是的,:before:after 被认为是它们所附加的元素的子元素。当您在其周围应用边框时会变得很明显:tinker.io/98f9b
猜你喜欢
  • 2011-05-10
  • 2011-05-10
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 2020-09-20
  • 2015-05-06
  • 2021-11-03
相关资源
最近更新 更多