随着滚轮滑动,元素淡入

今天要介绍一下,元素淡入的效果。

fade in

也可以前往 heighliner.dev 查看效果。

在这里,我们用到的技术栈有 React, SCSS, TypeScript。

在这里,淡入效果需要借助CSS的animation实现:
首先定义一个keyframes,效果主要是两方面,一个是从透明到显现,一个是从20px位移到0px。

  @keyframes fade-in {
    from {
      opacity: 0;
      transform: translateY(20px);
    }
    to {
      opacity: 1;
      transform: translateY(0);
    }
  }

定义好keyframes后,我们会去引用它:

  .fadeIn {
      animation: fade-in ease 1.5s;
	  animation-fill-mode: forwards;
  }

animation-fill-mode 等于forwards 表示元素会停留在动画结束的最后一帧。
注意,这里我们用到类名fadeIn

接着我们可以将淡入效果封装成一个组件。同时需要借助Intersection Observer,当滚轮滚到元素位置,即该元素和 Viewport 相交时,给该元素添加一个fadeIn类名:

import React, { ReactElement, useEffect, useRef, useState } from "react";
import clsx from "clsx";

import styles from "./index.module.scss";

interface Props {
  children: ReactElement | ReactElement[];
}

export default function ({ children }: Props): React.ReactElement {
  const eleRef = useRef();
  const [triggerFadeIn, setTriggerFadeIn] = useState(false);

  useEffect(() => {
    let observer: IntersectionObserver;

    const observerCallback: IntersectionObserverCallback = (entries) => {
      entries.map((entry) => {
        // 当元素和viewport相交时,添加类名选择器,触发对应的animation
        if (entry.isIntersecting && entry.target === eleRef.current) {
          setTriggerFadeIn(true);
          // 释放掉observer,减少性能负担
          observer.disconnect();
        }
      });
    };

    const options = {
      rootMargin: "-200px", // 缩小viewport
    };

    observer = new IntersectionObserver(observerCallback, options);
    observer.observe(eleRef.current);

    return () => {
      observer.disconnect();
    };
  }, []);

  return (
    <div
      ref={eleRef}
      // 这里用到clsx,当 triggerFadeIn 为 true 时,styles.fadeIn 会生效
      className={clsx(styles.wrap, triggerFadeIn && styles.fadeIn)}
    >
      {children}
    </div>
  );
}

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值