前言

公司展示大屏需要写滚动表格,通过滚动播放数据,自己随便摸了一个基于动画的自动滚动表格

原理

根据每行的大小和设置的每行滚动时间设置滚动位置,动态添加动画,并把数组第一项移动到最后一项,并订阅该动画结束的事件,在结束时循环执行该操作。

其他功能

  • 可自定义单元格或行
  • 可设置中文映射和取消显示
  • 单元格默认基于网格的响应式大小
  • 鼠标进入时可设置暂停

代码

<template>
<div class="title-container" v-if="!props.noTitle">
<div
v-for="item in props.displayTitles ?? Object.keys(props. List[0])"
:key="item"
>
{{ props.titleMapping?.get(item) ?? item }}
</div>
</div>
<div class="scroll-table">
<div
ref="container"
class="container"
v-on:mouseenter="() => {if(props.pauseWhenMouseEnter) animation?.pause()}"
v-on:mouseleave="() => {if(props.pauseWhenMouseEnter) animation?.play()}"
>
<!-- 行插槽,作用于每个单元格,设置每个单元格的格式,设置 item-container 类型可继承组件定义的样式 -->
<slot
name="row"
v-for="(item, index) in innerList"
:key="item.id"
:item="item"
:index="index"
>
<div class="item-container">
<!-- 默认插槽,作用于每个单元格,设置每个单元格的格式,设置 item 类型可继承组件定义的样式 -->
<slot
v-for="key in props.displayTitles ?? Object.keys(props.list[0])"
:key="key"
:item="Object.keys(item.data).includes(key) ? item.data[key] ? item.data[key] : props.undefinedPlaceholder : props.undefinedPlaceholder"
>
<div class="item">
{{ Object.keys(item.data).includes(key) ? item.data[key] ? item.data[key] : props.undefinedPlaceholder : props.undefinedPlaceholder }}
</div>
</slot>
</div>
</slot>
</div>
</div>
</template> <script setup lang="ts">
import BaseBox from "./BaseBox.vue";
import {
defineProps,
withDefaults,
onMounted,
computed,
ref,
watch,
} from "vue";
const props = withDefaults(
defineProps<{
// 属性名翻译为标题,默认值 属性名列表
titleMapping?: Map<string, string>;
// 列宽,与 grid-template-columns 格式,默认值 repeat(${props.displayTitles?.length ?? Object.keys(props.list[0]).length}, 1fr)
columnSizes?: string;
// 列表
list: Array<any>;
// 展示哪些标题,默认值 全部展示
displayTitles?: Array<string>;
// 走完每一行的时间,默认值 2300 ms
interval?: number;
// 是否显示标题行,默认值 true
noTitle?: Boolean;
// 属性无参数时替换为某字符串,默认值 --
undefinedPlaceholder?: string;
// 鼠标进入时暂停,默认值 true
pauseWhenMouseEnter?: Boolean;
}>(),
{
interval: 2300,
noTitle: false,
undefinedPlaceholder: "--",
pauseWhenMouseEnter: false,
}
);
const innerList = ref<Array<{ id: number; data: any }>>(
props.list.map((item, index) => ({ id: index, data: item }))
);
const container = ref<HTMLDivElement>();
onMounted(() => {
animate(true);
});
// 监控数据列表更新
watch(
() => props.list,
() => {
innerList.value = props.list.map((item, index) => ({
id: index,
data: item,
}));
}
);
// 计算列大小
const columnSize = computed(() => {
return (
props.columnSizes ??
`repeat(${
props.displayTitles?.length ?? Object.keys(props.list[0]).length
}, 1fr)`
);
});
// 进行动画
const animation = ref<Animation>();
const animate = (isStart = false) => {
// 计算动画高度
let height = 0;
if (!isStart) {
height = -container.value!.children[1].getBoundingClientRect().height;
// 移动数组第一个到最后一个
let temp = innerList.value.shift();
innerList.value.push(temp!);
} else {
height = -container.value!.children[0].getBoundingClientRect().height;
}
// 进行动画
animation.value = container.value!.animate(
[
{
top: `${height}px`,
},
],
{
duration: props.interval,
iterations: 1,
}
);
// 监听动画完成后,重新开始动画
animation.value.addEventListener("finish", () => animate(false));
};
</script> <style scoped lang="scss">
.title-container {
display: grid;
padding: 1rem 0;
font-size: 1.25rem;
background-color: rgb(24, 34, 103);
grid-template-columns: v-bind(columnSize);
text-align: center;
}
:slotted(.item-container),
.item-container {
overflow: hidden;
position: relative;
left: 0;
right: 0;
top: 0;
display: grid;
padding: 1rem 0;
grid-template-columns: v-bind(columnSize);
}
:slotted(.item),
.item {
text-align: center;
font-size: 1.25rem;
}
.scroll-table {
width: 100%;
height: 100%;
overflow: hidden; .container {
overflow: hidden;
position: relative;
left: 0;
right: 0;
top: 0;
}
}
</style>

参考

