【日常记录】【JS】js 实现元素平滑上升

文章目录

    • 1、效果图
    • 2、基本骨架
    • 3、实现
    • 4、完整代码

1、效果图

在这里插入图片描述

2、基本骨架

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    .container {
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      width: 100%;
      padding-top: 300px;

    }

    .item {
      width: 70vw;
      height: 500px;
      margin-bottom: 20px;
      border-radius: 15px;
    }
  </style>
</head>

<body>
  <div class="container">
    <div class="item" style="background-color: #cee288;" data-index="1"></div>
    <div class="item" style="background-color: #775414;" data-index="2"></div>
    <div class="item" style="background-color: #681dd1;" data-index="3"></div>
    <div class="item" style="background-color: #38d1a6;" data-index="4"></div>
    <div class="item" style="background-color: #50e211;" data-index="5"></div>
    <div class="item" style="background-color: #53357b;" data-index="6"></div>
    <div class="item" style="background-color: #f196ee;" data-index="7"></div>
  </div>
</body>

</html>

3、实现

为了不污染原有的样式,就不用css属性了,直接用JS创建动画
创建完动画,不能先让它执行动画,执行与不执行是我们决定

    let itemsEl = document.querySelectorAll('.item');
    itemsEl.forEach(f => {
      // 为了不污染原有的 transition 等其他属性,可以自己创建一个动画
      console.log(isInViewport(f), f);
      if (!isInViewport(f)) return
      let translateYAnimate = f.animate([
        { transform: 'translateY(80px)' },
        { transform: 'translateY(0)' }
      ], {
        duration: 1000, // 动画时常
      })
      translateYAnimate.pause() // 先暂停所有动画,需要通过其他的方法来判断 这个DOM 是否进入可视区

    })

在这里插入图片描述

这样达到的效果是,界面一加载,都做动画了,并不是预想的结果,需要判断这个Item 是否进入可视区,如果进入可视区,才能做动画

      let observe = new IntersectionObserver((entries) => {
        entries.forEach(f => {
          console.log(f);
          if (f.isIntersecting) {
            translateYAnimate.play()
            observe.unobserve(f.target) // 观察一次就行,只需要做一次动画
          } else {
          }
        })
      })
      observe.observe(f)

这样确实可以实现了,但是 浏览器会记住滚动条的位置,就会导致有问题,

  • 刚进来的时候,看到的DOM 并不需要做动画
  • 如果滚动到某一个位置后,刷新界面,再往上滚动,上面的DOM 也不需要做动画了

核心就是判断当前的DOM 距离视口顶部的距离 是否超过了 视口的高度, 如果是,才需要做动画,否则不需要

4、完整代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    .container {
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      width: 100%;
      padding-top: 300px;

    }

    .item {
      width: 70vw;
      height: 500px;
      margin-bottom: 20px;
      border-radius: 15px;
    }
  </style>
</head>

<body>
  <div class="container">
    <div class="item" style="background-color: #cee288;" data-index="1"></div>
    <div class="item" style="background-color: #775414;" data-index="2"></div>
    <div class="item" style="background-color: #681dd1;" data-index="3"></div>
    <div class="item" style="background-color: #38d1a6;" data-index="4"></div>
    <div class="item" style="background-color: #50e211;" data-index="5"></div>
    <div class="item" style="background-color: #53357b;" data-index="6"></div>
    <div class="item" style="background-color: #f196ee;" data-index="7"></div>
  </div>

  <script>
  // 判断这个元素,是否在可视区里面
    const isInViewport = (el) => {
      const rect = el.getBoundingClientRect();
      console.log(rect.top);
      return (
        rect.top >= 0 &&
        rect.top >= (window.innerHeight || document.documentElement.clientHeight)
      );
    };
    let itemsEl = document.querySelectorAll('.item');
    // let elAnimateMap = new Map();
    itemsEl.forEach(f => {
      // 为了不污染原有的 transition 等其他属性,可以自己创建一个动画
      if (!isInViewport(f)) return
      let translateYAnimate = f.animate([
        { transform: 'translateY(80px)' },
        { transform: 'translateY(0)' }
      ], {
        duration: 1000, // 动画时常

      })
      translateYAnimate.pause() // 先暂停所有动画,需要通过其他的方法来判断 这个DOM 是否进入可视区
      // elAnimateMap.set(f, translateYAnimate)




      let observe = new IntersectionObserver((entries) => {
        entries.forEach(f => {
          console.log(f);
          if (f.isIntersecting) {
            translateYAnimate.play()
            // elAnimateMap.get(f.target).play()
            observe.unobserve(f.target) // 观察一次就行
          } else {
            // translateYAnimate.pause()
          }
        })
      })
      observe.observe(f)
    })

  </script>
