实现页面动效的几种方式

news/2025/3/26 8:22:44/文章来源:https://www.cnblogs.com/wq805/p/18789366

本文列举五种页面加载动效的方式

1.使用transition组件实现页面动效

2.创建观察器IntersectionObserver结合animation实现动态效果

3.创建观察器IntersectionObserver结合指令实现懒加载动态效果

4.使用css伪元素结合css3动画实现动态效果

5.监听滚动事件结合animation实现动态效果

一、使用transition组件实现页面动效

<Transition> 是一个内置组件,这意味着它在任意别的组件中都可以被使用,无需注册。它可以将进入和离开动画应用到通过默认插槽传递给它的元素或组件上。进入或离开可以由以下的条件之一触发:

  • v-if 所触发的切换
  • v-show 所触发的切换
  • 由特殊元素 <component> 切换的动态组件
  • 改变特殊的 key 属性

基本用法:

1 <button @click="show = !show">Toggle</button>
2 <Transition>
3   <p v-if="show">hello</p>
4 </Transition>
1 .v-enter-active,
2 .v-leave-active {
3   transition: opacity 0.5s ease;
4 }
5 
6 .v-enter-from,
7 .v-leave-to {
8   opacity: 0;
9 }

一共有 6 个应用于进入与离开过渡效果的 CSS 过渡class

 

可以给 <Transition> 组件传一个 name prop 来声明一个过渡效果名,对于一个有名字的过渡效果,对它起作用的过渡 class 会以其名字而不是 v 作为前缀。

JavaScript 钩子:在过渡过程中挂上钩子函数

 1 <Transition
 2   @before-enter="onBeforeEnter"
 3   @enter="onEnter"
 4   @after-enter="onAfterEnter"
 5   @enter-cancelled="onEnterCancelled"
 6   @before-leave="onBeforeLeave"
 7   @leave="onLeave"
 8   @after-leave="onAfterLeave"
 9   @leave-cancelled="onLeaveCancelled"
10 >
11   <!-- ... -->
12 </Transition>

二、创建观察器IntersectionObserver结合animation实现动态效果

IntersectionObserver API 提供了一种创建IntersectionObserver 对象的方法,对象用于监测目标元素与视窗(viewport)的交叉状态,并在交叉状态变化时执行回调函数,回调函数可以接收到元素与视窗交叉的具体数据。

// 右侧滑入
export function addEventlistenerFromRight(id) {const connectFormBox = document.getElementById(id);const animationClass = 'common-slide-right';// 创建监听const interObserver = new IntersectionObserver((entries, self) => {// console.log('entries~~~~~~~', entries);entries.forEach(entry => {if (entry.intersectionRatio > 0) {if(entry.target.id == id) addAnimationClass(entry.target, animationClass);else addAnimationClass(entry.target, animationClass);// 停止观察
                self.unobserve(entry.target);// 关闭观察器
                self.disconnect();} else {if(entry.target.id == id) removeAnimationClass(entry.target, animationClass);else removeAnimationClass(entry.target, animationClass);}})});// 开启监听
    interObserver.observe(connectFormBox);
}
右侧滑入公共方法
其中common-slide-right是定义好的公共css效果。
.common-slide-right {animation: pcSlideRight 1.2s ease-out;
}@keyframes pcSlideRight {from {transform: translate3d(100%, 0, 0);}to {visibility: hidden;transform: none;}
}
css样式

三、创建观察器IntersectionObserver结合指令实现懒加载动态效果

本示例在nuxt项目上使用,Nuxt.js 是一个基于 Vue.js 的轻量级应用框架,代码基本通用,思路基本一致。首先所有元素默认 opacity 为 0,并且有向下的位移,当元素移动到视口内即添加标签设置为可见,并恢复位置,当然也可以配合 filter blur 等实现模糊渐显的效果。

在nuxt插件中写入指令