vue 基于原生动画的自动滚动表格的更多相关文章

  1. div写表格,原生滚动条,数据能够自动滚动

    如何让表格的滚动条能够自动滚动呢? html: <div class="tabinner5"> <div class="tab5 tab5a" ...

  2. Creating Dialogbased Windows Application (4) / 创建基于对话框的Windows应用程序(四)Edit Control、Combo Box的应用、Unicode转ANSI、Open File Dialog、文件读取、可变参数、文本框自动滚动 / VC++, Windows

    创建基于对话框的Windows应用程序(四)—— Edit Control.Combo Box的应用.Unicode转ANSI.Open File Dialog.文件读取.可变参数.自动滚动 之前的介 ...

  3. flex布局构建大屏框架并支持翻页动画、滚动表格功能

      本文将利用flex属性构建大屏可视化界面.界面主要分标题栏.工具栏.数据可视化窗口.其中,翻页动画以及滚动表格功能分别分布在数据可视化界面两侧. 鼠标点击标题,可看到左侧窗口翻转动画: 整体布局效 ...

  4. vue使用原生js实现滚动页面跟踪导航高亮

    需要使用vue做一个专题页面. 滚动页面指定区域导航高亮. BetterScroll:可能是目前最好用的移动端滚动插件 如何自定义CSS滚动条的样式? 监听滚动页面事件,对比当前页面的位置与元素的位置 ...

  5. 【Vue】input textarea自动滚动到输入处

    由于我这里要把接口返回的日志不断地新增到textarea里,想实现自动滚动日志的效果. 1.首先定一个textarea类型的input组件 <el-input id="textarea ...

  6. Jquery实现图片左右自动滚动

    图片左右滚动的效果想必大家都有见到过吧,其实很简单.在本文将为大家介绍下使用Jquery是如何实现图片左右自动滚动的. 代码如下:<!DOCTYPE HTML>  <html> ...

  7. 基于jQuery的上下左右无缝滚动应用(单行或多行)

    $(function(){     var _wrap=$('ul.line');//定义滚动区域     var _interval=2000;//定义滚动间隙时间     var _moving; ...

  8. Vue过渡与动画

    通过 Vue.js 的过渡系统,可以在元素从 DOM 中插入或移除时自动应用过渡效果.Vue.js 会在适当的时机为你触发 CSS 过渡或动画,你也可以提供相应的 JavaScript 钩子函数在过渡 ...

  9. Vue学习之动画小结(六)

    一.Vue中实现动画的方式:https://cn.vuejs.org/v2/guide/transitions.html Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果.包括 ...

  10. Vue过渡和动画效果展示(案例、GIF动图演示、附源码)

    前言 本篇随笔主要写了Vue过渡和动画基础.多个元素过渡和多个组件过渡,以及列表过渡的动画效果展示.详细案例分析.GIF动图演示.附源码地址获取. 作为自己对Vue过渡和动画效果知识的总结与笔记. 因 ...

随机推荐

  1. Java求数组元素的最大值和最小值

    代码如下: public static void main(String[] args) { int [] a = {1,2,3,88,2,90}; int max = a[0]; int min = ...

  2. 2022-1-10 控件学习2 Button、CheckBox、RadioButton、PasswordBox、Image、ToolTip

    Button         设置带图片的按钮: 设置button按钮通用类型:  CheckBox          IsChecked设置是否选中 RadioButton 使用GroupName这 ...

  3. 从read 系统调用到 C10M 问题

    一.前言 从上个世纪到现在,工程师们在优化服务器性能的过程中,提出了各种不同的io模型,比如非阻塞io,io复用,信号驱动式io,异步io.具体io模型在不同平台上的实现也不一样,比如io复用在bsd ...

  4. koa搭建nodejs项目并注册接口

    使用nodejs注册接口逻辑处理会比较复杂,直接通过express或者koa能够简化开发流程,这里记录用koa来搭建nodejs项目并注册接口,对koa不太熟悉的话可以参考这一篇.让nodejs开启服 ...

  5. [kubernetes]二进制部署k8s集群

    0. 前言 采用二进制部署三主三工作节点的k8s集群,工作节点和Master节点共用服务器,因此只用到了三台服务器.master采用haproxy + keepalive实现高可用.实际生产环境中,建 ...

  6. MySQL配置简单优化与读写测试

    测试方法 先使用sysbench对默认配置的MySQL单节点进行压测,单表数据量为100万,数据库总数据量为2000万,每次压测300秒. sysbench --db-driver=mysql --t ...

  7. C# 中关于 T 泛型【C# 基础】

    〇.前言 C# 里面的泛型不仅可以使用泛型函数.泛型接口,也可以使用泛型类.泛型委托等等.在使用泛型的时候,它们会自行检测你传入参数的类型,因此它可以为我们省去大量的时间,不用一个个编写方法的重载.与 ...

  8. SpringBoot3安全管理

    目录 一.简介 二.工程搭建 1.工程结构 2.依赖管理 三.配置管理 1.核心配置类 2.认证数据源 3.认证流程 4.身份过滤器 四.核心功能 1.登录退出 2.权限校验 五.参考源码 标签:Se ...

  9. 让C#调用vue组件里的方法

    前言:web页面开发时采用的是vue开发的,后台语言是C# 需求:后台需要通过浏览器调用vue组件的方法 c# 可以调用xxx.html 中的script引用的js中定义的方法是可以调用的, 之前c# ...

  10. [Arch小贴士]在这里记录一些自己使用的小技巧

    哈喽!Arch 目录 0x00 设置开机自启动软件 首先 最后 0x01 ASLR开关 0x00 设置开机自启动软件 首先 首先进入目录/usr/share/applications,找到你要的那个软 ...