第三方实现跑马灯和手写实现跑马灯

本文展示了如何使用CSS、HTML和JavaScript手写实现跑马灯效果,以及引用了两个第三方跑马灯组件的链接。代码包括设置滚动速度、初始化跑马灯内容和实现文字横向滚动的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第三方实现跑马灯

  • https://vue3-marquee.vercel.app/guide.html#changes-from-v2
  • https://evodiaaut.github.io/vue-marquee-text-component/

手写实现跑马灯

CSS部分

    <style>
      .marquee-wrap {
        box-sizing: border-box;
        width: 814px;
        height: 36px;
        background-color: rgba(255, 255, 255, 0);
        background-image: linear-gradient(
          to left,
          rgba(255, 255, 255, 0),
          #dfbb7b,
          rgba(255, 255, 255, 0)
        );
        line-height: 24px;
        font-size: 16px;
        text-align: center;
        border-radius: 5px;
        overflow: hidden;
        user-select: none;
        color: #181818;
        position: absolute;
        top: 290px;
        left: 58%;
        transform: translateX(-50%);
      }

      .scroll_div {
        white-space: nowrap;
        overflow: hidden;
      }

      .scroll_div pre {
        display: inline-block;
        height: 36px;
        margin: 0px;
        line-height: 36px;
      }
    </style>

HTML部分

    <div class="marquee-wrap">
      <div class="marquee-content">
        <div class="scroll_div">
          <pre class="scroll_begin" id="marqueeList"></pre>
          <pre class="scroll_end" style="display: inline-block"></pre>
        </div>
      </div>
    </div>

JS部分