// 导出一个 Nuxt 插件
export default defineNuxtPlugin((nuxtApp) => {// 定义一个自定义指令 'scroll-spring'nuxtApp.vueApp.directive('scroll-spring', {// 当元素被挂载到 DOM 中时调用的钩子
        mounted(el) {// 设置 Intersection Observer 的选项const options = {root: null, // 使用浏览器视口作为根元素rootMargin: '0px', // 根元素的边距threshold: 0.1 // 交叉的阈值,当 10% 的目标元素在视口内时触发回调
            };// 观察者回调函数const callback = (entries) => {entries.forEach(entry => {// 如果目标元素与视口相交if (entry.isIntersecting) {// 添加动画类el.classList.add('scroll-in'); } else {// 移出视口时移除动画类el.classList.remove('scroll-in'); }});};// 创建一个 Intersection Observer 实例,并传入回调函数和选项const observer = new IntersectionObserver(callback, options);// 开始观察当前元素
            observer.observe(el);},// 当元素从 DOM 中卸载时调用的钩子
        unmounted(el) {// 创建一个空的 Intersection Observer 实例const observer = new IntersectionObserver(() => {});// 停止观察当前元素
            observer.unobserve(el);}});
});
/plugins/scrollSpring.js

css样式

/* 初始状态,元素处于下方且不可见,并带有模糊效果 */
.scroll-item {opacity: 0;filter: blur(10px); /* 元素模糊 25px */transform: translateY(20px); /* 元素初始位移 20px */transition: transform 0.5s ease-out, opacity 0.5s ease-out, filter 0.5s ease-out; /* 为 filter 添加动画 */
}/* 当元素进入视口时,透明度变为 1,模糊度变为 0,且上移回原位 */
.scroll-in {opacity: 1;filter: blur(0); /* 模糊效果消失 */transform: translateY(0); /* 元素回到原始位置 */transition: transform 0.5s ease-out, opacity 0.5s ease-out, filter 0.5s ease-out; /* 确保 filter 也有动画 */
}

接下来我们只要在对应的元素引入就可以啦!
注意 scroll-itemv-scroll-spring 缺一不可,前者负责决定开始状态,后者是动画和结束效果。

 <div class="slogan font-jb-mono scroll-item" v-scroll-spring><p>Coding,</p><p>build a better world</p><p>together!</p>
</div>
<span class="slogan-cn scroll-item" v-scroll-spring>{{ 'slogan.cn' }}</span>
<br/>
<div class="button-container scroll-item" v-scroll-spring><div class="btn-item1 ">{{ 'buttons.github' }}</div><div class="btn-item2 scroll-item" v-scroll-spring>111333</div><div class="btn-item3 scroll-item" v-scroll-spring>{{'buttons.resume' }}</div>
</div>
index.vue

四、使用css伪元素结合css3动画实现动态效果

实现底部边框悬浮加载css样式

 

/******底部边框动效需要在引入文件补充&::after {height: 2px;  // 动效高度background-color: var(--el-color-primary); // 动效颜色}
******/
.border-width-transition {position: relative;&::after {content: '';position: absolute;bottom: 0;left: 0;width: 0;transition: width 0.3s ease; /* 过渡动画效果 */}&:hover::after {width: 100%;}
}

页面中引入

<span class="name border-width-transition">{{$t(`${item.name}`)
}}</span>

.name {display: inline-block;&::after {height: 1px;background-color: #00adff;}
}

五.监听滚动事件结合animation实现动态效果

通过添加监听滚动事件addEventListener,到指定区域添加动态样式(不是特别推荐)

以下实现滚动到指定区域顺序加载动效。

const isElementNotInViewport = function(el) {if (el) {let rect = el.getBoundingClientRect();return (rect.top + 600 >=(window.innerHeight || document.documentElement.clientHeight)// || rect.bottom <= 0
        );}
};export function addEventlistenerForOriginalCertification() {// 监听滚动事件const publicbgImg = document.getElementById('publicbgImg');const publicTitle = document.getElementById('publicTitle');const publicAreaContent = document.getElementById('publicAreaContent');function ss() {// var scrollTop = window.scrollY;// 获取当前滚动的垂直高度var showElement = isElementNotInViewport(publicbgImg)// console.log(showElement, publicbgImg, publicbgImg.className);if(showElement){addAnimationClass(publicbgImg, 'common-move-up')addAnimationClass(publicTitle, 'common-move-up2')addAnimationClass(publicAreaContent, 'common-move-up3')// 离开路由移除滚动事件window.removeEventListener('scroll', ss);}// console.log('滚动高度:', scrollTop);
    }window.addEventListener('scroll', ss);
}

