gsap timeline示例-实现滚动切换手机颜色

2024-01-16 19:52

本文主要是介绍gsap timeline示例-实现滚动切换手机颜色,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

最近使用gsap有点上瘾。看过一个手机官网滚动切换手机颜色的效果,初次见还是很炫。所以呢,就去研究了下,发现也不过如此。我们现在使用gsap来实现它。

首先来看最终效果:

gsap timeline示例-实现滚动切换手机颜色

实现原理

1. 首先整个dom结构被分为两个部分:背景及其文案、手机图片
2. 通过绝对定位让三个背景、三张图片分别重叠,保证元素在同一位置
3. 通过切换不同组的高度来展示不同的背景与图片

思路有了,那就来实现它

实现步骤

DOM结构

		<section class="change-color bg-black relative overflow-hidden h-screen"><div class="images absolute w-full h-screen z-10"><div class="image orange h-full w-1/2 absolute overflow-hidden left-1/3 top-0"><figure  style="background-image: url(https://photographer-files.s3.us-east-2.amazonaws.com/orange.png);"></figure></div><div class="image blue h-0 w-1/2 absolute overflow-hidden left-1/3 top-0"><figure  style="background-image: url(https://photographer-files.s3.us-east-2.amazonaws.com/blue.png);"></figure></div><div class="image black h-0 w-1/2 absolute overflow-hidden left-1/3 top-0"><figure  style="background-image: url(https://photographer-files.s3.us-east-2.amazonaws.com/black.png);"></figure></div></div><div class="background absolute w-full h-screen"><div class="text-box orange absolute overflow-hidden bg-orange-300 h-full w-1/2"><div class="text absolute h-screen left-1/2 top-0 flex items-center" style="transform: translate(-50%, 0)"><strong class="text-orange-500 text-9xl font-bold">Orange</strong></div></div><div class="text-box blue absolute overflow-hidden bg-blue-200 h-0 w-1/2"><div class="text absolute h-screen left-1/2 top-0 flex items-center" style="transform: translate(-50%, 0)"><strong class="text-blue-900 text-9xl font-bold">Blue</strong></div></div><div class="text-box black absolute overflow-hidden bg-gray-700 h-0 w-1/2 "><div class="text absolute h-screen left-1/2 top-0 flex items-center" style="transform: translate(-50%, 0)"><strong class="text-gray-900 text-9xl font-bold">Black</strong></div></div></div></section>

tips: 使用tailwind,具体样式应该一看class就能看懂

需要注意

  1. 图片使用的是背景而不是img,因为图片会根据高度变化而变化;
  2. 除了第一组橙色,其他两组初始高度都为0;
  3. 需要通过z-index来控制层级,这样能够在动画时不至于调整上一组的高度。

图片增加了一点样式:

.change-color figure{width: 461px;height: 604px;transform: translate(0, 20%);
}

现在我们就能通过控制台调整高度实现一定的效果了:
在这里插入图片描述

动画实现

首先我们要清楚,我们需要两组动画
一组用来固定整个结构
一组用来实现高度变化

	// 用来固定const section = document.querySelector(".change-color");gsap.to(section, {scrollTrigger: {trigger: section,start: "top top",end: "300% top",pin: true,//markers: true,}});

使用gsap.timeline来执行高度变化的动画:

	const imgBlue = section.querySelector('.image.blue');const imgBlack = section.querySelector('.image.black');const textBlue = section.querySelector('.text-box.blue');const textBlack = section.querySelector('.text-box.black');// 创建一个时间线,还是使用section作为触发器const tl = gsap.timeline({scrollTrigger: {trigger: section,start: "top top",end: "300% top",scrub: true // 是否重复执行,这个能保证我们向上滚动时让动画反着执行}});/*** .to() 表示目标属性变化到什么状态* [textBlue, imgBlue, ...] 表示同时执行textBlue、imgBlue* { height: '100%', ... } 表示目标最终的状态* .to().to() 表示执行完前一个动画后执行下一个* */ tl.to([textBlue, imgBlue], { height: '100%' }).to([textBlack, imgBlack], { height: '100%' });

注意点

我们两个动画的end属性的第一个值都是300%,是单个组元素高度的三倍,是因为我们需要在滚动的时候保证高度变化的高度与滚动距离一致。当然也可以是其他值,更详细的属性解释,可以参照苹果官网动画解析之airpods滚动光影效果。