<script>
      initMarquee();
      // 设置滚动
      var scroll_div = document.getElementsByClassName("scroll_div")[0];
      var scroll_begin = document.getElementsByClassName("scroll_begin")[0];
      var scroll_end = document.getElementsByClassName("scroll_end")[0];
      function initMarquee() {
        var processedCfg = {};
        // 假数据
        processedCfg.marqueeList = [
          { id: 1, user: "2624*****", name: " 黯晶巨牛 阿利斯塔 " },
          { id: 2, user: "2624*****", name: " 咖啡甜心 索拉卡 " },
          { id: 3, user: "2624*****", name: " 防暴机器人 布里茨 " },
          { id: 4, user: "2624*****", name: " 创世之神 内瑟斯 " },
          { id: 5, user: "2624*****", name: " 秩序之舌 塔姆 " },
          { id: 6, user: "2624*****", name: " 摄魂男爵 弗拉基米尔 " },
          { id: 7, user: "2624*****", name: " 传统造型 特朗德尔 " },
          { id: 8, user: "2624*****", name: " 夜行义贼 艾瑞莉娅 " },
          { id: 9, user: "3012*****", name: " 海贼 瑞兹 " },
          { id: 10, user: "3561*****", name: " 灵魂烈焰 布兰德 " },
          { id: 11, user: "1104*****", name: " 恶咒亡魂 魔腾 " },
          { id: 12, user: "1228*****", name: " 炎爆 慎 " },
          { id: 13, user: "1340*****", name: " 苍穹之光 维克兹 " },
          { id: 14, user: "3080*****", name: " 极度深寒 拉莫斯 " },
          { id: 15, user: "1198*****", name: " 战斗学院 永恩 " },
          { id: 16, user: "9748*****", name: " 光明哨兵 艾瑞莉娅 " },
          { id: 17, user: "1612*****", name: " 魔幻卡牌 崔斯特 " },
          { id: 18, user: "9748*****", name: " 猎天使魔女 薇恩 " },
          { id: 19, user: "2421*****", name: " 冰雪节 辛吉德 " },
          { id: 20, user: "4039*****", name: " 霹雳游侠 弗拉基米尔 " },
          { id: 21, user: "1915*****", name: " 奥术师 萨科 " },
          { id: 22, user: "2864*****", name: " 屠龙勇士 图奇 " },
          { id: 23, user: "2864*****", name: " 虚空执事 玛尔扎哈 " },
          { id: 24, user: "2864*****", name: " 银河魔装机神 菲兹 " },
          { id: 25, user: "4039*****", name: " 糖果女巫 璐璐 " },
          { id: 26, user: "1607*****", name: " 飞车暴走族 古拉加斯 " },
          { id: 27, user: "1249*****", name: " 梅花国王 莫德凯撒 " },
          { id: 28, user: "1249*****", name: " 野兽猎人 德莱文 " },
          { id: 29, user: "1249*****", name: " 战地之王 加里奥 " },
          { id: 30, user: "4119*****", name: " 圣诞捣蛋鬼 金克丝 " },
          { id: 31, user: "1249*****", name: " 雪默丁格 " },
          { id: 32, user: "8772*****", name: " 黯晶战神 赛恩 " },
          { id: 33, user: "8772*****", name: " 持胡萝卜的雪人 易 " },
          { id: 34, user: "1781*****", name: " 绿茵门神 茂凯 " },
          { id: 35, user: "4039*****", name: " 品酒大师 古拉加斯 " },
          {
            id: 36,
            user: "8772*****",
            name: " 五杀摇滚 III:遗失的章节 卡尔萨斯 "
          }
        ];
        var marqueeListHtml = "";
        for (var i in processedCfg.marqueeList) {
          marqueeListHtml +=
            "<span>用户 " +
            processedCfg.marqueeList[i].user +
            " 抽中 " +
            processedCfg.marqueeList[i].name +
            " </span>";
        }
        document.getElementById("marqueeList").innerHTML = marqueeListHtml;

        scroll_div = document.getElementsByClassName("scroll_div")[0];
        scroll_begin = document.getElementsByClassName("scroll_begin")[0];
        scroll_end = document.getElementsByClassName("scroll_end")[0];
        if (scroll_begin && scroll_begin.offsetWidth > scroll_div.offsetWidth) {
          ScrollImgLeft();
          scroll_end.style.display = "inline-block";
        }

        // 文字横向滚动
        function ScrollImgLeft() {
          var speed = 100; // 滚动速度
          var MyMar = null; // 计时器
          scroll_end.innerText = scroll_begin.innerText;
          function Marquee() {
            if (scroll_end.offsetWidth - scroll_div.scrollLeft <= 0) {
              scroll_div.scrollLeft -= scroll_begin.offsetWidth;
            } else {
              scroll_div.scrollLeft += 2;
            }
          }
          MyMar = setInterval(Marquee, speed);
        }
      }
    </script>

