50 Projects 50 Days - Scroll Animation 学习记录

news/2024/11/19 19:35:17/

项目地址

Scroll Animation

展示效果

在这里插入图片描述
Scroll Animation

实现思路

HTML结构比较简单,就是10+个盒子元素。当鼠标滚动时,盒子分别从左右移动过来。
思路上最开始想到的是给每一个盒子标记一个序号,滚动屏幕后,计算已经划动屏幕的距离和盒子高度的比例,得到应该移动回来的最后一个序号。这种思路当然也可以实现,但是不是最简便的方式,计算上也比较容易出现边界情况。
案例给出的方法比较简便,只需要通过Web API获取每个元素距离屏幕顶部的距离,当这个距离小于某个阈值时就移动回来,这样的好处时每个元素只需要关心自己的距离就行,不会像计算思路那样与整个内容区域强制绑定在一起,真正实现了解耦。

实现细节

HTML结构

只需要列出10+个盒子模型即可。也可以在JavaScript里循环添加这个元素。

<body><h1>Scroll to see the animation</h1><div class="box"><h2>Content</h2></div><div class="box"><h2>Content</h2></div><div class="box"><h2>Content</h2></div><div class="box"><h2>Content</h2></div><div class="box"><h2>Content</h2></div><div class="box"><h2>Content</h2></div><div class="box"><h2>Content</h2></div><div class="box"><h2>Content</h2></div><div class="box"><h2>Content</h2></div><div class="box"><h2>Content</h2></div><div class="box"><h2>Content</h2></div><div class="box"><h2>Content</h2></div><div class="box"><h2>Content</h2></div><script src="script.js"></script></body>

CSS样式

默认样式transform水平移动一个距离,能够做到不在可视区域内即可;为了达到左右交替移动的效果,双数位的盒子可以设置为反方向移动。等到了满足条件时,再添加一个show的class,覆盖原有的transform。
4倍的盒子宽度已经能够移出常规屏幕的可视区域了,因此这里移动是400%。

.box {background-color: steelblue;color: #fff;display: flex;align-items: center;justify-content: center;width: 400px;height: 200px;margin: 10px;border-radius: 10px;box-shadow: 2px 4px 5px rgba(0, 0, 0, 0.3);transform: translateX(400%);transition: transform 0.4s ease;
}.box:nth-of-type(even) {transform: translateX(-400%);
}.box.show {transform: translateX(0);
}

JavaScript逻辑

只需要一个函数即可,调取API的getBoundingClientRect().top得到每个盒子距离顶部的距离,当小于4/5的可视高度时,就添加show的class即可。
在这里插入图片描述

然后window滚动事件绑定该函数。
另外第一次加载也需要调用一次,因为此时并没有触发滚动事件,那么所有盒子都不会显示。

const boxes = document.querySelectorAll('.box')window.addEventListener('scroll', checkBoxes)checkBoxes()function checkBoxes() {const triggerBottom = window.innerHeight / 5 * 4boxes.forEach(box => {const boxTop = box.getBoundingClientRect().topif(boxTop < triggerBottom) {box.classList.add('show')} else {box.classList.remove('show')}})
}

总结

  1. 使用Web API的getBoundingClientRect()方法获取元素相对于viewport的位置信息
  2. 对每个盒子单独进行条件判断和添加class,实现逻辑的解耦

http://www.ppmy.cn/news/98481.html

相关文章

配置nginx常用命令

在修改 Nginx 配置文件之后&#xff0c;您需要重新加载或重启 Nginx 以使配置更改生效。具体的命令和方式可能因操作系统和版本而有所不同。 以下是常见的重新加载或重启 Nginx 的方法&#xff1a; 1. 重新加载配置&#xff1a; - 使用 service 命令&#xff08;适用于 Ub…

leetcode 394. 字符串解码

感觉糊里糊涂的AC了&#xff0c;感觉还要二刷。。。 题目链接leetcode 394 1.题目 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你…

HTML基础标签

目录 1.HTML作用 2.HTML 文件基本结构 3.标签层次结构 4.HTML常见标签 标题标签: h1-h6 段落标签: p 换行标签: br 格式化标签 图片标签: img 格式化标签 示例代码&#xff1a; img 标签的其他属性 超链接标签: a 链接的几种形式: 表格标签 列表标签 表单标签 …

中文核心论文写作经验总结和工具推荐

中文核心论文写作经验总结和工具推荐 1 写作问题案例及解决方法1.1 方法介绍部分冗长杂乱1.2 实验结果介绍没有逻辑1.3 文章整体逻辑把握不清1.4 英文过于中式和口水化 2 投稿流程经验3 工具4 总结 1 写作问题案例及解决方法 1.1 方法介绍部分冗长杂乱 自身问题&#xff1a;介…

Sentinel的另外三种流控模式(附代码详细介绍)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将详细介绍Sentinel的其他三种流控模式&#xff0c;后续文章将详细介绍Sentinel的其他知识。 如果文章有什么需要改进的地方还请大佬不吝赐教&#x1f44f;&#…

Rocky9-Linux上安装KVM虚拟机

一、案例环境 使用一台物理机器,安装Rocky9-Linux的64位系统,test01是在宿主机kvm中安装的虚拟机 主机 操作系统 IP地址 主要软件 kvm Centos 7 192.168.100.46 KVM test01 Centos 7 192.168.100.32 虚拟机

vue组件通信----父传子(超详细)

Vue传值 1.父传子 简单描述 父组件是通过props属性给子组件通信的 数据是单向流动 父—>子 (子组件中修改props数据,是无效的,会有一个红色警告) 实现步骤 1.子组件在props中创建一个属性,用于接收父组件传过来的值; 2.父组件 引入子组件–>注册子组件–>引用…

【算法训练(day6)】双指针模板

一.双指针算法的由来和使用场景 通常情况下我们可能会遇到在某些可遍历的集合中寻找满足某种性质的字串或元素。这时候我们采取暴力的思路就会面临多重循环。我们可以利用题目中所给的集合并利用其性质将多重循环降成一重循环。光用语言描述可能不太好理解。接下来看几个双指针…