vue 消息左右滚动(前后无缝衔接)

演示效果

封装的组件

<!--
 * @Author:
 * @Date: 2024-03-21 19:21:58
 * @LastEditTime: 2024-03-21 20:31:50
 * @LastEditors: Please set LastEditors
 * @Description: 消息左右滚动
-->
<template>
  <div
    id="textScroll"
    class="text-scroll"
    @mousemove="inBox"
    @mouseleave="leaveBox"
  >
    <div
      v-for="i in 2"
      :id="'scrollItem' + i"
      :key="'scrollItem' + i"
      class="scroll-item"
      :style="{ display: i === 1 ? 'flex' : 'none' }"
    >
      <slot></slot>
    </div>
  </div>
</template>

<script>
export default {
  components: {},
  data() {
    return {
      left: 0,
      textScrollDiv: null,
      timer: null,
      scrollItemWidth: 0,
      isScroll: false
    };
  },

  computed: {},
  destroyed() {
    clearInterval(this.timer);
  },
  mounted() {
    const that = this;
    this.$nextTick(() => {
      that.textScrollDiv = document.querySelector('#textScroll');
      that.scrollItemWidth = document.querySelector('#scrollItem1').clientWidth;
      const outerBoxWidth = that.textScrollDiv.clientWidth;
      if (outerBoxWidth < that.scrollItemWidth) {
        this.isScroll = true;
        that.textScrollDiv.style.width = `${that.scrollItemWidth * 2}px`;
        that.timer = setInterval(function() {
          that.moveLeft();
        }, 30);
        document.querySelector('#scrollItem2').style.display = 'flex';
      }
    });
  },
  methods: {
    moveLeft() {
      if (this.textScrollDiv) {
        this.left -= 1;
        if (Math.abs(this.left) > this.scrollItemWidth) {
          this.left = 0;
        }
        this.textScrollDiv.style.transform = `translate(${this.left}px, 0px)`;
      }
    },
    // 鼠标划入区域
    inBox() {
      if (this.isScroll) {
        clearInterval(this.timer);
        this.timer = null;
      }
    },
    // 鼠标离开区域
    leaveBox() {
      if (this.isScroll) {
        const that = this;
        this.timer = setInterval(function() {
          that.moveLeft();
        }, 30);
      }
    }
  }
};
</script>
<style lang="less" scoped>
.text-scroll {
  display: flex;
  flex-wrap: nowrap;
  transition: all 0ms ease-in 0s;
  .scroll-item {
    display: flex;
    flex-wrap: nowrap;
  }
}
</style>

外部引用

<template>
        <!-- 公告信息板块 -->
    <div v-if="noticeInfo && noticeInfo.length > 0" class="notice-plate">
      <div class="plate-body">
        <div class="plate-icon">
          <i class="sxqyjj-iconfont sxqyjj-xiaoxi1"></i>
        </div>
        <div class="plate-info" @click="handleInfo($event)">
          <textScroll>
            <div
              v-for="(item, i) in noticeInfo"
              :key="'notice' + i"
              class="info-item"
              :data-my-id="item.id"
            >
              {{ item.title }}
              <div v-if="i < noticeInfo.length - 1" class="line-split"></div>
            </div>
          </textScroll>
        </div>
        <div class="plate-more" @click="moreInfo">
          更多
          <i class="sxqyjj-iconfont sxqyjj-chevron-right"></i>
        </div>
      </div>
    </div>
</template>
<script>
import textScroll from '@packages/views/components/text-scroll/index.vue';

export default {
  name: 'Index',
  components: {
    textScroll
  },
  data() {
    return {
      noticeInfo: [],
    };
  },
  created() {
    this.getLastThreeConsultation();
  },
  methods: {
    // 获取重点资讯
    getLastThreeConsultation() {
      this.$api['search/getLastThreeConsultation']()
        .then(res => {
          if (res.code === this.$constant.apiServeCode.SUCCESS_CODE) {
            this.noticeInfo = res.data || [];
          }
          return true;
        })
        .catch(err => {
          console.log(err);
         });
        }
    }
  }
};
</script>
<style lang="less" scoped>
/* stylelint-disable */

