当前位置: 首页 > wzjs >正文

顺德龙江网站建设天津优化公司哪家好

顺德龙江网站建设,天津优化公司哪家好,郑州网站设计排行,代办记账代理公司vue3elementPluscssjs 模拟liMarquee插件,实现无限滚动效果 功能:1、表格数据大于一定数量之后,开始向上滚动 2、当鼠标移入的时候,动画停止,鼠标移出,继续动画 3、滚动动画的速度可以自定义 4、表格的高度…

vue3+elementPlus+css+js 模拟liMarquee插件,实现无限滚动效果

功能:1、表格数据大于一定数量之后,开始向上滚动

           2、当鼠标移入的时候,动画停止,鼠标移出,继续动画

           3、滚动动画的速度可以自定义

           4、表格的高度固定

           5、向上滚动时,无限滚动,不存在卡顿

<template>

  <div

    class="scrolling-table-container"

    @mouseenter="pauseAnimation"

    @mouseleave="resumeAnimation"

  >

    <div class="table-wrapper" :style="{ height: tableHeight }">

      <el-table

        :data="displayData"

        :loading="loading"

        style="width: 100%"

        :show-header="showHeader"

        :row-key="rowKey"

        class="scrolling-table"

        :class="{

          'enable-scroll': needScroll,

          'is-paused': isPaused

        }"

      >

        <el-table-column

          v-for="column in columns"

          :key="column.prop"

          :prop="column.prop"

          :label="column.label"

          :width="column.width"

          :min-width="column.minWidth"

          :fixed="column.fixed"

        >

          <template #default="scope" v-if="column.hasSlot">

            <slot :name="column.prop" :row="scope.row" :index="scope.$index"></slot>

          </template>

        </el-table-column>

      </el-table>

    </div>

  </div>

</template>

<script setup lang="ts" name="ScrollingTable">

import { ref, computed, watch, onMounted, onBeforeUnmount } from 'vue'

import { ElTable, ElTableColumn } from 'element-plus'

interface TableColumn {

  prop: string

  label: string

  width?: string | number

  minWidth?: string | number

  fixed?: string | boolean

  hasSlot?: boolean

}

interface ScrollingTableProps {

  tableData: Record<string, unknown>[]

  columns: TableColumn[]

  loading?: boolean

  rowKey?: string

  showHeader?: boolean

  tableHeight?: string

  scrollThreshold?: number

  scrollSpeed?: number

  scrollDelay?: number

}

const props = withDefaults(defineProps<ScrollingTableProps>(), {

  loading: false,

  rowKey: 'id',

  showHeader: true,

  tableHeight: '250px',

  scrollThreshold: 8,

  scrollSpeed: 120,

  scrollDelay: 2000

})

const displayData = ref<Record<string, unknown>[]>([])

const isPaused = ref(false)

let delayTimer: number | null = null

// 计算是否需要滚动

const needScroll = computed(() => props.tableData.length > props.scrollThreshold)

// 计算动画持续时间

const animationDuration = computed(() => {

  if (!needScroll.value) return 0

  // 基于数据长度计算合适的动画时间,确保平滑滚动

  return Math.max(props.tableData.length * props.scrollSpeed, 3000)

})

// 初始化显示数据

const initDisplayData = () => {

  if (needScroll.value && props.tableData.length > 0) {

    // 为无缝滚动复制数据

    displayData.value = [

      ...props.tableData,

      ...props.tableData

    ]

  } else {

    displayData.value = [...props.tableData]

  }

}

// 启动动画(延迟)

const startAnimation = () => {

  if (!needScroll.value) return

  clearTimeout(delayTimer!)

  delayTimer = setTimeout(() => {

  }, props.scrollDelay)

}

// 停止所有定时器

const stopTimers = () => {

  if (delayTimer) {

    clearTimeout(delayTimer)

    delayTimer = null

  }

}

// 暂停动画

const pauseAnimation = () => {

  isPaused.value = true

}

// 恢复动画

const resumeAnimation = () => {

  isPaused.value = false

}

// 重新初始化

const reinitialize = () => {

  stopTimers()

  isPaused.value = false

  initDisplayData()

  startAnimation()

}

// 监听数据变化

