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

根据数据长度动态设定元素的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> 

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

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

相关文章

算法萌新闯力扣:最后一个单词的长度

力扣热题&#xff1a;最后一个单词的长度 开篇 健康是奋斗的本钱&#xff0c;今天生病后深有体会。看电脑都头晕&#xff0c;勉强来发道题吧。。 题目链接:58.最后一个单词的长度 题目描述 代码纯享版 class Solution {public int lengthOfLastWord(String s) {int sum 0…

python基于图卷积神经网络GCN模型开发构建文本数据分类模型(以论文引用领域数据未例)

GCN&#xff08;Graph Convolutional Network&#xff09;图卷积神经网络是一种用于处理图数据的深度学习模型。它是基于图结构的卷积操作进行信息传递和特征学习的。 GCN模型的核心思想是通过利用邻居节点的特征来更新中心节点的表示。它通过迭代地聚集邻居节点的信息&#x…

太可怕啦!我在网上发了个贴,就被GPT-4推断出了个人隐私!GPT-4化身福尔摩斯

最近 GPT-4 被人发现了具有“福尔摩斯”一样的能力&#xff01; 可以仅仅通过帖子内容来推测出用户的隐私&#xff01; 瑞士苏黎世联邦理工学院的研究人员发现大语言模型可以对用户发在Reddit 帖子进行深度分析&#xff0c;并成功“猜测”出用户的年龄、地点、性别和收入等个…

【mujoco】Ubuntu20.04配置mujoco210

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

不变式和橄榄树-UMLChina建模知识竞赛第4赛季第20轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。第4题为附加题&#xff0c;对错不影响优胜者…

如何准备2024年的系统设计面试?

1 前言 如果你正在准备软件工程师或软件开发人员的面试,那么你可能知道由于其开放性质和广泛性,准备系统设计是多么困难,但同时你也不能忽略它。在软件工程界,如果你正在申请高级工程师/主管/架构师或更高级别的角色,系统设计是最受追捧的技能,也是整个过程中最重要的环节之一…

四川竹哲电子商务有限公司怎么样?是真的吗

在当今数字化时代&#xff0c;抖音电商服务逐渐成为了企业营销的重要手段。在这个充满机遇与挑战的领域&#xff0c;四川竹哲电子商务有限公司以其卓越的服务质量&#xff0c;成为了行业内的佼佼者。本文将详细介绍四川竹哲电子商务有限公司的抖音电商服务&#xff0c;帮助您了…

2024转行软件测试?从零到中高级自动化测试开发,一路狂飙...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、认知准备 1&a…

足底筋膜炎怎么治疗治愈

足底筋膜炎又称为跖筋膜炎&#xff0c;跖筋膜主要在足弓下方&#xff0c;它维持足弓稳定性&#xff0c;对于喜欢长期长跑、跳远&#xff0c;或者越野运动&#xff0c;或者部队中的士兵进行拉练&#xff0c;还有需要久坐或者久站的人群中&#xff0c;容易发生跖筋膜炎。治疗方法…

Express基本接口开发-入门学习与后续进阶

前提推荐 任何一个新的知识都是从文档看起&#xff0c;因此express官方文档示例有必要去学习一遍。 推荐看&#xff1a; 推荐入门指南-路由指南-中间件 看完这几个内容之后心里大概知道express有些什么东西了&#xff0c;然后现在就可以去练习了 注意&#xff1a;更多示例-代…

我记不住的那些命令(不断更新中)

fzf 一种进行模糊查找的命令行工具 主页&#xff1a;https://github.com/junegunn/fzf 我的主机是 Kali&#xff0c;通过apt进行安装fzf&#xff0c;并进行配置。 # apt install fzf # apt show fzf 通过参考/usr/share/doc/fzf/README.Debian来进行快速配置快捷键和自动补…

属兔人连续两年不顺,运势低迷要化解

属兔人为人生性浪漫&#xff0c;有着美好憧憬&#xff0c; 与人相处的时候总是谦和待人&#xff0c;不会随便发脾气&#xff0c; 也不喜欢与人发生争执&#xff0c;不善于算计别人。 对于自己的另一半&#xff0c;是一个很温暖的人&#xff0c;为人细腻&#xff0c;并且懂得体谅…

[答疑]改善系统的性能,用得着业务建模吗

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 第五元素 2023-10-27 22:02 潘老师&#xff0c;请教一个实践中遇到的问题&#xff1a; 假设生产人员使用某个工具处理数据&#xff0c;需要10天时间&#xff1b;现在改进了这个工具…

【Web 实战】记一次攻防实战

经典开局一个登录框 由于漏洞应该还未修复。对于数据和相关网址打个码见谅一下 常规思路&#xff08;爆破&#xff09; 常规操作进行一波 尝试弱口令然后开始爆破 对于此种有验证码的爆破&#xff0c;可以借用一个bp插件。 captcha-killer-modified-jdk14.jar 具体使用我就…

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

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

【网络】计算机网络基础概念入门

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;个人主页 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#…

软件测试不是所有人都适合的

测试工作是一项极其重要的质量保证活动&#xff0c;因此测试部门既是软件发布质量把控的出口&#xff0c;也是客户意见反馈的入口。但是因为之前的不重视&#xff0c;导致了软件测试行业的发展相对滞后&#xff0c;优秀的软件测试工程师非常难得。 一个优秀的测试工程师要对一些…

centos8 执行yum install ntpdate命令,报错未找到匹配的参数: ntpdate

1、执行 yum install ntpdate 报错 上次元数据过期检查&#xff1a;1:17:06 前&#xff0c;执行于 2023年11月15日 星期三 10时32分18秒。 未找到匹配的参数: ntpdate 错误&#xff1a;没有任何匹配: ntpdate 报错截图&#xff1a; 2、CentOS8系统中&#xff0c;原有的时间…

ExoPlayer架构详解与源码分析(7)——SampleQueue

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

2024CFA一级二级三级双机构网课资源

复习流程 我自己的复习流程是这样的&#xff0c;按照这个踏实去复习的话100&#xff05;可以过&#xff1a; 第一轮学习&#xff08;30-40天左右&#xff09;&#xff1a;把所有reading学习一遍&#xff0c;每天上午看新的reading&#xff0c;下午复习前一天上午学习的reading…