如何在页面滚动到特定位置时实现div透明度的渐变效果?

新手上路,请多包涵

求问,有没有懂页面到一定位置透明度渐显div的全代码

只能做出一半,就是到一定位置div渐显,但是并不会改JS动画,div是先存在再从0-100透明

阅读 1.9k
avatarAI BotBETA

要在页面滚动到特定位置时实现一个div的透明度渐变效果,你可以使用JavaScript(或jQuery)来监听滚动事件,并基于滚动位置来改变div的样式。以下是一个基本的示例,展示如何使用原生JavaScript来实现这一效果:

HTML:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Div Opacity on Scroll</title>
    <style>
        body, html {
            height: 100%;
            margin: 0;
        }
        #targetDiv {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            width: 200px;
            height: 200px;
            background-color: rgba(0, 0, 255, 0); /* Initially transparent */
            transition: background-color 1s ease; /* Smooth transition */
        }
    </style>
</head>
<body>

<div id="content">
    <!-- Your content here. Make it long enough to scroll. -->
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    <!-- Repeat the above paragraph a few times to create a long page -->
</div>

<div id="targetDiv"></div>

<script>
    window.addEventListener('scroll', function() {
        var div = document.getElementById('targetDiv');
        var content = document.getElementById('content');

        if (window.pageYOffset >= content.offsetHeight - div.offsetHeight) {
            // Change opacity when the div enters the viewport
            div.style.backgroundColor = 'rgba(0, 0, 255, 1)'; // Opaque blue
        } else {
            // Reset opacity when the div leaves the viewport
            div.style.backgroundColor = 'rgba(0, 0, 255, 0)'; // Transparent
        }
    });
</script>

</body>
</html>

在这个示例中:

  • 我们首先在CSS中设置了#targetDiv的初始背景颜色为完全透明(rgba(0, 0, 255, 0))。
  • 使用transition属性为背景颜色的变化添加了平滑的过渡效果。
  • 在JavaScript中,我们添加了一个滚动事件监听器。当页面滚动时,它会检查#targetDiv是否进入了视口。如果是,则将其背景颜色更改为不透明(rgba(0, 0, 255, 1));如果不是,则重置为透明。

请注意,这个示例假设#targetDiv应该在页面内容的底部出现。如果你希望div在页面的不同位置出现,你可能需要调整if语句中的条件来反映这一点。此外,你可能还需要考虑视口大小、窗口大小变化等因素。

3 个回答

刚好项目用到了 分享你一下
image.png

import React, { useEffect, useRef, useState } from 'react';

/** 根据某个元素滚动的底部距离顶部的距离, 更改 蒙层 透明度的 动画 */
const useCustomMaskOpacityAnimation = () => {
  // 创建一个引用来保存 监听某个元素滚动的底部距离顶部的距离 DOM 元素
  const scrollElementRef = useRef<HTMLDivElement>(null);
  // 创建一个状态来保存透明度
  const [maskOpacity, setMaskOpacity] = useState(0);

  useEffect(() => {
    // 获取特定元素
    const element = scrollElementRef.current;

    // 定义一个函数来处理滚动事件
    const handleScroll = () => {
      if (element) {
        // 计算元素的底部距离顶部的距离
        const elementBottom = element.getBoundingClientRect().bottom;
        const distanceFromTop = window.innerHeight - elementBottom;
        // 设置透明度,距离顶部越远,透明度越高
        const newOpacity = Math.min(1, distanceFromTop / window.innerHeight);
        setMaskOpacity(newOpacity);
      }
    };

    // 添加滚动事件监听器
    window.addEventListener('scroll', handleScroll);

    // 清除监听器的返回函数
    return () => {
      window.removeEventListener('scroll', handleScroll);
    };
  }, []);

  return { maskOpacity, scrollElementRef };
};

export default useCustomMaskOpacityAnimation;
  1. 创建目标 div,将透明度 opacity 属性设置为 0.当然如果透明度为 0 可以加一个 display:none; 直接不渲染。
  2. 用 JS 监听滑动,当页面滑动到目标位置,开始计算位置对应的透明度。
window.addEventListener('scroll', function () {
  var el = document.getElementById('target')
  var opacity = 0.33 // 这里根据不同条件进行透明度计算

  if (opacity === 0) {
    el.style.opacity = opacity
    el.style.display = 'none'
  } else {
    el.style.opacity = opacity
  }
})

可能您对前端不怎么了解,我就以你不了解的角度给你说一下。

设置过度

您的需求应该不是直接从透明变成正常,所以会存在过度,而过度的话你需要在css里先进行设置,假代码如下;

<style>
.msg {
/* all的话意味着所有的css属性都应用该过度,现在如果你只是透明度的话,可以写`opacity `; 0.5s表示过度事件,ease则表示过度的动画曲线*/
    transition: all 0.5s ease;
    opacity: 0;
}
</style>
<div class="msg">message</div>

切记过度必须要先设置,因为如果你使用javascript来设置的话会没有过度效果。

监听元素的位置

比较麻烦的方式是监听scroll事件,这个上面的朋友已经说了。如果不需要兼容的话,可以使用intersectionObserver来进行监听,这个我无法在这里给你写一个例子,你可以到掘金等去搜索一下。

使用js来设置css

先获取DOM对象,再进行设置

// 获取DOM对象
let dom = document.querySelector("选择器");
// 修改css属性前面的 `dom.style`是固定的,它就是一个对象,您调用对象赋值
dom.style.opacity = 1;
推荐问题