当前位置: 首页 > 面试题库 >

如何使用CSS创建图像滚动混合效果?

范翰海
2023-03-14
问题内容

我在网上看到了很酷的滚动效果…

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

我尝试position: fixed在屏幕截图中使用z-index,该部分的高于图像,但最后一个屏幕截图始终位于顶部。

有任何想法吗?

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


问题答案:

可以使用和两个相似的图像来完成。background- attachement: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>

You can also consider the use of img and position:fixed but you will need
some trick to hide the overflow using clip-path

body {

  min-height: 250vh;

  margin: 0;

  padding-top: 100px;

}



img {

  position: fixed;

  top: 50px;

  left: 50px;

}



.box {

  height: 200px;

  background: grey;

  clip-path:polygon(0 0,100% 0,100% 100%,0 100%);

}


<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>

Or using mask

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>

For better support, here is a similar idea with some JS to avoid the use of
clip-path or mask

I will update the position of the image using a CSS variables but you can
easily do without:

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>

With many images:

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>


 类似资料:
  • 本文向大家介绍如何使用CSS创建自定义滚动条?,包括了如何使用CSS创建自定义滚动条?的使用技巧和注意事项,需要的朋友参考一下 要使用CSS创建自定义滚动条,代码如下- 示例

  • 本文向大家介绍sass 创建和使用混合,包括了sass 创建和使用混合的使用技巧和注意事项,需要的朋友参考一下 示例 要创建一个mixin,请使用@mixin指令。 您可以在mixin名称后面的括号内指定参数列表。切记以变量开头,$并用逗号分隔。 要在另一个选择器中使用mixin,请使用@include指令。 从混入样式将目前在使用footer,并header与值#ccc的$color变量,#dd

  • “自动混合图层”命令 使用“自动混合图层”命令可缝合或组合图像,从而在最终复合图像中获得平滑的过渡效果。“自动混合图层”将根据需要对每个图层应用图层蒙版,以遮盖过度曝光或曝光不足的区域或内容差异。“自动混合图层”仅适用于 RGB 或灰度图像。不适用于智能对象、视频图层、3D 图层或背景图层。 作为其众多用途之一,可以使用“自动混合图层”命令混合同一场景中具有不同焦点区域的多幅图像,以获取具有扩展景

  • 本文向大家介绍如何使用JavaFX创建滚动窗格?,包括了如何使用JavaFX创建滚动窗格?的使用技巧和注意事项,需要的朋友参考一下 滚动窗格包含一个UI元素,并提供它的可滚动视图。在JavaFX中,可以通过实例化javafx.scene.control.ScrollPane类来创建滚动窗格。您可以使用setContent()方法将内容设置到滚动窗格。 要将滚动窗格添加到节点- 实例化ScrollP

  • 问题内容: 我正在尝试创建具有多个视图的页面视图控制器。我想要一个简单的代码示例,它将使用 UIPageViewController 。 问题答案: import UIKit

  • 我有两个关于存储在两个单独图像中的数据的绘图。我需要把它们放在一张图片中,这样我才能看到它们的区别。如何在javaFX中实现这一点?