Vue实现简单的跑马灯

yizhihongxing

下面是使用Vue实现简单的跑马灯的完整攻略:

1. 准备工作

首先需要引入Vue库,以及一些基础的CSS样式(可根据需要自行添加):

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vue跑马灯</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        .wrapper {
            overflow: hidden;
            white-space: nowrap;
            width: 100%;
            height: 50px;
        }

        .text {
            display: inline-block;
            margin-right: 50px;
        }

        /* 鼠标移上去时停止滚动 */
        .wrapper:hover {
            animation-play-state: paused;
        }

        /* 动画 */
        @keyframes scroll {
            0% {
                transform: translateX(0);
            }
            100% {
                transform: translateX(-100%);
            }
        }
    </style>
</head>
<body>
    <div id="app">
        <div class="wrapper">
            <div class="text">这是第一条跑马灯内容</div>
            <div class="text">这是第二条跑马灯内容</div>
            <div class="text">这是第三条跑马灯内容</div>
        </div>
    </div>
</body>
</html>

2. Vue实现跑马灯

在HTML结构中,我们已经准备好了跑马灯的内容,接下来需要用Vue来实现滚动效果。

在Vue实例的created钩子中,我们通过setInterval方法每隔一定时间调用一次scroll方法来实现文字的滚动效果。在scroll方法中,我们通过计算文字内容的总长度和每次移动的距离,来更新wrapper元素的transform属性,实现滚动效果。

<div id="app">
    <div class="wrapper" ref="textWrapper">
        <div class="text">这是第一条跑马灯内容</div>
        <div class="text">这是第二条跑马灯内容</div>
        <div class="text">这是第三条跑马灯内容</div>
    </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var app = new Vue({
        el: '#app',
        created: function () {
            var self = this;
            setInterval(function () {
                self.scroll();
            }, 20);
        },
        methods: {
            scroll: function () {
                var wrapper = this.$refs.textWrapper;
                var firstChild = wrapper.children[0];
                var wrapperWidth = wrapper.offsetWidth;
                var firstChildWidth = firstChild.offsetWidth;
                var offset = 1; // 每次滚动的距离

                // 如果当前元素移动到屏幕外面,就重新插入到列表的最后面
                if (wrapperWidth + wrapper.scrollLeft <= firstChildWidth) {
                    wrapper.appendChild(firstChild.cloneNode(true));
                    wrapper.scrollTop = 0;
                } else {
                    wrapper.scrollLeft += offset;
                }
            }
        }
    });
</script>

示例1:https://codepen.io/pen/abyPOmO

在第一个示例中,我们每隔20ms滚动一次文字内容,每次滚动的距离为1px,文字内容滚动到屏幕外时,将其复制一份插入到元素列表的最后面,从而实现无限滚动效果。

3. 参数配置

以上示例的滚动速度和距离是固定的,如果需要动态的配置跑马灯的滚动速度和距离,可以通过props定义组件的属性,并通过props配置来控制这些参数。

<div id="app">
    <div class="wrapper" ref="textWrapper">
        <div class="text" v-for="(item, index) in items" :key="index">{{item}}</div>
    </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    Vue.component('marquee', {
        props: {
            distance: {
                type: Number,
                default: 1
            },
            speed: {
                type: Number,
                default: 20
            },
            items: {
                type: Array,
                default: function () {
                    return [];
                }
            }
        },
        template: `
            <div class="wrapper" ref="textWrapper">
                <div class="text" v-for="(item, index) in items" :key="index">{{item}}</div>
            </div>
        `,
        created: function () {
            var self = this;
            setInterval(function () {
                self.scroll();
            }, self.speed);
        },
        methods: {
            scroll: function () {
                var wrapper = this.$refs.textWrapper;
                var firstChild = wrapper.children[0];
                var wrapperWidth = wrapper.offsetWidth;
                var firstChildWidth = firstChild.offsetWidth;
                var offset = this.distance;

                if (wrapperWidth + wrapper.scrollLeft <= firstChildWidth) {
                    wrapper.appendChild(firstChild.cloneNode(true));
                    wrapper.scrollTop = 0;
                } else {
                    wrapper.scrollLeft += offset;
                }
            }
        }
    });

    var app = new Vue({
        el: '#app'
    });
</script>

示例2:https://codepen.io/pen/KKWvvza