.notice-plate {
  width: 1328px;
  margin: 0 auto;
  margin-top: 24px;
  .plate-body {
    display: flex;
    align-items: flex-start;
    width: 100%;
    height: 48px;
    padding: 10px 16px;
    margin-left: -64px;
    background: white;
    border: 1px solid rgba(0, 0, 0, 0.1);
    border-radius: 4px 4px 4px 4px;
    .plate-icon {
      width: 28px;
      height: 28px;
      margin-right: 16px;
      line-height: 28px;
      color: rgba(255, 143, 31, 1);
      text-align: center;
      background: rgb(255, 247, 241);
      border-radius: 4px 4px 4px 4px;
    }
    .plate-info {
      width: calc(100% - 112px);
      height: 28px;
      overflow: hidden;
      line-height: 28px;
      .info-item {
        position: relative;
        margin-right: 32px;
        font-weight: 500;
        white-space: nowrap;
        &:hover {
          color: rgba(0, 128, 255, 1);
          cursor: pointer;
        }
      }
      .line-split {
        position: absolute;
        top: 6px;
        right: -16px;
        width: 2px;
        height: 12px;
        border-right: 1px solid rgba(217, 217, 217, 1);
      }
    }
    .plate-more {
      height: 28px;
      margin-left: 16px;
      font-size: 14px;
      line-height: 28px;
      color: @text-2;
      cursor: pointer;
      i {
        margin-left: 4px;
      }
    }
  }
}
</style>

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

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

相关文章

SpringBoot如何替换启动图标

SpringBoot项目在启动时会出现一个默认的启动图案 . ____ _ __ _ _/\\ / ____ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | _ | _| | _ \/ _ | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) ) |____| .__|_| |_|_| |_\__, | / / / /|_||___//_/_/_/::…

CUDA | 线程模型结构

grid > 网格&#xff1b;block > 线程块&#xff1b; 线程分块是逻辑上的划分&#xff0c;物理上线程不分块 配置线程&#xff1a; <<<grid_size, block_size>>> 最大允许线程块大小&#xff1a;1024最大允许网格大小&#xff1a;2^31 - 1 &#xff08…

两台电脑简单的通信过程详解(经过两个路由器,不同网段)

一、eNSP拓扑图 二、配置4台电脑的IP地址、子网掩码、网关地址。 三、配置路由器 1.AR1-接口对应IP <Huawei>sys #进入系统视图 [Huawei]int g0/0/0 #进入0/0/0接口 [Huawei-GigabitEthernet0/0/0]ip address 192.168.0.1 24 #配置ip和掩码 [Huawei-GigabitEthernet0…

【nginx】反向代理和负载均衡

文章目录 一、介绍二、好处三、反向代理和负载均衡3.1 nginx 反向代理的配置方式3.2 nginx 负载均衡的配置方式&#xff1a; 一、介绍 nginx 反向代理&#xff1a; 就是将前端发送的动态请求由 nginx 转发到后端服务器 二、好处 nginx 反向代理的好处&#xff1a; 提高访问速…

翻看去年录的幼儿园选择的视频,我被打脸了,真疼

去年 7 月份发了一个幼儿园选择的视频&#xff0c;如今回头看&#xff0c;我被打脸了&#xff0c;真疼呀 去年的选择 省流版&#xff1a;当时我列了三种选择&#xff1a; 普惠公立幼儿园普惠私立或民办有政府补贴的幼儿园私立幼儿园 以下讨论是基于我个人情况&#xff0c;在北京…

JupyterNotebook 如何切换使用的虚拟环境kernel

在Jupyter Notebook中&#xff0c;如果需要修改使用的虚拟环境Kernel&#xff1a; 首先&#xff0c;需要确保虚拟环境已经安装conda上【conda基本操作】 打开Jupyter Notebook。 在Jupyter Notebook的顶部菜单中&#xff0c;选择 “New” 在弹出的窗口中&#xff0c;列出了…

redis功能点

一、redis简介 概述 Redis 是速度非常快的非关系型&#xff08;NoSQL&#xff09;内存键值数据库&#xff0c;可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串&#xff0c;值支持五种数据类型&#xff1a;字符串、列表、集合、散列表、有序集合。 Redis 支持很…

Pandas与Jupyter Notebook的完美结合【第153篇—数据分析】

利用Python进行数据分析&#xff1a;Pandas与Jupyter Notebook的完美结合 在数据科学和分析领域&#xff0c;Python语言因其强大的数据处理库而备受青睐。其中&#xff0c;Pandas是Python中最常用的数据分析库之一&#xff0c;而Jupyter Notebook则是一个流行的交互式计算环境…

基于python+vue文学名著分享系统的设计与实现flask-django-nodejs-php

随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的文学名著分享系统。当前的信息管理存在工作效率…

【网络基础】VRRP虚拟路由冗余协议介绍与配置

