css - 制作一个带有 z 平移背景的类似于抠图的 div
问题描述
我想制作具有滚动时具有这种 3d 效果的背景的 div,可以通过translateZ
. 最后它应该看起来像切口或窗口,通过它们你可以看到(背景)图像。
编辑:因此,如果您滚动页面,您可以看到这些框/切口,但其中的图像在滚动时移动速度较慢,以创建它们更远的效果。编辑结束
我的想法是为剪切设置一个 div,然后在其中设置另一个 div 作为背景。所以,我设置了它,它没有工作。事实证明,overflow: hidden;
外部 div 的 以某种方式阻止了transform: translateZ(-5px) scale(1.05);
其子 div 的 。
这是我到目前为止所得到的:
body {
perspective: 100px;
transform-style: preserve-3d;
overflow-x: hidden;
overflow-y: scroll;
}
#artwork, #photos {
width: 800px;
padding: 0 50px;
box-sizing: border-box;
display: flex;
justify-content: space-between;
}
.pic {
/*position: relative;*/
width: 200px;
height: 100px;
display: inline-block;
background: #aaa;
border-radius: 10px;
box-shadow: inset 0 10px 30px rgba(0,0,0,.3);
}
#artwork > * {
overflow: hidden;
}
.pic div {
position: absolute;
width: 200px;
height: 110px;
background: #660; /*couldn't put an image here*/
background-size: cover;
transform: translateZ(-5px) scale(1.05);
}
<section id="artwork">
<div class="pic"><div></div></div>
<div class="pic"><div></div></div>
<div class="pic"><div></div></div>
</section>
PS:我不想通过 JavaScript 来实现效果,因为它在大多数计算机上运行不顺畅。
编辑 n°2:到目前为止我的方法:
- 制作额外的刻度边框以覆盖图像 div 的重叠部分;而不是使用overflow: hidden
>> 部分有时仍会在某些屏幕尺寸上重叠,并且需要大量空间
- 创建一个clip-path
用作overflow: hidden
>> 剪辑路径也会破坏translateZ
- 在外部和内部 div 上玩弄display
>>position
唯一解决方案没有切口
- 将外部 div 的父级 Z 平移到更远的地方,然后再次关闭外部 div >> 仍然被overflow: hidden;
解决方案
我找到了一种解决方法,尽管这是一种妥协,因为边界半径不起作用。我在外部 div 的背景颜色中添加了粗边框,并将内部 div 的 z-index 设置为负值。
body {
height: 200px;
perspective: 100px;
transform-style: preserve-3d;
overflow-x: hidden;
overflow-y: scroll;
}
#artwork {
width: 800px
padding: 0 50px;
box-sizing: border-box;
display: flex;
justify-content: space-between;
}
.pic {
width: 200px;
height: 100px;
margin: -40px;
display: inline-block;
background: transparent;
border: 40px solid hsl(30, 50%, 90%);
box-shadow: inset 0 10px 30px rgba(0,0,0,.3);
}
.pic div {
position: absolute;
width: 200px;
height: 110px;
background: linear-gradient(135deg, rgba(240,183,161,1) 0%,rgba(140,51,16,1) 50%,rgba(117,34,1,1) 51%,rgba(191,110,78,1) 100%);
transform: translateZ(-5px) scale(1.05) translateY(-1vw);
z-index: -20;
}
#artwork div:nth-child(2) div, #photos div:nth-child(2) div {transform: translateZ(-5px) scale(1.05) translateX(-1.5vw) translateY(-1vw);}
#artwork div:nth-child(4) div, #photos div:nth-child(4) div {transform: translateZ(-5px) scale(1.05) translateX(1.5vw) translateY(-1vw);}
<br><br><br><br><br><br><br>
<section id="artwork">
<div class="pic"><div></div></div>
<div class="pic"><div></div></div>
<div class="pic"><div></div></div>
</section>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
由于某种原因,该代码段在这里不起作用。但是对我来说,它可以在浏览器中使用。如果有人可以提出另一种可能的解决方案,那就太好了,因为这个解决方案只适用于某些屏幕尺寸。
推荐阅读
- php - 根据 laravel 中复选框的选择计算总值
- java - 如果将 HashMap 转换为数组,为什么将数组初始化为 >0 将不起作用
- css - 使用引导程序 5 为列创建不同的高度
- google-cloud-platform - 裁剪功能在 Google Transcoder API 中不起作用
- javascript - D.JS MYSQL 行问题
- google-apps-script - 用于发送电子邮件的 Google Apps 脚本包含多行数据
- amazon-web-services - Gitlab PreReceive hook 被拒绝,但没有配置 hooks
- reactjs - 添加节点模块导致与其他节点模块冲突
- python - Pyproject依赖与构建系统需要?
- .net - Office 365 - “535:5.7.3 身份验证不成功”