</body>

</html>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VLC-Qt实现简单的视频播放器

VLC-Qt是一个结合了Qt应用程序和libVLC的免费开源库。它提供了用于媒体播放的核心类&#xff0c;以及用于快速开发媒体播放器的GUI类。由于集成了整个libVLC&#xff0c;VLC-Qt具备了libVLC的所有特性&#xff0c; 例如&#xff1a;libVLC实例和播放器、单个文件和列表播放、音…

模板方法模式:定义算法骨架的设计策略

在软件开发中&#xff0c;模板方法模式是一种行为型设计模式&#xff0c;它在父类中定义一个操作的算法框架&#xff0c;允许子类在不改变算法结构的情况下重定义算法的某些步骤。这种模式是基于继承的基本原则&#xff0c;通过抽象类达到代码复用的目的。本文将详细介绍模板方…

婆婆被一句“公积金都比你儿子高”整破防了

上一篇&#xff1a;腾讯员工&#xff1a;我年入百万&#xff0c;月供 6 千多&#xff0c;有娃 一个&#xff0c;媳妇大学老师&#xff0c;税后 1.5 万&#xff0c;想辞职躺平&#xff0c;靠媳妇养家&#xff0c;不知道可不可以 一位阿里巴巴集团的员工的家庭成员寻求建议&#…

MybatisPlus——常用注解

MybatisPlus——常用注解 MybatisPlus通过扫描实体类&#xff0c;并基于反射获取实体类信息作为数据库表信息 BaseMapper后的指向的是User实体类 package com.example.mybatisplus02.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.my…

RHCE实验2-DNS服务正反向解析

实验开始 一、DNS正向解析 注&#xff1a; server端&#xff1a;192.168.32.147 node端&#xff1a;192.168.32.141 网址&#xff1a;www.openlab.com 1、server端和node端都关闭安全软件&#xff08;以server端为例&#xff09; [rootserver ~]# setenforce 0 [rootser…

新手如何使用腾讯云服务器搭建网站?so easy~

使用腾讯云服务器搭建网站全流程&#xff0c;包括轻量应用服务器和云服务器CVM建站教程&#xff0c;轻量可以使用应用镜像一键建站&#xff0c;云服务器CVM可以通过安装宝塔面板的方式来搭建网站&#xff0c;腾讯云服务器网txyfwq.com整理使用腾讯云服务器建站教程&#xff0c;…

对给定向量旋转

对给定向量旋转 顺时针&#xff1a; 逆时针&#xff1a; 源码&#xff1a; QPointF rotateVector(const QPointF& dir, double angle, bool flag){double rad (angle * M_PI) / 180;QPointF res;if (flag){float x static_cast<float>(dir.x() * std::cos(rad) …

GRE/MGRE详解

GRE GRE&#xff1a;通用路由封装&#xff0c;是标准的三层隧道技术&#xff0c;是一种点对点的隧道技术&#xff1b; 该技术可以实现不同的网络之间安全的访问&#xff1b; 如上&#xff1a;可以使用该技术搭建一条专线&#xff0c;实现公司A与分公司A1之间相互通信&#xf…

7/8电源连接器航空插头端子

概述 7/8电源连接器是一种工业电源连接器的规格型号之一&#xff0c;常见于工业领域的电力传输和连接应用。它的名称中的“7/8”代表连接器插头的直径尺寸&#xff0c;通常为7/8英寸。这种类型的连接器通常用于较大电流传输和较高功率设备的连接&#xff0c;具有较大的电流承载…

在视频号开店,新手一定要注意了,这几个细节很多人都不知道

