vue中通过.style.animationDuration属性,根据数据长度动态设定元素的纵向滚动时长的demo

news2024/10/7 18:26:45

根据数据长度动态设定元素的animation

先看看效果,是一个纯原生div标签加上css实现的表格纵向滚动动画:
在这里插入图片描述

目录

  • 根据数据长度动态设定元素的animation
  • HTML
  • js逻辑
    • 1、判断是数据长度是否达到滚动要求
    • 2、根据数据长度设置滚动速度
  • Demo完整代码

HTML

1、确认好需要滚动内容的外盒子,并设置overflow: hidden;
2、类名为marquee的盒子为需要滚动内容的元素,给一个ref值之后通过获取ref设置元素的动画时长ref=“marqueeOld”
3、里面类名为row的子盒子是每行的表格内容
以下为控制台查看元素效果:
在这里插入图片描述

在这里插入图片描述

js逻辑

1、判断是数据长度是否达到滚动要求

滚动盒子的类绑定为 :class="{ ‘marquee’: shouldAnimate },在类名marquee 里给动画效果。以下为样式代码:

.marquee {
  /* infinite永久调用动画 */
  animation: material 300s linear infinite;
}

为了在计算属性中监听tableData数据的变化,若shouldAnimate返回为true,则有滚动marquee类名,否则不可滚动

可选链操作符 ? :在 JavaScript 中,当我们尝试访问一个对象的属性时,如果该对象为 null 或 undefined,通常会导致错误。可选链操作符 ? 可解决这一问题
这种写法可以让我们在访问对象的属性时更加安全,避免了因为对象不存在而导致的错误。特别是在处理来自外部或异步源的数据时,使用可选链操作符可以提高代码的健壮性。

computed: {
    shouldAnimate () {
      console.log("tableData.length >= 6", this.tableData.length >= 6);//若数据大于等于6条,则返回true;反之为false
      return this.tableData?.length >= 6; //这个?号是可选链操作符
    }
},

2、根据数据长度设置滚动速度

通过 refs 访问 DOM 元素时,有时需要在 DOM 渲染完成后才能正确获取到相应的元素,所以需要将设置滚动速度的逻辑放到 this.$nextTick 中,以确保 DOM 渲染完成后再进行操作,若没有nextTick 方法会找不到DOM,输出元素为undefined。

setMarqueeSpeed () {
      if (this.shouldAnimate) {
        this.$nextTick(() => {
          // 根据数据长度设置滚动速度
          this.$refs.marqueeOld.style.animationDuration = this.tableData.length * 2 + "s";
          console.log("this.$refs.marqueeOld.style.animationDuration", this.$refs.marqueeOld.style.animationDuration);
        });
      }
}

.style.animationDuration 是一个 DOM 元素的属性,用于设置或获取元素应用的动画持续时间。在这里的情况下,想要根据数据长度动态地设置滚动速度,使用 .style.animationDuration 就可以实现这一目的。
当设置 .style.animationDuration 时,可以为其赋予一个字符串数值,表示动画的持续时间。例如
element.style.animationDuration = “2s” 表示将动画持续时间设置为 2 秒。

所以通过动态设置 .style.animationDuration,可以根据数据的长度来调整滚动速度,从而实现动态的滚动效果。控制台输出animationDuration如下:
在这里插入图片描述

Demo完整代码

import jsondata from ‘./test.json’;
其中jsondata 为自己配置的数据,若是从接口获取,在获取数据那里调用setMarqueeSpeed方法即可

<template>
  <div class="innercolumn panel oldmaterial">
    <div class="inner"
         style="height: 100%">
      <h3><i class="icon-table"></i> 表格标题</h3>
      <div class="content"
           style="display: block">
        <div class="head headv1">
          <span class="col text-center">ID</span>
          <span class="col text-center">内容1</span>
          <span class="col text-center">内容2</span>
          <span class="col text-center">内容3</span>
          <span class="col text-right">内容4</span>
        </div>
        <div class="marquee-view">
          <div :class="{ 'marquee': shouldAnimate }"
               ref="marqueeOld"
               v-if="tableData">
            <div class="row"
                 v-for="(item, index) in tableData"
                 :key="index">
              <span class="col text-center nowrap">{{ item.ID }} </span>
              <span class="col text-center nowrap">{{ item.name1 }} </span>
              <span class="col text-center nowrap">{{ item.name2 }} </span>
              <span class="col text-center nowrap">{{ item.name3 }} </span>
              <span class="col text-right nowrap">{{ item.name4 }} </span>
              <span class="icon-location"></span>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import jsondata from './test.json';
export default {
  data () {
    return {
      tableData: jsondata
    };
  },
  created () { },
  computed: {
    shouldAnimate () {
      console.log("tableData.length >= 6", this.tableData.length >= 6);
      return this.tableData.length >= 6;
    }
  },
  mounted () {
    this.setMarqueeSpeed();
  },
  methods: {
    setMarqueeSpeed () {
      if (this.shouldAnimate) {
        this.$nextTick(() => {
          // 根据数据长度设置滚动速度
          this.$refs.marqueeOld.style.animationDuration = this.tableData.length * 2 + "s";
          console.log("this.$refs.marqueeOld.style.animationDuration", this.$refs.marqueeOld.style.animationDuration);
        });
      }
    }
  },
};
</script>