watch(() => props.tableData, () => {

  reinitialize()

}, { immediate: true })

// 监听配置变化

watch([

  () => props.scrollThreshold,

  () => props.scrollSpeed,

  () => props.scrollDelay

], () => {

  reinitialize()

})

onMounted(() => {

  startAnimation()

})

onBeforeUnmount(() => {

  stopTimers()

})

// 暴露方法

defineExpose({

  reinitialize,

  needScroll,

  pauseAnimation,

  resumeAnimation

})

</script>

<style lang="scss" scoped>

.scrolling-table-container {

  cursor: default;

  :deep(.el-table thead){

    color: #242933 !important;

    font-weight: 500;

  }

  .table-wrapper {

    overflow: hidden;

    position: relative;

     :deep(.el-table thead th.el-table__cell) {

        background: #F8F9FA !important;

      }

  }

  .scrolling-table {

    // 基本样式

    :deep(.el-table__body-wrapper) {

      overflow: hidden !important;

     

      &::-webkit-scrollbar {

        display: none;

      }

    }

   

    :deep(.el-table__header-wrapper) {

      overflow-x: hidden;

    }

    :deep(.el-table thead){

      color: #242933 !important;

      font-weight: 500;

    }

    :deep(.el-table__row) {

      transition: none;

    }

   

    :deep(.el-table__body) {

      transition: none;

    }

   

    // 鼠标悬停样式

    :deep(.el-table__row):hover {

      background-color: #f5f7fa;

    }

   

    // 启用滚动时的动画

    &.enable-scroll :deep(.el-table__body) {

      animation: scroll-up v-bind("animationDuration + 'ms'") linear infinite;

      animation-delay: v-bind("scrollDelay + 'ms'");

    }

   

    // 暂停状态

    &.is-paused :deep(.el-table__body) {

      animation-play-state: paused;

    }

  }

}

// 滚动动画关键帧 - 无限向上滚动

@keyframes scroll-up {

  0% {

    transform: translateY(0);

  }

  100% {

    transform: translateY(-50%);

  }

}

// 响应式优化

@media (prefers-reduced-motion: reduce) {

  .scrolling-table.enable-scroll :deep(.el-table__body) {

    animation: none;

  }

}

</style>

相比liMarquee,优点如下:

1、不用使用npm 安装liMarquee包

2、liMarquee是基于jquery的,使用liMarquee,还得安装jquery

3、使用js、css 实现动画效果,性能友好

http://www.dtcms.com/wzjs/409969.html

相关文章:

  • 无锡网站制作的公司有哪些sem全称
  • 济南商城网站开发google怎么推广
  • 秦皇岛做网站的公司选汉狮太原网站建设开发
  • 帝国做的电影网站活动软文怎么写
  • 做域名代理网站网站的建设流程
  • php做动漫网站怎么在广告联盟接广告
  • linux wordpress 域名杭州优化seo公司
  • 地方门户网站盈利模式杭州网站优化
  • wordpress 手机验证码seo手机端排名软件
  • 买了域名之后如何做网站河北seo网络推广
  • 网站 开发 合同宁波seo公司排名榜
  • 济南做网站费用网址提交
  • 广德做网站设计开发seo免费
  • 衡阳企业网站建设价格seocms
  • 可商用图片素材网站中国十大热门网站排名
  • 网站空间费用优化公司网站
  • 辽宁建设工程信息网官网新网站是哪个百度联盟注册
  • 龙岗企业网站建设国内搜索引擎有哪些
  • 阿里云虚拟主机建网站google谷歌搜索引擎
  • wordpress建站镜像seo挖关键词
  • 合同下载 公司网站公司网站建设费用多少
  • 南阳教育论坛网站建设宣传推广文案
  • 河北省建设工程信息网站神马搜索推广
  • 网站建设与管理的网页百度注册公司网站
  • 网站建设对企业的重要性站长之家源码
  • 昆明网站建设价目表2023年新冠疫情最新消息
  • 网站维护常识免费域名解析
  • 网络营销推广方法和工具宁波seo网络推广公司排名
  • 美容网站制作沈阳今天刚刚发生的新闻
  • 生活馆网站开发背景移动网站推广如何优化