gpt4 book ai didi

javascript - 如何用CSS创建图片滚动视差效果?

转载 作者:技术小花猫 更新时间:2023-10-29 12:31:02 25 4
gpt4 key购买 nike

我在网上看到这个很酷的滚动效果...

enter image description here

滚动浏览各个部分时图像与下一张图像混合的位置。我一直在尝试重现它,但我似乎无法弄清楚?如何在网络上创建这种效果?

这是我看到效果的链接... http://readingbuddysoftware.com/how-it-works/

我试过使用 position: fixed在带有 z-index 的屏幕截图上部分高于图像,但最后的屏幕截图始终在顶部。

有什么想法吗?

更新:由于各种原因(包括放置、使用倾斜...),我无法使用 background-image CSS 解决方案。我需要一个使用 <img> 的解决方案元素。

最佳答案

这可以使用 background-attchement 来完成:fixed 和两张相似的图片。

这是一个简单的例子:

body {
min-height:200vh;
margin:0;
background:url(https://picsum.photos/id/1069/150/150?grayscale) 20px 20px no-repeat;
background-attachment:fixed;
}

.box {
margin-top:220px;
height:200px;
background:url(https://picsum.photos/id/1069/150/150) 20px 20px no-repeat,
grey;
background-attachment:fixed;
}
<div class="box">

</div>

您可以轻松缩放许多图像:

body {
min-height:250vh;
margin:0;
background:url(https://picsum.photos/id/1069/150/150?grayscale) 50px 50px/auto no-repeat;
background-attachment:fixed;
}

.box {
height:200px;
background:url(https://picsum.photos/id/1069/150/150) 50px 50px/auto no-repeat,
grey;
background-attachment:fixed;
}
.box:first-child {
margin-top:200px;
}
<div class="box">
</div>
<div class="box" style="background-image:url(https://picsum.photos/id/11/150/150);background-color:yellow">
</div>
<div class="box" style="background-image:url(https://picsum.photos/id/106/150/150);background-color:pink">
</div>

您还可以考虑使用 imgposition:fixed 但您需要一些技巧来使用 clip-path overflow hidden

body {
min-height: 250vh;
margin: 0;
padding-top: 100px;
}

img {
position: fixed;
top: 50px;
left: 50px;
}

.box {
height: 200px;
background: grey;
clip-path: inset(0);
}
<div class="box">
<img src="https://picsum.photos/id/1074/200/120?grayscale">
</div>
<div class="box" style="background-color:red;">
<img src="https://picsum.photos/id/1074/200/120">
</div>
<div class="box" style="background-color:yellow;">
<img src="https://picsum.photos/id/1024/200/120?grayscale">
</div>
<div class="box" style="background-color:pink;">
<img src="https://picsum.photos/id/1024/200/120">
</div>

或者使用掩码

body {
min-height: 250vh;
margin: 0;
padding-top: 100px;
}

img {
position: fixed;
top: 50px;
left: 50px;
}

.box {
height: 200px;
background: grey;
-webkit-mask:linear-gradient(#fff,#fff);
mask:linear-gradient(#fff,#fff);
}
<div class="box">
<img src="https://picsum.photos/id/1074/200/120?grayscale">
</div>
<div class="box" style="background-color:red;">
<img src="https://picsum.photos/id/1074/200/120">
</div>
<div class="box" style="background-color:yellow;">
<img src="https://picsum.photos/id/1024/200/120?grayscale">
</div>
<div class="box" style="background-color:pink;">
<img src="https://picsum.photos/id/1024/200/120">
</div>


为了更好的支持,这里有一个与一些 JS 类似的想法,以避免使用 clip-path 或 mask

我将使用 CSS 变量更新图像的位置,但您可以轻松做到:

window.onscroll = function() {
var scroll = window.scrollY || window.scrollTop || document.getElementsByTagName("html")[0].scrollTop;
document.documentElement.style.setProperty('--scroll-var', scroll+"px");
}
:root {
--scroll-var: 0px;
}

body {
min-height: 150vh;
margin: 0;
}

img {
position: fixed;
top: 20px;
left: 20px;
}

.box {
margin-top: 220px;
height: 200px;
background: grey;
position: relative;
overflow: hidden;
}

.box img {
top: calc(-220px + 20px + var(--scroll-var));
/* margin of box + top of the other image + scroll*/
position: absolute;
}
<img src="https://picsum.photos/id/1069/150/150?grayscale">
<div class="box">
<img src="https://picsum.photos/id/1069/150/150">
</div>

有很多图片:

window.onscroll = function() {
var scroll = window.scrollY || window.scrollTop || document.getElementsByTagName("html")[0].scrollTop;
document.documentElement.style.setProperty('--scroll-var', scroll+"px");
}
:root {
--scroll-var: 0px;
}

body {
min-height: 250vh;
margin: 0;
padding-top:200px;
}

img {
position: fixed;
top: 50px;
left: 50px;
}

.box {
height: 200px;
background: grey;
position: relative;
overflow: hidden;
}
img.f1 {
top: calc(-200px + 50px + var(--scroll-var));
position: absolute;
}
img.f2 {
top: calc(-400px + 50px + var(--scroll-var));
position: absolute;
}
img.f3 {
top: calc(-600px + 50px + var(--scroll-var));
position: absolute;
}
<img src="https://picsum.photos/id/1069/100/100?grayscale">
<div class="box">
<img class="f1" src="https://picsum.photos/id/1069/100/100">
</div>
<div class="box" style="background-color:yellow;">
<img class="f2" src="https://picsum.photos/id/107/100/100">
</div>
<div class="box" style="background-color:pink;">
<img class="f3" src="https://picsum.photos/id/1072/100/100">
</div>

关于javascript - 如何用CSS创建图片滚动视差效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48998036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com