<style scoped>
.oldmaterial {
  height: 17rem;
  background: #080866;
  color: #fff;
  padding: 1rem;
  width: 25%;
}
.oldmaterial .inner {
  /* padding: 1rem 0; */
  display: flex;
  flex-direction: column;
}
.oldmaterial .tabs {
  padding: 0 1.5rem;
  margin-bottom: 0.75rem;
}
.oldmaterial .tabs a {
  color: #1950c4;
  font-size: 0.75rem;
  padding: 0 1.125rem;
}

.oldmaterial .tabs a:first-child {
  padding-left: 0;
}

.oldmaterial .tabs a.active {
  color: #fff;
}
.oldmaterial .content {
  flex: 1;
  display: none;
  position: relative;
}
.oldmaterial .head {
  background: rgba(255, 255, 255, 0.1);
  font-size: 13px;
  padding: 0.5rem 0.5rem;
  color: #68d8fe;
  display: flex;
  justify-content: space-between;
  line-height: 1.05;
}
.oldmaterial .col {
  width: 4rem;
}
.oldmaterial .row {
  line-height: 1.05;
  padding: 0.5rem 0.5rem;
  color: #5b9cef;
  font-size: 1rem;
  position: relative;
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.oldmaterial .icon-location {
  position: absolute;
  left: -0.1rem;
  opacity: 0;
}
.oldmaterial .marquee-view {
  position: absolute;
  top: 2.4rem;
  bottom: 0;
  width: 100%;
  overflow: hidden;
}
.oldmaterial .row:hover {
  color: #5b9cef;
  background: rgba(255, 255, 255, 0.1);
}
.oldmaterial .row:hover .icon-location {
  opacity: 1;
}
@keyframes material {
  0% {
  }
  100% {
    transform: translateY(-50%);
  }
}
/* 调用动画 */
.oldmaterial .marquee {
  /* infinite永久调用动画 */
  animation: material 300s linear infinite;
}
/* 鼠标划入 停止动画  */
.oldmaterial .marquee:hover {
  animation-play-state: paused;
}
</style> 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

校园信息发布平台小程序的作用是什么

校园墙是校内信息传播的一种渠道&#xff0c;有专门的人添加校内学生、教师&#xff0c;谁有信息发布需求即可联系让其通过QQ、微信朋友圈、社群等形式发布&#xff0c;多年来&#xff0c;学生们习惯了这类方式。 但这种方式并不高效&#xff0c;缺乏信息的真实性以及便捷性&a…

Loguru:Python中强大的日志库

目录 一、Loguru的安装 二、Loguru的使用 2.1 日志级别的设置 2.2 日志的输出格式 2.3 日志轮转与压缩 2.4 日志的彩色输出 2.5 在生产环境中使用Loguru 2.6 日志的过滤和搜索 2.7 日志的自定义格式化 2.8 日志的上下文信息 2.9 日志的异步处理 2.10 日志的搜索和筛…

PSP - 蛋白质复合物结构预测 Template 的 Multichain Mask 2D (二维多链掩码)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134406459 在 蛋白质复合物结构预测 中&#xff0c;AlphaFold2 Multimer 的 Multichain Mask 2D 对于 模版特征 (Template) 的影响较大&#xff0…

【Python】逆向与爬虫的故事

目录 一、前言 二、爬虫 1、什么是爬虫&#xff1f; 2、Python 爬虫的主要工具 3、爬虫的基本流程 4、实例代码 三、逆向 1、什么是逆向&#xff1f; 2、Python 逆向的主要工具 3、逆向的基本流程 4、实例代码 四、总结 一、前言 随着互联网技术的发展&#xff0c…

申明式管理方式与配置清单文件

目录 申明式管理方式 1、使用申明式管理方式相关操作 1&#xff09;获取资源配置清单 2&#xff09;更改获取的yaml配置清单&#xff0c;并进行修改然后创建或更新资源 3&#xff09;在线修改或编辑资源配置 4&#xff09;删除资源 2、如何获取资源配置清单文件模板&…

3D建模基础教程:编辑样条线【总层级】

在本期的3D建模基础教程中&#xff0c;我们将探讨“编辑样条线”的【总层级】。我们将从以下几个方面进行深入分析&#xff1a; 1️⃣ 理解“编辑样条线”的层级结构 在3D建模中&#xff0c;“编辑样条线”是一个非常重要的环节。它主要涉及到曲线的创建、修改和调整。通过学习…

【算法练习Day49】每日温度下一个更大元素 I

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 每日温度下一个更大元素 I总…

微信公众号预约挂号怎么做

一、引言 在当今快节奏的生活中&#xff0c;时间是非常宝贵的。为了方便患者快速、准确地预约挂号&#xff0c;微信公众号已经推出了预约挂号功能。通过公众号预约挂号&#xff0c;你可以轻松地安排自己的就诊时间&#xff0c;避免了长时间排队和等待的烦恼。本文将为你详细介…

第一型曲面积分的第二型曲面积分的区别与联系【从几何知识的角度思考】

此处为曲线积分------>【问题思考总结】第一型曲线积分和第二型曲线积分的区别与联系【从几何知识的角度思考】 一二型曲面积分有什么区别&#xff1f;&#xff08;了解&#xff09; 一型曲面积分&#xff1a; 由dS进行表示。可以想像&#xff0c;dS是一个面积微元&#x…

gmpy2 GMP is_prime函数底层c代码分析

偶然看到一篇paper&#xff08;2018年发表&#xff09;&#xff0c;说GMP中的素性检测使用的是单独的Miller_Rabin方法&#xff0c;单独的Miller_Rabin素性检测会存在部分安全问题&#xff08;低概率&#xff09;&#xff0c;然后突然想求证一下最新版本的GMP中是否进行了修改。…

ComfyUI搭建

最近心血来潮想搞下 sd 的东西, 正好赶上腾讯云有活动, 附上个活动链接,有兴趣的小伙伴可以参考下,不用谢我 高性能应用服务HAI 新品内测 一 搭建 首先先选择一个框架, 我想搭建的是 comfyui, 所以选择了Pytorch2.0.0, 里面环境都适配好了 等待个 5-8 分钟就可以了 ,因为需要加…

一文搞定以太网PHY、MAC及其通信接口

本文主要介绍以太网的 MAC 和 PHY&#xff0c;以及之间的 MII&#xff08;Media Independent Interface &#xff0c;媒体独立接口&#xff09;和 MII 的各种衍生版本——GMII、SGMII、RMII、RGMII等。 简介 从硬件的角度看&#xff0c;以太网接口电路主要由MAC&#xff08;M…

大数据清洗、转换工具——ETL工具概述

大数据清洗、转换工具——ETL工具概述_etl转换-CSDN博客 ETL&#xff0c;是英文 Extract-Transform-Load 的缩写&#xff0c;用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL过程本质上是数据流动的过程&#xff0c;从不同的数据源…

很多工程师,最后都是被生活裹挟,没法一直在技术路径走到极致

最近比较少更了&#xff0c;但内容一直在写&#xff0c;只是从长文变成了短文&#xff0c;直接发朋友圈了。 如果喜欢我写的内容&#xff0c;请移步到朋友圈。 我是一个不喜欢讲哲理的人&#xff0c;感觉哲学都是理论&#xff0c;都是鸡血&#xff0c;很难落地&#xff0c;我…

关系选择器

关系选择器&#xff0c;说明元素和元素之间需要存在关系了。 后代选择器 定义&#xff1a;选择所有被E元素包含的F元素&#xff0c;中间用空格隔开 语法&#xff1a;E F{ } 选择E元素下面所有的F元素 <ul><li>宝马</li><li>奔驰</li> </u…

【mujoco】Ubuntu20.04配置mujoco210

【mujoco】Ubuntu20.04配置mujoco210 文章目录 【mujoco】Ubuntu20.04配置mujoco2101. 安装mujoco2102. 安装mujoco-py3.使用render时报错Reference 本文简要介绍一下如何在ubuntu20.04系统中配置mujoco210&#xff0c;用于强化学习。 1. 安装mujoco210 在官方资源里找到http…

真空的应用

真空对人类主要的贡献有两点&#xff1a;对基础研究来说&#xff0c;提供了最清洁和最少受外界干扰的实验环境&#xff1b;对工业生产来说&#xff0c;则可以制造性能最优越、甚至自然界前所未有的材料。随着真空技术在航空航天和军工、光伏发电以及半导体等领域的应用&#xf…

zabbix的agent的安装部署

zabbix的agent的部署 主机ipagent-1192.168.10.129 zabbix官网部署教程 但是不全&#xff0c;建议搭配这篇文章一起看 下面有教程 zabbix服务端配置 修改主机名 hostnamectl set-hostname agent-1 exit配置zabbix的yum源 [rootagent-1 ~]# rpm -Uvh https://repo.zabbix…

Qt DragDrop拖动与放置

本文章从属于 Qt实验室-CSDN博客系列 拖放操作包括两个动作&#xff1a;拖动(drag)和放下(drop或称为放置)。 拖动允许 对于要拖出的窗口或控件&#xff0c;要setDragEnabled(true) 对于要拖入的窗口或控件&#xff0c;要setAcceptDrops(true) 下面以一个具体的用例进行说…

Git的基本操作以及原理介绍

文章目录 基本操作创建git仓库配置name和email .git目录的结构git add & git commit.git目录结构的变化 git追踪管理的数据git的版本回退回退的原理回退的三种情况 版本库中文件的删除git分支管理分支的删除合并分支时的冲突分支的合并模式分支策略git stash不要在master分…