【问题标题】:How to partially round corners of given block with box-shadow, and keep unrounded corners with unrounded box-shadow (webkit and gecko)?如何用盒子阴影部分圆角给定块,并用不圆的盒子阴影(webkit和壁虎)保持不圆角?
【发布时间】:2012-07-12 22:20:26
【问题描述】:

我有一个带有多个边框的div,对于一个边框我使用box-shadow。我希望这个div 有几个圆角和一个方角。但是,每当一个角添加了border-radius0 除外)时,box-shadow 的其他角也会变为圆角(半径与border-radius 的任何指定值不同)。有没有办法为某些角设置border-radius,但不是全部,并让box-shadow 对所有角使用与border 相同的半径?

这种行为存在于 Chrome 19、Firefox 13 和 Safari 5 中,但它存在于 Internet Explorer 9 或 Opera 12 中,它们都按预期显示 box-shadow - 带有当border 的角也是正方形时,box-shadow 的角也是正方形。

代码(example):

CSS

.block1 {
    padding: 18px 14px;
    margin: 5px;
    background: #fff;
    border: 1px solid red;
    -webkit-box-shadow: 0 0 0 5px rgba(0, 57, 47, .32);
    -moz-box-shadow: 0 0 0 5px rgba(0, 57, 47, .32);
    box-shadow: 0 0 0 5px rgba(0, 57, 47, .32);
    -webkit-border-radius: 10px 0 10px 10px;
    -moz-border-radius: 10px 0 10px 10px;
    border-radius: 10px 0 10px 10px;
}
.block2 {
    padding: 18px 14px;
    margin: 5px;
    background: #fff;
    border: 1px solid red;
    -webkit-box-shadow: 0 0 0 5px rgba(0, 57, 47, .32);
    -moz-box-shadow: 0 0 0 5px rgba(0, 57, 47, .32);
    box-shadow: 0 0 0 5px rgba(0, 57, 47, .32);
}
.outer {
    border: 1px solid green;
}

HTML

<p>Top-right block corner is not rounded, but box-shadow is:</p>
<div class="outer">
    <div class="block1">
        foo
    </div>
</div>

<p>Box-shadow on block without border-radius:</p>
<div class="outer">
    <div class="block2">
        bar
    </div>
</div>

【问题讨论】:

  • 由于在您的示例中阴影不会消失,粗边框是否可以解决这个问题?不确定红色边框是用于演示还是在您的实际代码中:jsfiddle.net/cchana/3efB5/5
  • 我必须在一个元素上有多个边框 - 红色边框是强制性的,而且我还需要一个边框。我可以用伪元素解决这个问题,但问题本身仍然存在。虽然我认为这个问题更合适的地方是 webkit 和 mozilla bugtrackers...
  • 有趣的测试用例。我打算建议使用轮廓来获得第二个边框,但边框半径似乎根本不适用于该边框(至少在 chrome 中)。
  • @only,是的,这绝对看起来像一个错误。如果这不是引擎的错误,我会说这是规范 (imo) 的错误。
  • @only,您可以在提交错误报告并发布报告链接时联系我吗? (或者如果您不打算报告该错误,请告诉我。)

标签: css


【解决方案1】:

在外部 div 上使用 inset 阴影。在 chrome 中看起来不错。

小提琴更新:http://jsfiddle.net/G2bvw/1/

更新:如果你想要一个实心阴影,你不想在外部 div 上嵌入阴影并且红色边框是必须的,这应该适合你:

http://jsfiddle.net/G2bvw/3/

诀窍是用边框做阴影,用阴影做边框。

【讨论】:

  • 你打败了我,here's mine 使用 OP 的代码,只需切换边框和框阴影
  • .outer div 仅用于演示目的,我不能在其上放置任何阴影,所有样式都应应用于一个元素 - .block1
  • @stephenmurdoch,没错!差不多了,但我们现在在 Opera 中出现了 bug,在 IE9 中出现了可怕的渲染问题,在 Chrome 中出现了小问题。在 Chrome 中比较 initial blockyour solution tweaked - 解决方案中的边框比初始块上的外阴影圆一点(看起来像 1px 差异)。仍在努力,但似乎很难使这个解决方案看起来与初始块跨浏览器相同......此外,如果外部阴影有模糊,这个解决方案将不可接受。
  • @stephenmurdoch,还有一件事。如果块背景和主体背景不同 - 事情会出错,因为块背景在半透明边框上蔓延......
【解决方案2】:

改用这个 CSS(examplecomparison):

.block-fixed {

    background: #fff;

    /* Have to increase padding by 1px for inset box-shadow */
    padding: 19px 15px;

    /* Use border for outer border */
    border: 5px solid rgba(0, 57, 47, .32);

    /* Use box-shadow for inner border */
    -webkit-box-shadow: inset 0 0 0 1px red;
    -moz-box-shadow:inset 0 0 0 1px red;
    box-shadow:inset 0 0 0 1px red;

    /* Have to adjust border-radius due to switching shadow/border */
    -webkit-border-radius: 15px 0 15px 15px;
    -moz-border-radius: 15px 0 15px 15px;
    border-radius: 15px 0 15px 15px;

}

【讨论】:

  • 检查上一个答案的所有 cmets - 问题太多,无法接受此解决方案。该解决方案有点像 hack,一种仅在有限数量的用例中有用的解决方法。我认为不可能回答这个问题,因为它只是一个错误。或者答案是 - 修复浏览器中的错误。
猜你喜欢
  • 1970-01-01
  • 2014-09-15
  • 2016-10-05
  • 2016-02-20
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
相关资源
最近更新 更多