手写实现跑马灯【整体代码】

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>走马灯</title>
    <style>
      .marquee-wrap {
        box-sizing: border-box;
        width: 814px;
        height: 36px;
        background-color: rgba(255, 255, 255, 0);
        background-image: linear-gradient(
          to left,
          rgba(255, 255, 255, 0),
          #dfbb7b,
          rgba(255, 255, 255, 0)
        );
        line-height: 24px;
        font-size: 16px;
        text-align: center;
        border-radius: 5px;
        overflow: hidden;
        user-select: none;
        color: #181818;
        position: absolute;
        top: 290px;
        left: 58%;
        transform: translateX(-50%);
      }

      .scroll_div {
        white-space: nowrap;
        overflow: hidden;
      }

      .scroll_div pre {
        display: inline-block;
        height: 36px;
        margin: 0px;
        line-height: 36px;
      }
    </style>
  </head>
  <body>
    <div class="marquee-wrap">
      <div class="marquee-content">
        <div class="scroll_div">
          <pre class="scroll_begin" id="marqueeList"></pre>
          <pre class="scroll_end" style="display: inline-block"></pre>
        </div>
      </div>
    </div>

    <script>
      initMarquee();
      // 设置滚动
      var scroll_div = document.getElementsByClassName("scroll_div")[0];
      var scroll_begin = document.getElementsByClassName("scroll_begin")[0];
      var scroll_end = document.getElementsByClassName("scroll_end")[0];
      function initMarquee() {
        var processedCfg = {};
        // 假数据
        processedCfg.marqueeList = [
          { id: 1, user: "2624*****", name: " 黯晶巨牛 阿利斯塔 " },
          { id: 2, user: "2624*****", name: " 咖啡甜心 索拉卡 " },
          { id: 3, user: "2624*****", name: " 防暴机器人 布里茨 " },
          { id: 4, user: "2624*****", name: " 创世之神 内瑟斯 " },
          { id: 5, user: "2624*****", name: " 秩序之舌 塔姆 " },
          { id: 6, user: "2624*****", name: " 摄魂男爵 弗拉基米尔 " },
          { id: 7, user: "2624*****", name: " 传统造型 特朗德尔 " },
          { id: 8, user: "2624*****", name: " 夜行义贼 艾瑞莉娅 " },
          { id: 9, user: "3012*****", name: " 海贼 瑞兹 " },
          { id: 10, user: "3561*****", name: " 灵魂烈焰 布兰德 " },
          { id: 11, user: "1104*****", name: " 恶咒亡魂 魔腾 " },
          { id: 12, user: "1228*****", name: " 炎爆 慎 " },
          { id: 13, user: "1340*****", name: " 苍穹之光 维克兹 " },
          { id: 14, user: "3080*****", name: " 极度深寒 拉莫斯 " },
          { id: 15, user: "1198*****", name: " 战斗学院 永恩 " },
          { id: 16, user: "9748*****", name: " 光明哨兵 艾瑞莉娅 " },
          { id: 17, user: "1612*****", name: " 魔幻卡牌 崔斯特 " },
          { id: 18, user: "9748*****", name: " 猎天使魔女 薇恩 " },
          { id: 19, user: "2421*****", name: " 冰雪节 辛吉德 " },
          { id: 20, user: "4039*****", name: " 霹雳游侠 弗拉基米尔 " },
          { id: 21, user: "1915*****", name: " 奥术师 萨科 " },
          { id: 22, user: "2864*****", name: " 屠龙勇士 图奇 " },
          { id: 23, user: "2864*****", name: " 虚空执事 玛尔扎哈 " },
          { id: 24, user: "2864*****", name: " 银河魔装机神 菲兹 " },
          { id: 25, user: "4039*****", name: " 糖果女巫 璐璐 " },
          { id: 26, user: "1607*****", name: " 飞车暴走族 古拉加斯 " },
          { id: 27, user: "1249*****", name: " 梅花国王 莫德凯撒 " },
          { id: 28, user: "1249*****", name: " 野兽猎人 德莱文 " },
          { id: 29, user: "1249*****", name: " 战地之王 加里奥 " },
          { id: 30, user: "4119*****", name: " 圣诞捣蛋鬼 金克丝 " },
          { id: 31, user: "1249*****", name: " 雪默丁格 " },
          { id: 32, user: "8772*****", name: " 黯晶战神 赛恩 " },
          { id: 33, user: "8772*****", name: " 持胡萝卜的雪人 易 " },
          { id: 34, user: "1781*****", name: " 绿茵门神 茂凯 " },
          { id: 35, user: "4039*****", name: " 品酒大师 古拉加斯 " },
          {
            id: 36,
            user: "8772*****",
            name: " 五杀摇滚 III:遗失的章节 卡尔萨斯 "
          }
        ];
        var marqueeListHtml = "";
        for (var i in processedCfg.marqueeList) {
          marqueeListHtml +=
            "<span>用户 " +
            processedCfg.marqueeList[i].user +
            " 抽中 " +
            processedCfg.marqueeList[i].name +
            " </span>";
        }
        document.getElementById("marqueeList").innerHTML = marqueeListHtml;

        scroll_div = document.getElementsByClassName("scroll_div")[0];
        scroll_begin = document.getElementsByClassName("scroll_begin")[0];
        scroll_end = document.getElementsByClassName("scroll_end")[0];
        if (scroll_begin && scroll_begin.offsetWidth > scroll_div.offsetWidth) {
          ScrollImgLeft();
          scroll_end.style.display = "inline-block";
        }

        // 文字横向滚动
        function ScrollImgLeft() {
          var speed = 100; // 滚动速度
          var MyMar = null; // 计时器
          scroll_end.innerText = scroll_begin.innerText;
          function Marquee() {
            if (scroll_end.offsetWidth - scroll_div.scrollLeft <= 0) {
              scroll_div.scrollLeft -= scroll_begin.offsetWidth;
            } else {
              scroll_div.scrollLeft += 2;
            }
          }
          MyMar = setInterval(Marquee, speed);
        }
      }
    </script>
  </body>
