【问题标题】:How to transparently mask an object so only the background will be visible?如何透明地遮盖对象,以便只有背景可见?
【发布时间】:2020-02-06 21:08:58
【问题描述】:

目标

我想创建一个动画多边形,它的部分被修剪/剪切/遮蔽,因此它下面的图层/元素/背景可以像这样看到:

我用 CSS3 变换创建了一个动画。它是一个旋转块,看起来它的底部在移动时被修剪掉了。我希望修剪的部分显示旋转块背后/下方的实际内容(因此它的背景)。

我尝试了什么

幻觉解决方案

对于单色背景,您可以在动画顶部添加一个形状,使其具有被切断的错觉。

这显然不适用于图片:

有限的解决方案

如果您需要将矩形的边切掉,您可以通过父元素来完成,但这有明显的局限性。如何用任意多边形做这样的事情?可以用 CSS 遮罩吗?

body {
  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAG0lEQVQYV2NMqL7ty4ADMIIkF7SqbsYmP+gkAbAbGgsk/ddhAAAAAElFTkSuQmCC);
}

.center {
  width: 200px;
  margin: 0 auto;
  padding-top: 50px;
  height: 100px;
  overflow: hidden;
}

.block {
  height: 100px;
  width: 100px;
  background-color: red;
  z-index: -1;
  transition: transform 1000s 0s linear;
  margin-left: 50px;
}

@keyframes rotating {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

.rotate {
  animation: rotating 2s linear infinite;
}
<div class="center">
  <div class="block rotate"></div>
</div>

【问题讨论】:

  • 似乎 webkit 应该能够使用 -webkit-clip-path css 属性解决您的问题。 jsfiddle.net/DpfW7/3 但不幸的是,它在开始动画时完全删除了对象。您仍然可以在没有动画的情况下使用它。
  • 背景位置也是一个提示:jsfiddle.net/DpfW7/4 非常接近目标,缺少封面部分...

标签: html css css-animations mask css-transforms


【解决方案1】:

要触发 z-index,您需要将位置重置为:相对、固定或绝对。

DEMO

#mask {
    height: 100px;
    width: 100px;
    background-color: white;
    z-index: 1;
    position:relative;/* to trigger z-index */
}

看起来像上一个示例,背景位置可能是有效的。 DEMO box cut off from background

基本上:

body {
    background: url('http://takeinsocialmedia.com/wp-content/uploads/2014/02/cute-kitten-images-photos-0223204033.jpg') fixed;
    background-size:100vw auto;
    background-repeat: no-repeat;
}

#mask {
    height: 100px;
    width: 100px;
    background:url('http://takeinsocialmedia.com/wp-content/uploads/2014/02/cute-kitten-images-photos-0223204033.jpg') fixed;
    background-size:100vw auto;
    z-index: 1;
    position:relative;
}

很遗憾,这不适用于background-size:cover;,因为body#mask 的大小不同。 background-size 需要通过 JavaScript 设置 onloadonresize for #mask

【讨论】:

  • 你可能误解了我的问题。我对z-index 没有意见。白色盒子应该在红色盒子的上面。那是修剪底部的东西。我的问题是白框应该是“透明的”,同时仍然修剪红框的底部。请参阅Wezelkrozum"s solution,它有效,但不幸的是仅适用于这个特定示例。
  • @totymedli 啊,好吧,我以为你在处理 z-index 的地方没有被正确触发。对于您要查找的内容,通常使用 background-position:fixed 。这工作正常,但是,这里背景大小的封面带来了问题,身体和面具的大小不一样。妥协的可能是使用大众单位。 jsfiddle.net/DpfW7/4 。否则,您将需要使用 javascript 来检索高度和宽度以适应 #mask 的背景大小,以便它遵循正文背景的大小。 ...
  • 我也想过那个解决方案。但它真的很容易掉下来。响应式设计、动态内容,还有一些很容易搞砸的东西。
  • @totymedli 在我看来,你剩下的是完整的 SVG 或 bg-position + javascript,看过 clip() css 吗?祝你好运
  • 是的,我也考虑过动画 SVG,但是我在那里面临同样的情况。我不知道我在那里是否有更好的选择。您的解决方案仍然是目前最接近我想要的解决方案。
【解决方案2】:

你有没有试过用比红框更大的 z-index 让白框不可见?

【讨论】:

  • 这样修剪就消失了。那么屏蔽的意义何在?
  • 我的第一个想法也是,但后来我又读到了问题...... :)
【解决方案3】:

给你:http://jsfiddle.net/QxG74/2/ 可爱的kitting版:http://jsfiddle.net/DpfW7/1/

将中心 div 的高度设为 100 像素,并将溢出设置为隐藏。这样旋转的正方形就在底部被修剪了。

#center {
   width: 200px;
   height: 100px;
   overflow: hidden;
}

【讨论】:

  • 谢谢,这是这个特定示例的解决方案。最初的示例可能不是最好的演示。请参阅我的编辑:“即使白色块在旋转三角形内或如果它是一个圆圈,它也应该可以工作”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 2011-09-10
  • 2021-03-11
  • 2018-06-01
  • 2014-03-22
相关资源
最近更新 更多