vue前端实现浮动滚动信息

因为工作原因,需要用到自动滚动信息.所以在github上找了一款感觉还算不错的前端组件

这里是仓库地址https://github.com/satrong/vue-text-marquee

代码量很小。很容易扩展

因为业务原因,我对其做了点修改

TextMarquee.vue 组件

<template>
    <!-- 这里, 我想添加个点击触发事件,这个事件默认是点击停止滚动,再点击则继续滚动,同样这个事件可以被覆盖,可以由外部传递的方法属性替换 -->
    <div class="v-marquee" @click="onClickEvent()? animateSwitch = !animateSwitch : onClickEvent()">
        <div :style="{'animation-duration':time,'animation-name':name}" :class="animateSwitch?'running':'pause'">
            <!-- 这里是我添加的动效gif图,没有需求的可以不添加 -->   
            <img src="../../statics/remind-bell.gif" style="float: left; height: 28px; width: 28px; margin-right: 10px"/>
            <slot>
                <!-- 采用html显示 -->
                <div style="float: left; line-height: 28px" v-html="content"></div>
            </slot>
        </div>
    </div>
</template>

<script>
let count = 0;
export default {
  name: 'VTextMarquee',
  props: {
    speed: {          //速度
      type: Number,
      default: 50,    //默认50
    },
    content: String,  //内容
    animate: {        //开关
      type: Boolean,
      default: true,  //默认开启
    },
    onClickEvent: {      //点击消息体回调的方法, 默认返回true触发点击停止滚动,没有返回true则执行这个传递的方法
        type: Function,
        default: () => {
            return true
        }
    },
  },
  data() {
    count++;
    return {
      animateSwitch: this.animate,
      time: 0,
      name: 'marquee' + count,
      styleEl: document.createElement('style'),
    };
  },
  watch: {
    animate(val){        //当外部开关发生变化,同步到内部开关
        this.animateSwitch = val;
    },
    content() {
      this.start();
    },
    speed() {
      this.start();
    },
  },
  methods: {
    getTime() {
      return Math.max(this.$el.firstChild.offsetWidth, this.$el.offsetWidth) / this.speed + 's';
    },
    prefix(key, value) {
      return ['-webkit-', '-moz-', '-ms-', ''].map(el => `${el + key}:${value};`).join('');
    },
    keyframes() {
      const from = this.prefix('transform', `translateX(${this.$el.offsetWidth}px)`);
      const to = this.prefix('transform', `translateX(-${this.$el.firstChild.offsetWidth}px)`);
      const v = `@keyframes ${this.name} {
                from { ${from} }
                to { ${to} }
            }`;
      this.styleEl.innerHTML = v;
      document.head.appendChild(this.styleEl);
    },
    start() {
      this.$nextTick(() => {
        this.time = this.getTime();
        this.keyframes();
      });
    },
  },
  mounted() {
    this.start();
  },
}
</script>
<style scoped>
.v-marquee {
  white-space: nowrap;
  overflow: hidden;
  width: 100%;
}
.v-marquee > div {
  display: inline-block;
  animation: marquee linear infinite;
}
.v-marquee .pause {
  animation-play-state: paused;
}
.v-marquee .running {
  animation-play-state: running;
}
</style>

 

然后再需要调用到的页面导入即可。

components: {
	VTextMarquee: () =>
		import('./event/TextMarquee.vue') //横向滚动条,这里采用的是我们项目的导入方式。你们可以使用你们的导入方式
},

导入之后,再当前页面使用

<!-- onClickEvent 是替换的点击方法,不能返回结果。
     animate 是初始化是否开始
     speed 是滚动速度-->
<VTextMarquee style="margin-top: 10px" :onClickEvent="()=>{ $router.push({path:'/event-message',query:{eventId:data.id}})}"
                      :content="这里是滚动信息" :animate="true" :speed=50/>

这样就可以使用了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue.js是一种流行的JavaScript框架,用于构建用户界面。要实现无缝滚动效果,可以使用Vue.js的transition组件和CSS动画来实现。 首先,你需要在Vue组件中定义一个包含滚动内容的容器,并设置其样式为`overflow: hidden`,以隐藏超出容器的内容。然后,在容器内部创建一个滚动元素,设置其样式为`white-space: nowrap`,以使内容水平排列。 接下来,你可以使用Vue的transition组件来添加过渡效果。在滚动元素上添加一个`v-if`指令,根据条件来决定是否显示滚动元素。当需要滚动时,将滚动元素的内容复制一份,并将其追加到滚动元素的末尾,形成一个无限循环的效果。 然后,你可以使用CSS动画来实现滚动效果。通过给滚动元素添加一个`transform`属性,并使用`translateX`函数来实现水平位移。同时,使用`animation`属性来定义动画的持续时间、缓动函数等。 最后,在Vue组件中使用定时器或者其他方式来触发滚动效果。可以通过改滚动元素的`transform`属性的值来实现滚动效果。 下面是一个简单的示例代码: ```html <template> <div class="scroll-container"> <div class="scroll-content" v-if="isScrolling"> {{ content }} </div> </div> </template> <script> export default { data() { return { content: '这是滚动的内容', isScrolling: true }; }, mounted() { setInterval(() => { // 每隔一段时间改变滚动元素的transform属性值,实现滚动效果 }, 3000); } }; </script> <style> .scroll-container { width: 300px; height: 200px; overflow: hidden; } .scroll-content { white-space: nowrap; animation: scrollAnimation 10s linear infinite; } @keyframes scrollAnimation { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } } </style> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值