这样,我们的主要功能就全部实现了,但总感觉有点死板,那不如浅浅的再加一个进入的动画:

初始化动画

	const imgOrange = section.querySelector('.image.orange');gsap.from(imgOrange, { x: 800,transform: 'scale(0.8)',duration: 1.4,opacity: 0,ease: "expo.out",scrollTrigger: {trigger: section,start: "top top+=50%", // 这个保证只要元素进入页面,就能执行动画// markers: true,}})

这里使用from 表示目标元素从配置的属性恢复到我们css控制的初始状态
从这里也能看出来gsap创建动画的便利性

这样当页面进入的时候手机图片就会从右边想左移动的一个动画,同时也会变化透明度跟缩放比例。

完整代码

		<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"><title>GSAP+TIMELINE</title>
</head>
<body><main class="bg-slate-300 animate-demo "><!-- 这个是用来占位的,不知道为什么,前面必须要有一个有高度的元素才能实现滚动的功能 --><section style="height: 1px;" class="bg-black"></section><section class="change-color bg-black relative overflow-hidden h-screen"><div class="images absolute w-full h-screen z-10"><div class="image orange h-full w-1/2 absolute overflow-hidden left-1/3 top-0"><figure  style="background-image: url(https://photographer-files.s3.us-east-2.amazonaws.com/orange.png);"></figure></div><div class="image blue h-0 w-1/2 absolute overflow-hidden left-1/3 top-0"><figure  style="background-image: url(https://photographer-files.s3.us-east-2.amazonaws.com/blue.png);"></figure></div><div class="image black h-0 w-1/2 absolute overflow-hidden left-1/3 top-0"><figure  style="background-image: url(https://photographer-files.s3.us-east-2.amazonaws.com/black.png);"></figure></div></div><div class="background absolute w-full h-screen"><div class="text-box orange absolute overflow-hidden bg-orange-300 h-full w-1/2"><div class="text absolute h-screen left-1/2 top-0 flex items-center" style="transform: translate(-50%, 0)"><strong class="text-orange-500 text-9xl font-bold">Orange</strong></div></div><div class="text-box blue absolute overflow-hidden bg-blue-200 h-0 w-1/2"><div class="text absolute h-screen left-1/2 top-0 flex items-center" style="transform: translate(-50%, 0)"><strong class="text-blue-900 text-9xl font-bold">Blue</strong></div></div><div class="text-box black absolute overflow-hidden bg-gray-700 h-0 w-1/2 "><div class="text absolute h-screen left-1/2 top-0 flex items-center" style="transform: translate(-50%, 0)"><strong class="text-gray-900 text-9xl font-bold">Black</strong></div></div></div></section></main><script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.4/gsap.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.4/ScrollTrigger.min.js"></script><script>function ready(fn) {if (document.readyState !== 'loading') {fn();} else {document.addEventListener('DOMContentLoaded', fn);}}function changeColor() {  const section = document.querySelector(".change-color");const imgOrange = section.querySelector('.image.orange');const imgBlue = section.querySelector('.image.blue');const imgBlack = section.querySelector('.image.black');const textBlue = section.querySelector('.text-box.blue');const textBlack = section.querySelector('.text-box.black');gsap.to(section, {scrollTrigger: {trigger: section,start: "top top",end: "300% top",pin: true,//markers: true,}});gsap.from(imgOrange, { x: 800,transform: 'scale(0.8)',duration: 1.4,opacity: 0,ease: "expo.out",scrollTrigger: {trigger: section,start: "top top+=50%",// markers: true,}})const tl = gsap.timeline({scrollTrigger: {trigger: section,start: "top top",end: "300% top",scrub: true}});/*** .to() 表示目标属性变化到什么状态* [textBlue, imgBlue, ...] 表示同时执行textBlue、imgBlue* { height: '100%', ... } 表示目标最终的状态* .to().to() 表示执行完前一个动画后执行下一个* */tl.to([textBlue, imgBlue], { height: '100%' }).to([textBlack, imgBlack], { height: '100%' });}function init() {  gsap.registerPlugin(ScrollTrigger);changeColor();}ready(init);</script>
</body>
</html>

拿去就能跑,你可以试试~

写在最后

感谢你的阅读,如果你觉得有用,欢迎评论、点赞、转发~
当然也希望你能关注我的公众号:前端大乱炖
在这里插入图片描述

这篇关于gsap timeline示例-实现滚动切换手机颜色的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/613718

相关文章

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误