目录 一、VRRP的概述 1.1 VRRP的由来 1.2 作用 1.3 基本结构 1.4 状态机流程 1.5 设备类型 二、 实例演示 一、VRRP的概述 1.1 VRRP的由来 局域网中的用户终端通常采用配置一个默认网关的形式访问外部网络&#xff0c;如果此时默认网关设备发生故障&#xff0c;将中断…

OpenCV 介绍使用

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV4.9.0开源计算机视觉库使用简要说明 下一篇: OpenCV&#xff08;开源计算机视觉库&#xff1a;http://opencv.org&#xff09;是一个开源库&#xff0c;包含数百种计算机视觉算法。…

【单元测试】一文读懂java单元测试

目录 1. 什么是单元测试2. 为什么要单元测试3. 单元测试框架 - JUnit3.1 JUnit 简介3.2 JUnit 内容3.3 JUnit 使用3.3.1 Controller 层单元测试3.3.2 Service 层单元测试3.3.3 Dao 层单元测试3.3.4 异常测试3.3.5 测试套件测多个类3.3.6 idea 中查看单元测试覆盖率3.3.7 JUnit …

戳-考察C++基础的两道小题

昨天分享了一天本来是考察unique_ptr禁止拷贝行为的&#xff0c;但是粘贴的时候贴成正确代码了&#xff0c;于是&#xff0c;今天继续找两道小题来练练手。 今天这两道小题&#xff0c;你能回答上来不&#xff0c;题目1有至少6处错误&#xff0c;你能找到几个&#xff1f;题目2…

基于转录组计算的肿瘤纯度与病理肿瘤纯度一致性差异

实体瘤组织由肿瘤和非肿瘤细胞组成&#xff0c;如基质细胞和免疫细胞。这些非肿瘤细胞构成肿瘤微环境&#xff08;TME&#xff09;的重要组成部分&#xff0c;可降低肿瘤纯度&#xff0c;并在癌变、恶性肿瘤进展、治疗耐药性和预后评估中发挥重要作用。 肿瘤间质比的预后影响 …

人工智能 vs 机器学习

本文是观看视频AI vs Machine Learning后的笔记。 这篇文章谈AI&#xff08;人工智能&#xff09;和ML&#xff08;机器学习&#xff09;的关系。 首先作者给出了他对AI的定义。他认为&#xff1a;人工智能基本上超越或匹配人类的能力。 那会涉及哪些能力&#xff0c;例如&am…

5.域控服务器都要备份哪些资料?如何备份DNS服务器?如何备份DHCP服务器?如何备份组策略?如何备份服务器状态的备份?

&#xff08;2.1) NTD(域控数据库&#xff09;备份 &#xff08;2.2&#xff09;DNS备份 &#xff08;2.3&#xff09;DHCP备份 &#xff08;2.4&#xff09;组策略备份 &#xff08;2.5&#xff09;CA证书备份 &#xff08;2.6&#xff09;系统状态备份 &#xff08;2.1)…

序列的使用

目录 序列的创建 序列的使 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 在许多数据库之中都会存在有一种数据类型 — 自动增长列&#xff0c;它能够创建流水号。如果想在 Oracle 中实现这样的自动增长列&#xff0c;可…

我的电脑win11系统安装了谷歌浏览器,桌面的快捷方式打不开

安装好浏览器以后双击打不开右键打开文件位置也弹窗报错提示 但是我发现开始栏里面可以打开 说明我的软件应该是没有问题的&#xff0c;研究了一下 我实际的安装目录在&#xff1a;C:\Program Files\Google\Chrome\Application 桌面的快捷方式右键查看属性显示的地址却不对&a…

ChatGPTGPT4科研应用、数据分析与机器学习、论文高效写作、AI绘图技术教程

原文链接&#xff1a;ChatGPTGPT4科研应用、数据分析与机器学习、论文高效写作、AI绘图技术教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247598506&idx2&sn14f96667bfbeba5f51366a1f019e3d64&chksmfa82004dcdf5895bba2784ba10f6715f6f5e4c59c9b1…

李国武:如何评估一家精益制造咨询公司的实施能力?

在制造业转型升级的大背景下&#xff0c;精益制造已成为企业提升竞争力、实现可持续发展的关键。然而&#xff0c;面对市场上众多的精益制造咨询公司&#xff0c;如何评估其实施能力成为了众多企业的难题。本文将从多个方面为大家揭示评估精益制造咨询公司实施能力的方法&#…