</html>

自己细心研究一下上述代码

Have a Nice Day~

### 实现 Vue 跑马灯组件支持上下滚动切换效果 要在 Vue 中实现跑马灯(Marquee)组件并支持上下滚动切换的效果,可以通过自定义逻辑控制 DOM 元素的位置变化来完成。以下是详细的解决方案: #### 自定义上下滚动 Marquee 组件的实现方法 通过监听定时器事件动态调整目标元素的 `top` 属性值,当达到容器边界时重置位置以形成循环滚动效果。 ```javascript <template> <div class="container"> <div ref="scrollText" class="scroll-text">{{ text }}</div> </div> </template> <script> export default { data() { return { text: "这是一个向上滚动的文字跑马灯效果示例。", intervalId: null, step: 1, // 每次移动的距离(px) speed: 50, // 移动速度(ms),即每帧间隔时间 }; }, mounted() { this.startScroll(); }, beforeDestroy() { clearInterval(this.intervalId); }, methods: { startScroll() { const containerHeight = this.$el.offsetHeight; const textElement = this.$refs.scrollText; let currentTop = 0; // 初始顶部偏移量 this.intervalId = setInterval(() => { currentTop -= this.step; // 向上移动一步 if (Math.abs(currentTop) >= textElement.offsetHeight) { currentTop = containerHeight; // 循环到顶部重新开始 } textElement.style.top = `${currentTop}px`; }, this.speed); }, }, }; </script> <style scoped> .container { position: relative; height: 30px; /* 容器高度 */ overflow: hidden; } .scroll-text { position: absolute; white-space: nowrap; top: 0; } </style> ``` 上述代码实现了基于 Vue 的简单上下滚动文字效果[^6]。核心在于利用 JavaScript 动态修改子元素的 `top` 样式属性,并配合 CSS 设置溢出隐藏 (`overflow: hidden`) 来裁剪超出范围的内容。 --- #### 使用第三方库扩展功能 如果希望减少开发成本或者需要更复杂的动画效果,可以选择现有的 Vue 插件或组件库作为基础进行定制化改造。例如引用中的 **Vue3Marquee** 或者其他类似的插件可能已经提供了丰富的配置选项支持多种方向的滚动模式[^7]。 安装依赖: ```bash npm install vue3-marquee --save ``` 引入并注册组件后设置参数指定垂直方向运动即可满足需求[^8]: ```vue <template> <div> <vue3-marquee direction="up">这里是向上的跑马灯内容。</vue3-marquee> </div> </template> <script> import Vue3Marquee from 'vue3-marquee'; export default { components: { Vue3Marquee }, }; </script> ``` 此方案的优势在于无需手动编写大量底层交互逻辑,同时能够快速集成进现有项目架构当中[^9]。 --- ### 注意事项 无论是采用手写还是借助外部工具的方式构建此类特性都需要关注性能优化问题,在频繁触发浏览器布局计算操作的情况下可能会引起页面卡顿现象发生因此建议尽可能缓存尺寸数据以及合理规划更新频率从而提升用户体验度[^10]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值