【问题标题】:Overflow: hidden with border radius not working on Safari溢出:以边框半径隐藏在 Safari 上不起作用
【发布时间】:2018-08-10 11:37:44
【问题描述】:

我必须制作一个隐藏::before 的按钮,该按钮显示在:hover 上。该动画在 Chrome、IE 和 Firefox 上运行良好,但我在 Safari 上遇到了一个奇怪的问题。

溢出:隐藏正在工作,但没有边界半径。

你应该在 safari 中运行 fiddle 来查看这个问题。

谢谢!

.btn{
  border-radius: 3rem;
  cursor: pointer;
  display: inline-block;
  font-size: 15px;
  font-weight: 400;
  font-family: arial;
  overflow: hidden;
  position: relative;
  padding: 0.8rem 2.5rem;
  text-decoration: none;
  }

.btn-primary{
  background-color: blue;
  border-color: blue;
  color: white;
}

.btn-primary::before{
  background-color: deeppink;
  border-radius: 50%;
  content: '';
  color: white;
  height: 100%;
  left: 100%;
  margin: 0;
  position: absolute;
  top: 0;
  transform-origin: 100% 50%;
  transform: scale3d(1, 1.4, 1);
  transition: all 300ms cubic-bezier(0.7,0,0.9,1);
  width: 20%;
}

.btn-primary:hover::before{
  transform: scale3d(1, 5, 1);
  width: 110%;
  left: -2%;
  z-index: 0;
}

.btn-primary span{
  position: relative;
  z-index: 1;
}
<a href="#" class="btn btn-primary">
  <span>Button primary</span>
</a>

【问题讨论】:

  • 您在 Mac 或 Windows 系统上的 Safari 中尝试过吗?我对 Windows Safari 的体验是它非常有问题。
  • 我在 Mac 上试过这个
  • here这样将-webkit-标签添加到您的css时是否得到相同的结果?
  • 我在我的项目中使用了 autoprefixer,所以它会自动添加我需要的每个 -webkit 标签

标签: html css


【解决方案1】:

接受的答案有效,但确实消除了盒子阴影。我在github post 中看到的一条评论说,它也可以通过创建新的堆叠上下文(将元素移动到新的绘画层)来修复。这可以通过像

这样的小技巧来实现

transform: translateZ(0)

就我而言,overflow 和 box-shadow 都在使用此解决方案。我希望它也可以帮助其他人。

【讨论】:

  • 非常感谢。
  • 非常感谢,我花了几个星期才找到合适的解决方案!
  • 救命!正是我需要的。
  • 另一种创建新堆叠上下文的方法是使用isolation: isolate; IE 不支持,但在技术上更正确。 developer.mozilla.org/en-US/docs/Web/CSS/isolation
  • 您要将此样式添加到哪个元素?
【解决方案2】:

所以我在https://gist.github.com/ayamflow/b602ab436ac9f05660d9c15190f4fd7b 上发现了一个小技巧来解决这个问题

只需将此行添加到带有溢出的元素:

-webkit-mask-image: -webkit-radial-gradient(white, black);

如果有人找到其他解决方案,请告诉我 :)

.btn{

  /* Add this line */
  -webkit-mask-image: -webkit-radial-gradient(white, black);

  border-radius: 3rem;
  cursor: pointer;
  display: inline-block;
  font-size: 15px;
  font-weight: 400;
  font-family: arial;
  overflow: hidden;
  position: relative;
  padding: 0.8rem 2.5rem;
  text-decoration: none;
  }

.btn-primary{
  background-color: blue;
  border-color: blue;
  color: white;
}

.btn-primary::before{
  background-color: deeppink;
  border-radius: 50%;
  content: '';
  color: white;
  height: 100%;
  left: 100%;
  margin: 0;
  position: absolute;
  top: 0;
  transform-origin: 100% 50%;
  transform: scale3d(1, 1.4, 1);
  transition: all 300ms cubic-bezier(0.7,0,0.9,1);
  width: 20%;
}

.btn-primary:hover::before{
  transform: scale3d(1, 5, 1);
  width: 110%;
  left: -2%;
  z-index: 0;
}

.btn-primary span{
  position: relative;
  z-index: 1;
}
<a href="#" class="btn btn-primary">
  <span>Button primary</span>
</a>

【讨论】:

  • 对我来说就像一个魅力,谢谢!唯一的陷阱是,我不得不将我的 box-shadow 移动到另一个 div,但我可以忍受;)
  • 很棒的答案。
  • 谢谢。我很困惑/很好奇为什么这能解决问题
  • 感谢您的解决方案! iOS 中的这个溢出错误让我抓狂。
【解决方案3】:

will-change: transform; on element with overflow: hidden; 为我解决了问题

【讨论】:

  • 小心,IE 和 Edge 早期版本根本不支持 will-change 属性。
  • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
  • 我相信所有这些答案的症结在于它们将 div 撞到了一个新层(即transform: translateZ(0)),并且由于某种原因在 Safari 上达到了预期的效果
【解决方案4】:

这是由 Safari 使用的渲染引擎 WebKit 中的几个未解决的错误之一引起的:

正如 Simon Fraser 在第二个链接中所写:

您可以在最近的构建中解决这个问题,方法是将具有溢出:隐藏的元素设置为 stacking context(例如位置:相对,z-index:0)。

这可能是最简单的解决方案,因为与此处的其他一些答案不同,它并非不必要地introduce render layers

【讨论】:

    【解决方案5】:

    对我来说,为带有border-radius 的项目添加高z-index 设置就足以解决问题。

    【讨论】:

    • 这对我也有帮助!从来没想过。谢谢!
    • 我发现设置z-index: 0就够了,不应该有后果。
    猜你喜欢
    • 2014-11-11
    • 2017-02-03
    • 2017-03-01
    • 1970-01-01
    • 2012-05-06
    • 2020-11-04
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多