侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

在Vue3中使元素在滚动视图时淡入

前端  /  管理员 发布于 6年前   395

优秀的网站要对用户的互动做出反应。做到这一点的一个很好的方法就是对有人向下滚动你的页面做出反应。

除了视差组件和滚动事件外,添加响应式触摸的一种好方法是使元素在滚动视图时淡入。

在本技巧中,将介绍如何使用滚动事件和css转换在vue3中实现此功能。

这是我们将学习如何在本教程中进行构建的屏幕截图。



样式化我们的fadin元素

我们要做的第一件事是构建模板并设置组件样式。在此示例中,我们将使用空白块来说明事情如何进行。

因此,在我们的模板中,我们只想...

包装容器 container

一些full-width元素

一些half-width元素添加一些变化

<template>  <div class='container'>    <div class='fade-in full-width' />    <div class='fade-in full-width' />    <div class='half-width fade-in' />    <div class='half-width fade-in' />  </div></template>

然后,要对它们进行样式设置,我们要构建一个基本的容器,然后使用一些填充,颜色和适当的宽度来对我们的块进行样式设置。

<style scoped>  .container {    width: 80%;    min-width: 450px;    margin: 0 auto;  }  .fade-in {    background-color: #2ecc71;    height: 500px;    margin-bottom: 50px;    opacity: 0;    transition: 0.3s all ease-out;    transform: scale(0.8);    box-sizing: border-box;    padding: 20px;    display: inline-block;  }  .full-width{    width: 100%;  }  .half-width {    width: 47.5%;  }  .half-width:nth-of-type(2n + 1) {    margin-right: 2.5%;  }  .half-width:nth-of-type(2n) {    margin-left: 2.5%;  }</style>

需要注意的一件事是,我们所有的淡入元素均以默认不透明度0开始,我们将使用脚本来处理它们,我们还将改变元素的比例。

事实上,我们的淡入元素被赋予了一个过渡属性,这意味着当我们改变不透明度和比例时,它将在我们的两个值之间平滑地过渡——给我们想要的平滑效果。

所以,如果我们加载我们的页面,我们不应该看到任何东西——但我们应该能够向下滚动我们的页面,因为我们的元素就在那里,只是完全透明。

让我们使用一些JavaScript使其可见。


使我们的元素淡入

在本教程中,我们将使用 vue3 Composition API ——因此,在脚本中,我们首先要创建 setup 方法并导入一些生命周期hooks。

<script>import { onMounted, onUnmounted } from 'vue'export default {  setup () {    onMounted(() => {    })    onUnmounted(() => {    })  }}</script>

然后,我们创建一个包含所有淡入元素的数组。我们可以使用 document.getElementsByClassName 进行此操作-但是,这将返回 htmlCollection,并且我们需要一个数组,因此我们可以使用JavaScript的 Array.from 方法进行强制转换。

onMounted(() => {  fadeInElements = Array.from(document.getElementsByClassName('fade-in'))})

现在我们有了一个要淡入的所有元素的数组,我们想要做一些事情:

每当视图被滚动时,就会在它们上面迭代。

确定元素是否可见。

如果是的话,将其淡入并从数组中删除

首先,我们要在安装(mounted)组件时创建滚动侦听器,并在卸载(unmounted)组件时将其删除。我们要做的另一件事是,在安装组件时调用 handleScroll 方法,以便加载某些内容,而无需用户滚动查看内容。

var fadeInElements = []onMounted(() => {  fadeInElements = Array.from(document.getElementsByClassName('fade-in'))  document.addEventListener('scroll', handleScroll)  handleScroll()})onUnmounted(() => {  document.removeEventListener('scroll', handleScroll)})

在滚动侦听器中,让我们创建一个 for 循环,用于遍历我们创建的淡入元素数组。

const handleScroll = (evt) => {  for (var i = 0; i < fadeInElements.length; i++) {    var elem = fadeInElements[i]  }}

此时,我们需要某种辅助方法来确定元素是否可见。为此,我们将使用元素的bounding rectangle 返回元素相对于视口的大小和位置。

我们还要添加一个小的缓冲区,所以在淡入之前,至少有 200px 的元素必须是可见的。这将真正增强效果,因为它可以确保网站访问者能看到正在发生的事情。如果没有这个缓冲区,我们的淡入过渡会在我们元素的1个像素出现在屏幕上时触发,而大部分的元素会在视口之外。

const isElemVisible = (el) => {  var rect = el.getBoundingClientRect()  var elemTop = rect.top + 200 // 200 = buffer  var elemBottom = rect.bottom  return elemTop < window.innerHeight && elemBottom >= 0}

回到滚动事件侦听器内部,我们想了解每个元素的 isElemVisible 帮助法是否为 true 。如果是这样,我们要更改元素的不透明度和比例,然后将其从数组中删除。

for (var i = 0; i < fadeInElements.length; i++) {  var elem = fadeInElements[i]  if (isElemVisible(elem)) {    elem.style.opacity = '1'    elem.style.transform = 'scale(1)'    fadeInElements.splice(i, 1) // 只让它运行一次  }}

现在,如果我们回到我们的应用程序中去检查一下,你会发现,当我们滚动时,元素会变得清晰可见。这正是我们想要的!


完成!

于是,我们就有了我们一直在寻找的淡入滚动效果!有很多方法可以扩展这个效果,比如说。

滚动时使元素淡出,以便可以再次淡入。

使用css动画代替过渡,增加更多的高级动画。

将逻辑提取到自定义指令中,以便可以在整个项目中重复使用。

只要你掌握了 滚动侦听器 和 CSS animations/transitions 的窍门,那么你就能做到无懈可击。

我希望你学到了一两件事,并且可以想到一些很酷的方法来将其中一些技术添加到自己的Vue项目中。

来自:https://mp.weixin.qq.com/s/--yjgS5119z1AV-m-ULYgQ



  • 上一条:
    Vue样式穿透
    下一条:
    使用vue-cookies操作cookie
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客