< elementUi组件封装: 通过 el-tag、el-popover、vue动画等实现公告轮播 >

简介: 在 Vue + elementUi 开发中,遇到这么一个需求,要实现公告轮播的效果。说实话,一开始是打算通过Javascript去获取并修改对应元素来控制轮播的,但是发现这样子代码比较多,而且性能不是很好。然后…聪明的小温想到了,能不能通过vue的动画过渡,实现公告的滚动效果呢!一不做二不休,直接上手,果然是可以实现的!接下来,简单阐述下,开发中使用方法!

image.png


👉 前言

在 Vue + elementUi 开发中,遇到这么一个需求,要实现公告轮播的效果。说实话,一开始是打算通过Javascript去获取并修改对应元素来控制轮播的,但是发现这样子代码比较多,而且性能不是很好。

然后...聪明的小温想到了,能不能通过vue的动画过渡,实现公告的滚动效果呢! 一不做二不休,直接上手,果然是可以实现的!

接下来,简单阐述下,开发中使用方法!

tipsvue动画过渡 - Transition 官方文档

👉 一、效果演示

话不多说,先上效果图! 白嫖万岁!当然,如果有帮助,希望不要吝啬你的点赞呀!

cb525b44e9314c28b74f04d737d90cc4.gif

image.png

👉 二、实现思路

通过对一个index进行公告显示条数进行记录,然后通过定时器定时显示/关闭,实现对应元素的动画入场和出场动画效果!

借助elementUI中的popover组件,利用showhide方法,实现鼠标悬浮暂停轮播功能,鼠标移出继续轮播!

直接看代码吧! 简单易懂!

由于案例中,公告内容是富文本,所以说,本文用了之前提到的富文本组件,混杂了富文本回显的,大伙可以直接忽略即可!

👉 三、实现案例

> HTML模板

<template>
<span class="carousel">
  <template v-if="announcementList.length !== 0">
      <Transition name="slide-fade">
        <el-popover
          placement="bottom"
          trigger="hover"
          v-show="announcemenShow"
          @show="announcemenClose"
          @hide="announcemenOpen"
        >
          <p
            style="
              min-width: 200px;
              max-width: 30vw;
              max-height: 25vh;
              overflow-y: auto;
            "
            v-html="announcementList[announcemenIndex].label"
            class="el-tiptap-editor__content"
          ></p>
          <div style="text-align: right;">
            <el-button
              type="text"
              style="font-weight: bold; padding: 2px 0;"
              @click="goAnnouncemen"
            >查看详情</el-button>
          </div>
          <el-tag
            slot="reference"
            effect="dark"
            style="cursor: pointer;"
            :type="tagType[announcementList[announcemenIndex].type] || ''"
            @click="goAnnouncemen"
          >
            <i class="el-icon-message" style="padding-right: 5px;" > {{ announcementList[announcemenIndex].type }} :</i>
            {{ deleteHtml(announcementList[announcemenIndex].label) }}
          </el-tag>
        </el-popover>
      </Transition>
      
    </template>
    <el-tag v-else type="info">暂无公告</el-tag>
  </span>
</template>

> Js模板

let Data = {
    announcemenTimer: null,
    announcemenShow: true,
    announcemenIndex: 0,
    announcementList: [
      {
        label: '本系统由于技术原因,将于2023年4月25日 16:00开始系统更新,预计花费2小时。将于当天18:00完成本次更新!',
        type: '更新公告'
      },
      {
        label: '风控中心,监测模块问题维护',
        type: '紧急维护'
      },
      {
        label: '数据错位',
        type: '重要通知'
      },
      {
        label: '测试444',
        type: '其他'
      },
      {
        label: '测试555',
        type: '其他'
      },
    ],
    // 对应显示tag样式
    tagType: {
      '更新公告': '',
      '紧急维护': 'danger',
      '重要通知': 'warning',
      '其他': 'info',
    },
}

created() {
    this.announcemenOpen()
},
watch: {
  announcementList() {
    this.announcemenOpen()
  },
},
//页面销毁时清除定时器  
beforeDestroy() {    
    clearInterval(this.announcemenTimer);
},

menthods: {
    // 开启公告轮播
    announcemenOpen() {
      if(this.announcementList.length <= 1) {
        return
      }
      // 防抖节流
      this.announcemenTimer &&
        (() => {
          clearInterval(this.announcemenTimer);
          this.announcemenTimer = null;
        })();
      this.announcemenTimer = setInterval(() => {
        this.announcemenShow = false
        // window.console.log(this.announcemenIndex)
        setTimeout(() => {
          if(this.announcemenIndex < this.announcementList.length - 1) {
            this.announcemenIndex++
          } else {
            this.announcemenIndex = 0
          }
          this.announcemenShow = true
        }, 500) // 过渡动画衔接时间,和过渡动画样式对应,需要错开一点时间,视觉上看起来更流畅一点
      }, 5000) // 轮播信息滞留时间
    },
    // 关闭公告轮播
    announcemenClose() {
      clearInterval(this.announcemenTimer);
    },
    // 跳转公告页面
    goAnnouncemen() {
      if(this.$route.path == '/announcements') {
        this.$message.info('您已在公告页面,请查看公告!')
        return
      }
      
      this.$router.push({
        path: "/announcements",
        query: {
          actNav: 6,
          index: '6-3'
        },
      });
    },
}

> CSS 模板

// 动画样式
<style>
.slide-fade-enter-active {
  animation: slide-fade-in 0.8s;
}
.slide-fade-leave-active {
  animation: slide-fade-out 0.6s;
}
@keyframes slide-fade-out {
  0% {
    transform: translateX(0);
  }
  100% {
    transform: translateX(-240px);
    opacity: 0;
  }
}
@keyframes slide-fade-in {
  0% {
    transform: translateX(240px);
    opacity: 0;
  }
  100% {
    transform: translateX(0);
    opacity: 1;
  }
}
</style>

// 页面样式
<style scoped lang="scss">
.carousel {
    width: 300px;
    color: #fff;
    margin-right: 15px;
    overflow: hidden;
    display: flex;
    align-items: center;
    /deep/ {
        .el-popover__reference-wrapper {
            display: flex;
            align-items: center;
        }
        .el-tag {
            width: 280px;
            margin: 0 10px;
            border-radius: 3px;
            text-align: left;
            overflow: hidden;
            text-overflow: ellipsis;
            white-space: nowrap;
        }
    }
}
</style>
案例较为粗浅,仅供参考!

往期内容 💨

🔥 < 每日小技巧:N个很棒的 Vue 开发技巧, 持续记录ing >

🔥 < CSDN周赛解析:第 27 期 >

相关文章
|
6天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
6天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
6天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
5天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
5天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
JavaScript 测试技术 容器
Vue2+VueRouter2+webpack 构建项目
1). 安装Node环境和npm包管理工具 检测版本 node -v npm -v 图1.png 2). 安装vue-cli(vue脚手架) npm install -g vue-cli --registry=https://registry.
1050 0
|
6天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
7天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
7天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
12天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发