css样式

.common-move-up {animation: slideInUp 1s ease-out;
}
.common-move-up2 {animation: slideInUp 1.2s ease-out;
}
.common-move-up3 {animation: slideInUp 1.4s ease-out;
}@keyframes slideInUp {0% {opacity: 0;transform: translate3d(0, 100%, 0);}100% {opacity: 1;transform: none;}
}

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/904793.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录:Cadence virtuoso IC617 个性化配置

本文主要记录如何对Cadence virtuoso IC617个性化配置,如原理图设置、仿真波形窗口的背景、线条等,并且每次打开时能自动加载,无需每次手动设置。网上相关内容比较杂,并且会踩一些坑,因此这里做一个记录方便下次查看。 环境:VMware + CentOS 7 软件:Cadence virtuoso IC…

revit 二次开发之收集器、过滤器和选择器

一、收集器 主要是在文档中,收集出所需要的元素和对象,在revit的定义中,收集器是一个可以迭代的对象。1.1 FilteredElementCollector名称 功能FilteredElementCollector(Document)从文档种收集所需要的元素FilteredElementCollector(Document, ElementId) 从文档和试图种收集…

超 400 人团队律所,如何用 NocoBase 高效管理律师提成?

400+人律所因业务扩张,传统薪酬工具无法应对案件多样、职级复杂、规则高频调整等问题,导致效率低、错漏多。借助 NocoBase 零代码平台动态配置规则,自动化处理数据、实时风控,提成核算效率提升 6倍,实现零错误率,预计规避超 50 万元损失。原文链接:https://www.nocobase…

9.9K star!大模型原生即时通信机器人平台,这个开源项目让AI对话更智能!

"😎高稳定、🧩支持插件、🦄多模态 - 大模型原生即时通信机器人平台"嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法"😎高稳定、🧩支持插件、🦄多模态 - 大模型原生即时通信机器人平台"项目亮点 🔥…

静态代码分析工具SAST与CodeQL区别有哪些?

静态代码分析工具SAST 静态软件安全测试工具在不需要执行程序的情况下,获得程序编译时信息,并根据这些信息对特定的漏洞模式进行检测,从而完成软件的安全分析。静态分析考虑了程序所有可能的运行情况,稳妥的分析策略使得分析结果具备可靠性。 静态分析的本质是建立程序的一…

ASE20N45-ASEMI智能照明专用ASE20N45

ASE20N45-ASEMI智能照明专用ASE20N45编辑:ll ASE20N45-ASEMI智能照明专用ASE20N45 型号:ASE20N45 品牌:ASEMI 封装:TO-220F 批号:最新 最大漏源电流:20A 漏源击穿电压:450V RDS(ON)Max:0.30Ω 引脚数量:3 沟道类型:N沟道MOS管、中低压MOS管 漏电流:ua 特性:N沟道…

Graylog日志系统部署

一、下载GrayLog5.1.2一键安装脚本及安装下载链接 链接:https://share.weiyun.com/mPeVDR7C 密码:p3srz7 二、上安装包上传至服务器上后解压 三、授权脚本777执行权限 chmod 777 GrayLogServer5.1.2_install.sh 四、执行 sh GrayLogServer5.1.2_install.sh脚本 五、检查mo…

WPF 和 Avalonia 开发者的 html css 前端指南 Canvas 篇

本文主要是向大家列出 WPF 和 Avalonia 的 Canvas 在 html 和 css 的实现方法。WPF 和 Avalonia 开发者的 html css 前端指南 Canvas 篇笔者前端框架使用的是 Vue3 + Deno。 笔者主要会以 Avalonia 作为 C# 技术部分的示例。 本文主要是向大家列出 WPF 和 Avalonia 的 Canvas 在…

C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等…

Fx5u写入参数后报警 erwa.cn 二娃备忘

Fx5u写入参数后报警 erwa.cn 二娃备忘

3.24 曲面积分

1 转化成二重积分(先投影) 比如投影到xoy平面: 同样的,还可以投影到另外两个面https://www.zhihu.com/question/48421749/answer/165585609