【问题标题】:How to fix IE rendering of border-radius combined with box-shadow?如何修复边框半径与框阴影相结合的 IE 渲染?
【发布时间】:2017-12-05 09:34:21
【问题描述】:

有人知道如何在 IE 9 和 10 中“修复”box-shadow 和border-radius 组合的渲染吗?

使用嵌入阴影时尤其明显。 IE中阴影的半径与webkit/gecko相比差别很大...

在这张图片中,您可以看到问题所在。左边是一个带有嵌入框阴影的按钮,右边是没有框阴影的按钮。 (不要介意不同的字体渲染)

这是使用的代码:http://dabblet.com/gist/5450815

【问题讨论】:

  • 好问题。浏览W3 specs,我不确定哪个用户代理正确(或者是否定义了此行为)。我找不到 WHATWG 的任何细节(这通常深入到浏览器实现中)。似乎盒子阴影的内半径取了边框的 半径,所以像 this 这样的东西实际上匹配正确。但是,当没有边框时,外部宽度的这种推断会导致您看到的不良结果。我找不到解决方法。
  • Chrome、Firefox 和 Opera 都正确地将插入浏览器宽度解释为相对于元素内部显示的空间。而 IE 从不费心去区分内部空间和外部空间,并且总是使用外部边界的曲率。在这里查看:dabblet.com/gist/5503928 IE 的嵌入框阴影与 10px 外边框的曲率完美匹配。其余的不是简单地反转边框样式,而是根据元素的边界重新计算它。 IE 的实现是错误的,老实说似乎很懒惰。

标签: internet-explorer css


【解决方案1】:

只有当嵌入阴影的传播触发的“阴影半径”大于 IE 中边框半径的大小时,才会出现此问题。在您的示例中将边框半径设置为 50px,它在 IE 和 Chrome 中看起来相同。

如果您需要更大的 box-shadow 传播,那么您可以只使用边框,至少在您的示例中可以做到这一点。示例:http://dabblet.com/gist/5501799

您可能会看到的另一个问题是 IE 和 Chrome 呈现的 box-shadow 模糊完全不同,但我假设您因此没有在示例中使用它...

【讨论】:

  • 不理想,但我猜是最好的解决方案。问题是边框必须在悬停时设置动画,所以按钮会跳一点:/
  • 我只是尝试同时为边框和填充设置动画:确实看起来很跳跃:jsfiddle.net/w1ll3m/TkpQm。也许box-sizing: border-box; 可以通过固定按钮的总宽度以某种方式帮助您。
【解决方案2】:

我已经尝试过并且有效的快速(半脏)解决方案是 div 内的 div。如果这样做,请告诉我。

HTML 代码:

</head>
<body>
 <div class="box"><div class="box-inside"></div></div>
 </body>
</html>

CSS 代码:

.box {
border-radius: 15px;
box-shadow: inset 0 0 0 10px #000;
width: 200px;
height: 100px;
background: #000;
}
.box-inside {
border-radius: 15px;
box-shadow: inset 0 0 0 10px #fff;
width: 175px;
height: 75px;
position: relative;
top: 12%;
left: 6%;
background: #fff;
}

我的jsfiddle

【讨论】:

【解决方案3】:

试试这个,添加这个角色:

filter:progid:DXImageTransform.Microsoft.Blur(PixelRadius='15', MakeShadow='true', ShadowOpacity='1');

【讨论】:

    【解决方案4】:

    您可以安全地使用inset 框阴影来模拟现代浏览器中的边框,但 IE 会错误地渲染半径。您可以通过让 IE 回退到默认的“初始”样式来解决此问题。

    .Button {
      color: #0ac;
      background-color: #fff;
      border-radius: 8px;
      box-shadow: inset 0 0 0 2px #0ac;
    }
    
    /* IE media query hack */
    @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
      .Button {
        box-shadow: 0 0 0 2px #0ac;
      }
    }
    

    【讨论】:

      【解决方案5】:

      试试这个: //CSS

      .box {
          border-radius: 15px;
          -moz-border-radius: 15px;
          -webkit-border-radius: 15px;
          -khtml-border-radius: 15px;
      
          -moz-box-shadow: inset 0 0 10px #000;
          -webkit-box-shadow: inset 0 0 10px #000;
          box-shadow: inset 0 0 10px #000;
      
          width: 200px;
          height: 100px;
      }
      

      对于 IE8,您必须包含 CSS3 pie(pie.htc) 文件,然后它才能在 IE8 上运行。

      您可以从这里下载:http://css3pie.com/

      【讨论】:

      • 问题不在于它不渲染。它只是无法正确渲染。
      • 上面的CSS你加了吗?它将起作用添加下面的 CSS .box {border:5px solid #000;边框半径:15px; -moz-边界半径:15px; -webkit-border-radius:15px; -khtml-border-radius:15px; -moz-box-shadow: 插图 0 0 10px #000; -webkit-box-shadow: 插图 0 0 10px #000;盒子阴影:插图 0 0 10px #000;宽度:200px;高度:100px; } jsfiddle.net/WcLKr
      • 就像我说的,这不是问题。注意语句中额外的 0:inset 0 0 0 10px #000。现在在 IE8 和 IE9 中测试,与 webkit/gecko 相比,它的渲染效果很差。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多