前端相关动画库(GSAP/Lottie/Swiper/AOS)

前端相关动画库(GSAP/Lottie/Swiper/AOS)

GSAP的ScrollTrigger和SplitText动画

resources | GSAP | Docs & Learninghttps://gsap.com/resources/GSAP Showcasehttps://gsap.com/showcase/GSAP on CodePenhttps://codepen.io/GreenSockGSAP在CodePen中的千种Demo

CDN:

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/gsap.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/ScrollTrigger.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/SplitText.min.js"></script>

ScrollTrigger部分用法

gsap.registerPlugin(ScrollTrigger); ScrollTrigger.create({ trigger: '.pic', //用选择器选择触发元素 start: 'top top', //元素到达视口的最上方开始 //start: 'top 80%', //元素到达视口的80%开始 end: '+=2000', //往下移动2000px结束 scrub: true, //与滚动条绑定在一起,实现往返 markers: true,//开启标注 pin:true,//固定页面不岁滚动条滚动(关键) pinSpaceing:true//自动根据end属性添加的距离创建空白,使得上下两个页面衔接介绍https://codepen.io/JasonDuquain/pen/oNxvWjJ // 添加动画 animation: gsap.timeline()//使用时间线,用于管理多个动画的先后顺序,">"表示上一个动画结束开始,"<"是与上一个动画一起开始 .fromTo(".pic4", { width: "18.75em" }, { width: "16.75em" }, ">") .fromTo(".pic1", { left: "55.125em" }, { left: "14.3em" }, "<") //fromTo("使用动画的元素",{元素起始状态},{元素结束状态}) });

常用属性

属性取值说明
start数字方位名词
end数字方位名词
triggerElementundefined
animationTweenTimeline
scrub布尔值数字
toggleClass字符串对象
markerstrue开启标注功能(更好看滚动开始以及截止的地方)
scrollerElementwindow
pinElementundefined
direction数字反映滚动的每时每刻方向,其中 1 表示向前, -1 表示向后
isActive布尔值如果滚动位置位于 ScrollTrigger 实例的开始位置和结束位置之间,则仅 true
horizontal布尔型设置使用水平滚动,则只需设置 horizontal: true
progress数字ScrollTrigger 实例的总体进度,其中 0 在开头,0.5 在中间,1 在末尾

SplitText文字分割动画

gsap.registerPlugin(SplitText, ScrollTrigger);//注册插件 document.fonts.ready.then(() => { gsap.set(".split", { opacity: 1 }); //快速设置所有 .split 元素的初始透明度为 1 const splitElements = document.querySelectorAll(".split");//获取页面中所有带有 .split 类的 DOM 元素 splitElements.forEach((element)=>{//遍历每一个容器 SplitText.create(element, { type: "words,lines", // 拆分类型:同时拆分为「单词」和「行」 mask: "lines", // 以「行」为掩码(限制),保证拆分后的单词不会超出所在行的范围 onSplit: (self) => { // 文字拆分完成后的回调函数(关键) // 拆分完成后,为所有拆分出的单词创建动画 gsap.from(self.words, { duration: 1.3, // 动画持续时间:1.3秒 y: 50, // 初始位置:在目标位置下方 50px 处(y 轴正方向为向下) opacity: 0, // 初始透明度:完全透明 stagger:{ // stagger:逐元素延迟动画,营造层次感 amount:0.6 // 所有单词完成动画的总延迟时间:0.6秒(平均分配给每个单词) }, scrollTrigger: { // 绑定滚动触发配置 trigger: element, // 滚动触发的目标元素:当前遍历的 .split 元素 start: "top 88%", // 动画开始触发时机:元素的「顶部」与视口的「88% 高度位置」重合时 end: "top 20%", // 动画结束时机:元素的「顶部」与视口的「20% 高度位置」重合时 } }); } }); }) }); 

AOS动画

https://github.com/michalsnik/aos?tab=readme-ov-filehttps://github.com/michalsnik/aos?tab=readme-ov-fileAOS - Animate on scroll libraryhttps://michalsnik.github.io/aos/

  • 用途:新页面出现时的动画效果(滚轮)
CDN(JS):<script src="[https://unpkg.com/[email protected]/dist/aos.js](https://unpkg.com/[email protected]/dist/aos.js)"></script> CDN(CSS):<link href="[https://unpkg.com/[email protected]/dist/aos.css](https://unpkg.com/[email protected]/dist/aos.css)" rel="stylesheet">

JS代码

AOS.init({ // 初始化AOS offset: 120, // 提前120px触发动画 delay: 0, // 无默认延迟 duration: 400, // 动画默认持续400ms easing: 'ease', // 默认缓动曲线 once: false, // 支持重复触发动画 mirror: false, // 滚动离开不执行反向动画 anchorPlacement: 'top-bottom' // 元素顶部对齐视口底部时触发 }); 

HTML代码(AOS使用方法)

 //直接在对应元素添加对应的类名即可,类名对应动画参考连接https://michalsnik.github.io/aos/ <div > </div>

Lottie动画

LottieFiles: Download Free lightweight animations for website & apps.https://lottiefiles.com/lottielab.com/dashboard/team/4c9411da-7606-4370-a845-c313fbd6acf2/homehttps://www.lottielab.com/dashboard/team/4c9411da-7606-4370-a845-c313fbd6acf2/homeLottie Air | Remove Watermark - Free Lottie Editorhttps://lottieair.com/可添加关键帧自定义动画,并导出JSON文件在web端使用

CDN:

CDN:<script src="[https://unpkg.com/[email protected]/build/player/lottie.min.js](https://unpkg.com/[email protected]/build/player/lottie.min.js)"></script>

HTML代码

<div></div>//自定义容器选择器名,设置显示动画的容器

JS代码

  • 显示动画
//获取显示动画的容器 const structe_one_container = document.getElementById('struct_picture'); // 加载并渲染动画 const structe_one_animation = lottie.loadAnimation({ container: structe_one_container, // 动画挂载的 DOM 容器(必填) renderer: 'svg', // 渲染模式(支持 'svg'/'canvas'/'html') loop: false, // 是否循环播放(布尔值/数字,数字表示循环次数) autoplay: false, // 是否自动播放(布尔值) path: 'structe_one.json', // Lottie 动画 JSON 文件路径(相对/绝对) }); 
  • 设置触发时间
 // 监听页面滚动,滚动到目标区域时播放动画 window.addEventListener('scroll', () => { const rect = structe_one_container.getBoundingClientRect();//关键是获取放置容器的元素的矩形属性 // 当动画容器进入视口(顶部 <= 窗口高度)时播放 if (rect.top <= window.innerHeight/1.5 && !structe_one_animation.isPlaying) { structe_one_animation.play(); //播放动画 } });

Swiper轮播图

swiperjs.com/demoshttps://swiperjs.com/demos

CDN(JS): <script src="[https://unpkg.com/swiper@8/swiper-bundle.min.js](https://unpkg.com/swiper@8/swiper-bundle.min.js)"></script> CDN(CSS):<link rel="stylesheet" href="[https://unpkg.com/swiper@8/swiper-bundle.min.css](https://unpkg.com/swiper@8/swiper-bundle.min.css)" />

HTML代码(类名要正确)

<div> <div> <!-- 轮播卡片 --> <div>Slide 1</div> <div>Slide 2</div> <div>Slide 3</div> ... </div> <!-- 分页器--> <div></div> <!-- 上下按钮--> <div></div> <div></div> <!-- 滚动条 --> <div></div> </div>

CSS代码控制分页器

.swiper-pagination-bullet-active background-color: #00E77F;:选中的小圆点背景色:青绿色(活力绿)
.swiper-pagination-bullet background-color: #fff;:未选中的小圆点背景色:白色

JS代码

  • 普通轮播效果
var swiper = new Swiper(".course-slider", {//指定那个类名设置swiper属性 spaceBetween: 20, // 轮播卡片之间的间距:20px(对应 CSS 的 gap,避免卡片重叠) grabCursor:true, // 鼠标交互:光标移到轮播上时变成“抓手样式”,提示可拖动 loop:true, // 循环轮播:滑到最后一张后,继续滑动会回到第一张(无边界) pagination: { // 分页器(小圆点)配置 el: ".swiper-pagination", // 分页器绑定的 DOM 元素(页面中需有这个类名的元素) clickable: true, // 分页器小圆点可点击,点击直接跳转到对应幻灯片 }, breakpoints: { 540: { // 屏幕宽度 ≥540px 时 slidesPerView: 1, // 每页显示1张卡片 }, 768: { // 屏幕宽度 ≥768px 时 slidesPerView: 2, // 每页显示2张卡片 }, 1024: { // 屏幕宽度 ≥1024px 时 slidesPerView: 3, // 每页显示3张卡片 }, }, });
  • 3D轮播效果
var swiper = new Swiper(".home-slider", { //初始化 Swiper 实例,绑定到类名为 .home-slider 的容器 effect: "coverflow", // 核心特效:封面流(Coverflow),模拟3D翻页/相册效果 grabCursor: true, // 交互优化:鼠标移到轮播上显示“抓手光标”,提示可拖动 centeredSlides: true, // 居中显示:当前激活的幻灯片始终在容器正中间(核心适配 coverflow 特效) slidesPerView: "auto", // 幻灯片数量:自动适配(根据屏幕宽度/幻灯片宽度自动调整显示数量) coverflowEffect: { // Coverflow 特效的精细配置(核心!控制3D效果的参数) rotate: 0, // 幻灯片旋转角度(0=不旋转,正数=顺时针,负数=逆时针) stretch: 0, // 幻灯片拉伸距离(0=不拉伸,越大越紧凑) depth: 100, // 3D深度(越大,远的幻灯片越靠后,3D效果越明显) modifier: 2, // 效果强度乘数(放大 rotate/stretch/depth 的效果) slideShadows: true // 是否显示幻灯片的阴影(增强3D层次感) }, loop:true, // 循环轮播:滑到最后一张后无缝回到第一张 autoplay:{ delay: 3000, // 自动切换间隔:3秒(3000毫秒) disableOnInteraction:false // 用户手动滑动后,仍继续自动轮播(默认true会停止) } });
  • 3D轮播效果(左右拖动图片与类别显示)
var lastActiveIndex = swiper2.activeIndex; //处于中心位置是的轮播图索引,用于判断拖动的左右方向 swiper2.on('slideChange', function() { //绑定 slideChange 事件,页面轮播时出发事件 var activeIndex = swiper2.activeIndex; var activeSlide = swiper2.slides[activeIndex]; var currentImage = activeSlide.querySelector('img'); let num = currentImage.id; //减一对应数组0索引 var current = document.getElementsByClassName("spc")[num[1]-1]; //左滑动并清空上一个 if(num[1]-2!=-1 && activeIndex > lastActiveIndex){ var prev = document.getElementsByClassName("spc")[num[1]-2]; prev.style.color = "black"; prev.style.backgroundColor="white" } else{//划到第一个清空最后一个 var prev = document.getElementsByClassName("spc")[5] prev.style.color = "black"; prev.style.backgroundColor="white" } //右滑动并清空上一个 if(num[1]!=6 && activeIndex < lastActiveIndex){ var prev = document.getElementsByClassName("spc")[num[1]]; prev.style.color = "black"; prev.style.backgroundColor="white" } else{//划到最后一个清空第一个 var prev = document.getElementsByClassName("spc")[0] prev.style.color = "black"; prev.style.backgroundColor="white" } lastActiveIndex = activeIndex; //存储上一个轮播图的索引,用于判断拖动方向 current.style.color = "white"; current.style.backgroundColor="black" });

Font-awesome图标字体工具

Font Awesomehttps://fontawesome.com/首页 - FontAwesome 字体图标中文Iconhttps://fontawesome.com.cn/

CDN:需在官网设置

CDN:<link rel="stylesheet" href="[https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css](https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css)" integrity="sha512-KfkfwYDsLkIlwQp6LFnl8zNdLGxu9YAA1QvwINks4PhcvqcyVLLD9aMhXd13uQjoXtEKNosOWaZqXgel0g==" crossorigin="anonymous" referrerpolicy="no-referrer" />
  • 用法:直接在html当中嵌入对应的<i></i>标签即可(可用font-size调整大小)
  • JS添加active类切换图标
let num_s = 0; sound.onclick = () =>{ num_s+=1; if(num_s%2==0){//音量图标 sound_icon.classList.remove('fa-volume-xmark') sound_icon.classList.add('fa-volume-high') video.muted = false; sbar.style.width=(video.volume * 100)+"%"; } else{//静音图标 sound_icon.classList.remove('fa-volume-high') sound_icon.classList.add('fa-volume-xmark') video.muted = true; sbar.style.width=0+"%"; } }

Read more

Open WebUI Docker部署:容器化最佳实践

Open WebUI Docker部署:容器化最佳实践 【免费下载链接】open-webuiOpen WebUI 是一个可扩展、功能丰富且用户友好的自托管 WebUI,设计用于完全离线操作,支持各种大型语言模型(LLM)运行器,包括Ollama和兼容OpenAI的API。 项目地址: https://gitcode.com/GitHub_Trending/op/open-webui Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 WebUI,设计用于完全离线操作,支持各种大型语言模型(LLM)运行器,包括Ollama和兼容OpenAI的API。本文将详细介绍如何通过Docker容器化方式部署Open WebUI,包括基础部署、GPU加速、数据持久化、高级配置及最佳实践指南,帮助用户快速搭建稳定高效的AI交互平台。 部署架构概览 Open WebUI的Docker部署采用多容器架构,通过Docker Compose实现服务编排。核心组件包括Ollama服务(模型运行时)和Open WebUI应用服务,两者通过内部网络通信,

By Ne0inhk

使用Docker安装Ollama及Open-WebUI完整教程

作者:吴业亮 博客:wuyeliang.blog.ZEEKLOG.net 一、Ollama 简介及工作原理 1. Ollama 简介及原理 * 简介:Ollama 是一款轻量级、开源的大语言模型(LLM)运行工具,旨在简化本地部署和运行大语言模型的流程。它支持 Llama 3、Mistral、Gemini 等主流开源模型,用户无需复杂配置即可在本地设备(CPU 或 GPU)上快速启动模型,适用于开发测试、本地智能应用搭建等场景。 * 工作原理: * 采用模型封装机制,将大语言模型的运行环境、依赖库及推理逻辑打包为标准化格式,实现模型的一键下载、启动和版本管理。 * 通过优化的推理引擎适配硬件架构,支持 CPU 基础运行和 GPU 加速(如 NVIDIA CUDA),减少资源占用并提升响应速度。 * 提供简洁的

By Ne0inhk
【算法】【优选算法】BFS 解决边权相同最短路问题

【算法】【优选算法】BFS 解决边权相同最短路问题

目录 * 一、1926.迷宫中离⼊⼝最近的出⼝ * 二、433. 最⼩基因变化 * 三、127. 单词接⻰ * 四、675. 为⾼尔夫⽐赛砍树 一、1926.迷宫中离⼊⼝最近的出⼝ 题目链接:1926.迷宫中离⼊⼝最近的出⼝ 题目描述: 题目解析: * 给我们一个字符数组 + 表示墙,. 表示路。 * 求给我们的起始坐标,上下左右走到边界最短的距离。 * 没路出去返回-1,刚开始的起点不算距离。 解题思路: * 使用层序遍历,从给我们的起点开始, * 每一次都将队列中的元素全部取出,相当于进了一步。 * 直到没路可走,或者走到边界。 * 使用一个相同大小的标记数组,将走过的路和墙标记。标记过的下标不入队。 解题代码: 时间复杂度:O(M*N) 空间复杂度:

By Ne0inhk

玩转Python核心数据结构:从基础到实战的编程基石-4

第4章:无序且唯一的集合:集合与冻结集合 章节介绍 Python 中,除了列表和元组这类有序的序列,还有一类非常实用的无序容器:集合。集合最核心的特征是它的元素是唯一且无序的。想象一下,当你需要记录一批用户的唯一标签,或者快速比对两份数据之间的差异时,集合就能大显身手。它与数学中的集合概念高度一致,支持交集、并集等运算,处理这类问题既直观又高效。 创建一个集合很简单,可以直接用花括号 {},或者使用 set() 函数。但更常见的情况是,我们从已有的数据(比如一个可能包含重复项的列表)中提取唯一元素。这时,集合的“唯一性”就派上了用场。你可以使用 ` defcreate_set_from_list(data_list:list)->set:""" 从给定的列表创建一个集合。 集合会自动去除列表中的重复元素,并失去原有的顺序。 这是演示集合创建和其'

By Ne0inhk