大家好&#xff0c;我是电商笨笨熊 视频号小店作为今年黑马项目&#xff0c;自是吸引力不少的电商玩家&#xff1b; 但是在这些玩家中不免有一些新手玩家&#xff0c;从未做过电商&#xff0c;或者做过其他平台的电商但是没有接触过视频号&#xff1b; 而视频号小店在某些地…

【央国企专场】——国家电网

国家电网目录 一、电网介绍1、核心业务2、电网组成 二、公司待遇三、公司招聘1、招聘平台2、考试安排2.3 考试内容 一、电网介绍 1、核心业务 国家电网公司&#xff08;State Grid Corporation of China&#xff0c;简称SGCC&#xff09;是中国最大的国有企业之一&#xff0c…

ORA-00600: internal error code, arguments: [krbcbp_9]

解决方案 1、清理过期 2、control_file_record_keep_time 修改 恢复时间窗口 RMAN (Recovery Manager) 是 Oracle 数据库的备份和恢复工具。在 RMAN 中&#xff0c;可以使用“恢复窗口”的概念来指定数据库可以恢复到的时间点。这个时间点是基于最近的完整备份或增量备份。 …

记录一次上传文件,file文件有,但是formData一直为空的问题

1&#xff0c;axios请求有两种方式&#xff0c;第一种 asiox.post(…) axios({ url: this.url, method: “POST”, … }) 然后我不管用什么东西获取文件&#xff0c;最后肯定是有一个file对象&#xff0c;咱们拿到file对象&#xff0c;进行如下操作 const formData new FormDa…

vscode前端项目使用Tailwind CSS开发必备技能,5分钟快速上手

Tailwind CSS IntelliSense 是一款功能强大的工具&#xff0c;可以帮助开发者更快、更高效地编写代码。该工具可以实时提供 Tailwind CSS 类的建议&#xff0c;减少错误&#xff0c;提高代码质量。通过使用 IntelliSense&#xff0c;开发者可以提高生产力&#xff0c;减少学习曲…

根据ELK官网指引部署ELK- ECK-Elastic-​ Kibana​-Learn-ELK-(一)

**Attention: 1、You need open the ELK official website and step by step to deploy . 2、If you copy my command ,you must check them if it not match your environment . 一、official website Elastic documentation | Elastic Check there. 二、 ECK简介…

逆向案例二十三——某租逆向,总是有映射源文件怎么办以及分析webpack代码

网址&#xff1a;aHR0cHM6Ly93d3cubWFvbWFvenUuY29tLyMvYnVpbGQ 抓取数据包发现载荷以及数据都进行了加密&#xff1a; 定位方法一&#xff1a;直接搜decrypt(,进入js文件&#xff0c;可以发现就是直接AES的解密方法&#xff0c;打上断点&#xff0c; 下方的d是解密函数 现在有…

AcWing4655.重新排序

【题目链接】4655. 重新排序 - AcWing题库 输入样例&#xff1a; 5 1 2 3 4 5 2 1 3 2 5输出样例&#xff1a; 4【代码及详细注释】 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N1e510; ll a[N],b[N],s[N]; //a用于存储原本的数组 …

国税发票查验接口、电子增值税发票查验接口、数电票查验接口

翔云发票查验接口支持增值税发票管理系统开具发票的真伪&#xff0c;通过发票代码、号码、日期、金额、校验码四要素信息进行真伪的查验&#xff0c;支持返回全票面信息&#xff0c;API接口便于集成&#xff0c;可适用于多种应用场景。 发票查验接口python调用示例&#xff1a;…

MYSQL原理学习篇简记(二)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小周同志&#xff0c;25届双非校招生Java选手&#xff0c;很高兴认识大家 &#x1f4d5;学习出处&#xff1a;本文是学自小林coding (xiaolincoding.com) 网站的MYSQL图解篇 &#x1f525;如果感觉博主的文章还不错的…

在IIS中启用动态压缩

在iis管理中 对网站启用压缩可以节省带宽 提高网站的响应速度&#xff0c;默认情况下IIS启用多了“静态内容”的压缩。 下面就如何启用“动态内容压缩”说说方法&#xff1a; 1.打开iis中的网站&#xff0c;右侧管理项中显示有压缩 2、双击打开“压缩”&#xff0c;“静态内容…