在第二个示例中,我们将实现跑马灯的逻辑封装为一个Vue组件,通过props定义组件的参数,然后通过在组件的实例中访问这些参数来控制跑马灯的滚动。在该示例中,我们新增了两个props,分别用于配置跑马灯滚动的速度和距离。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue实现简单的跑马灯 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 详解使用Vue Router导航钩子与Vuex来实现后退状态保存

    本文将详细讲解如何使用Vue Router导航钩子与Vuex来实现后退状态保存的解决方案。 什么是导航钩子? 导航钩子是Vue Router提供的一种功能,用于在路由导航过程中拦截操作,触发特定的函数。导航钩子包含全局导航钩子和路由级别导航钩子。 对于全局导航钩子,可以用于全局拦截路由导航,比如用户未登录时跳转到登录页面。而对于路由级别导航钩子,可以用于针对…

    Vue 2023年5月28日
    00
  • vue中的for循环以及自定义指令解读

    下面我会详细地讲解一下 “Vue中的For循环以及自定义指令解读”。 Vue中的For循环 Vue提供了v-for指令,我们可以通过它循环遍历数据列表,同时将每个元素渲染成一个view。 v-for指令可以使用 in 或 of 运算符,具体取决于对象或数组的语法。这里我们以数组为例,展示v-for如何工作。 基本用法 v-for可以通过以下方式,遍历数组: …

    Vue 2023年5月29日
    00
  • Vue实现红包雨小游戏的示例代码

    首先我们需要了解什么是Vue.js和红包雨小游戏。 Vue.js是一个流行的JavaScript库,用于构建动态的Web应用程序。它被广泛应用于许多前端开发工程中,具有代码简洁、易于维护、高效等特点。 红包雨小游戏是一种神奇的小游戏,玩家将会在游戏中追逐红包,在一定时间内尝试抢到更多的红包。这种游戏具有趣味性和竞争性,并且可以在不同的设备上进行玩耍,如PC、…

    Vue 2023年5月27日
    00
  • vue实现input输入模糊查询的三种方式

    当需要在页面的input输入框中输入内容,并根据输入的内容快速实现模糊查询时,可以使用Vue实现这一功能。下面将介绍三种方式来实现input输入模糊查询。 方式一:watch监听input输入,模糊查询 首先,在Vue组件中定义需要监听的变量(inputValue),并使用watch监听该变量的变化,一旦变化则执行查询操作。具体实现代码如下: <tem…

    Vue 2023年5月27日
    00
  • 浅谈在Vue.js中如何实现时间转换指令

    怎样在Vue.js中定义自定义指令Vue.js框架中提供了一个全局指令注册方法Vue.directive,可以方便地添加自定义指令。指令本质上就是一个指令函数,有五个钩子函数,分别对应着不同的阶段。 如何实现时间转换指令在Vue.js中,可以采用过滤器方式来实现时间转换,也可以采用指令方式来实现。在本文中,我们主要介绍如何使用指令来实现时间转换功能。时间转换…

    Vue 2023年5月28日
    00
  • vue给数组中对象排序 sort函数的用法

    当需要对数组中的对象按照某个属性进行排序时,可以使用Vue中的sort函数。sort函数可接受一个比较函数作为参数来排序。 下面是Vue中sort函数的用法: array.sort(compareFunction) 其中,array 表示待排序的数组,compareFunction 是一个可选的比较函数,用来指定数组排序规则,如果不指定,则元素按照字符串变量…

    Vue 2023年5月27日
    00
  • 详解vue静态资源打包中的坑与解决方案

    接下来我将详细讲解“详解vue静态资源打包中的坑与解决方案”的完整攻略。 一、问题描述 在Vue开发中,经常需要使用一些静态资源,如图片、字体等。但是,当我们将Vue项目打包后,这些静态资源文件在文件系统中的路径就会变化,这就会导致引用不到这些资源从而导致网页无法正确显示。 二、原因分析 静态资源路径问题通常由Webpack打包机制引起的。Webpack 在…

    Vue 2023年5月28日
    00
  • 使用vue自定义如何实现Tree组件和拖拽功能

    下面是关于使用Vue自定义实现Tree组件和拖拽功能的攻略: 实现概述 要实现Tree组件和拖拽功能,我们需要先了解下面几个概念: 树形结构 树形结构是一种数据结构,它是由一个个节点构成的层级结构。 每个节点可以有若干个子节点,但只有一个父节点。 递归组件 Vue提供了一种专门处理树形数据的递归组件。 递归组件可以将自身再次调用,实现动态的嵌套结构。 拖拽功…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部