最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

手把手教你用VUE封裝一個(gè)文本滾動(dòng)組件

 更新時(shí)間:2023年01月16日 10:55:28   作者:Sumu  
封裝組件相信對(duì)大家來說都不陌生了,下面這篇文章主要給大家介紹了關(guān)于用VUE封裝一個(gè)文本滾動(dòng)組件的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、引言

項(xiàng)目有文本滾動(dòng)展示的需求,一開始使用marquee標(biāo)簽來實(shí)現(xiàn)需求,但是看一下MDN對(duì)該標(biāo)簽的描述:

這個(gè)標(biāo)簽已經(jīng)不再推薦使用了,那就自己封裝一個(gè)類似的組件來用。

二、實(shí)現(xiàn)思路

1.如何讓文本滾動(dòng)起來?

通過動(dòng)畫我們?cè)O(shè)置過渡transform:translateX(a) => transfrom:translateX(b)來實(shí)現(xiàn)向左或向右的滾動(dòng)效果。transform:translateY(c) => transfrom:translateY(d)來實(shí)現(xiàn)向下或向上的滾動(dòng)效果。

2.組件需要哪些配置?

(1)滾動(dòng)的方向:上右下左

(2)滾動(dòng)的速度:這里我以px/s作為單位

三、實(shí)現(xiàn)過程

1.html

2.css

最外層的div為滾動(dòng)的可視區(qū),里面的div為文本滾動(dòng)區(qū)。可視區(qū)寬度高度均為100%使用時(shí)大小由外部容器決定,overflow設(shè)為hidden,防止文本滾動(dòng)區(qū)滾動(dòng)出可視區(qū)外仍可見。文本滾動(dòng)區(qū)設(shè)置寬高都為fit-content使大小隨內(nèi)容自適應(yīng),內(nèi)部設(shè)置插槽使用組件時(shí)插入滾動(dòng)內(nèi)容。

3.動(dòng)畫

動(dòng)畫應(yīng)設(shè)置在文本滾動(dòng)區(qū)

需要上右下左四個(gè)方向滾動(dòng)的動(dòng)畫,我們只需要定義上左兩個(gè)方向,另外兩個(gè)方向直接反轉(zhuǎn)即可。先來想想向上滾動(dòng)的動(dòng)畫怎么寫,向上滾動(dòng)的話文本滾動(dòng)區(qū)的起點(diǎn)應(yīng)設(shè)置在可視區(qū)外正下方,所以動(dòng)畫的起點(diǎn)應(yīng)為 transform: translateY(可視區(qū)的高度),終點(diǎn)應(yīng)設(shè)置在可視區(qū)外正上方應(yīng)為transform: translateY(-100%)。

向上向左動(dòng)畫即為:

--text-scroll-height、--text-scroll-width兩個(gè)css變量的值是可視區(qū)的高度和寬度,由于可視區(qū)的寬高不確定,所以需要通過js獲取并設(shè)置這兩個(gè)css變量。

注意: 動(dòng)畫樣式不能加上scoped,否則不生效!

4.js

(1)組件配置

通過props傳入組件配置

(2)計(jì)算得到滾動(dòng)動(dòng)畫

scrollLength為一次動(dòng)畫的實(shí)際滾動(dòng)的長度,time為一次動(dòng)畫的持續(xù)時(shí)間。我們可以算出scrollLength應(yīng)為:可視區(qū)的寬或高加上文本滾動(dòng)區(qū)的寬或高(根據(jù)滾動(dòng)的方向來判斷是寬還是高)。time應(yīng)為 scrollLegnth / 組件配置的滾動(dòng)速度。

(3)生命周期

在mounted里調(diào)用上面的方法初始化組件。在updated里同樣調(diào)用該方法,當(dāng)組件寬高改變或插槽內(nèi)容變動(dòng)重新計(jì)算動(dòng)畫樣式。

三、完整代碼

<template>
  <!-- 文本滾動(dòng) -->
  <div class="text-scroll" ref="textScroll">
    <div class="content" ref="content" :style="scrollAnimation">
      <!-- 默認(rèn)插槽,插入滾動(dòng)內(nèi)容 -->
      <slot></slot>
    </div>
  </div>
</template>

<script>
export default {
  name: "TextScroll",
  props: {
    /* 滾動(dòng)方向
     * value: up、down、left、right
     */
    direction: {
      default: "up",
      type: String,
    },
    //滾動(dòng)速度 單位px/s
    speed: {
      default: 60,
      type: Number,
    },
  },
  data() {
    return {
      //滾動(dòng)動(dòng)畫
      scrollAnimation: {},
    };
  },
  methods: {
    getScrollAnimation() {
      //獲取文本滾動(dòng)實(shí)際顯示寬度高度,設(shè)為css變量,用于設(shè)置動(dòng)畫開始起始位置
      let height = this.$refs.textScroll.offsetHeight;
      let width = this.$refs.textScroll.offsetWidth;
      this.$refs.content.style.setProperty(
        "--text-scroll-height",
        `${height}px`
      );
      this.$refs.content.style.setProperty("--text-scroll-width", `${width}px`);
      //滾動(dòng)長度、時(shí)間
      let scrollLength, time;
      //根據(jù)滾動(dòng)方向來設(shè)置不同的滾動(dòng)動(dòng)畫
      switch (this.direction) {
        case "up":
          scrollLength =
            this.$refs.content.offsetHeight +
            height;
          time = scrollLength / this.speed;
          this.scrollAnimation.animation = `up-scroll linear ${time}s infinite`;
          break;
        case "down":
          scrollLength =
            this.$refs.content.offsetHeight +
            height;
          time = scrollLength / this.speed;
          this.scrollAnimation.animation = `up-scroll linear ${time}s infinite reverse`;
          break;
        case "left":
          scrollLength =
            this.$refs.content.offsetWidth + width;
          time = scrollLength / this.speed;
          this.scrollAnimation.animation = `left-scroll linear ${time}s infinite`;
          break;
        case "right":
          scrollLength =
            this.$refs.content.offsetWidth + width;
          time = scrollLength / this.speed;
          this.scrollAnimation.animation = `left-scroll linear ${time}s infinite reverse`;
          break;
      }
    },
  },
  async mounted() {
    //設(shè)置文本滾動(dòng)動(dòng)畫
    this.getScrollAnimation();
  },
  updated() {
    //當(dāng)插槽內(nèi)容更新重新計(jì)算滾動(dòng)動(dòng)畫
    this.getScrollAnimation();
  },
};
</script>

<style scoped lang="scss">
.text-scroll {
  width: 100%;
  height: 100%;
  overflow: hidden;

  .content {
    height: fit-content;
    width: fit-content;
  }
}
</style>

<style lang="scss">
.text-scroll {
  .content {
    @keyframes up-scroll {
      0% {
        transform: translateY(var(--text-scroll-height));
      }

      100% {
        transform: translateY(-100%);
      }
    }

    @keyframes left-scroll {
      0% {
        transform: translateX(var(--text-scroll-width));
      }

      100% {
        transform: translateX(-100%);
      }
    }
  }
}
</style>

總結(jié)

到此這篇關(guān)于用VUE封裝一個(gè)文本滾動(dòng)組件的文章就介紹到這了,更多相關(guān)VUE封裝文本滾動(dòng)組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue插槽slot全部使用方法示例解析

    Vue插槽slot全部使用方法示例解析

    插槽就是子組件中的提供給父組件使用的一個(gè)占位符,用<slot></slot> 表示,父組件可以在這個(gè)占位符中填充任何模板代碼,如 HTML、組件等,填充的內(nèi)容會(huì)替換子組件的<slot></slot>標(biāo)簽,這篇文章主要介紹了Vue插槽的理解和使用,需要的朋友可以參考下
    2023-03-03
  • 淺談Vue.js中的v-on(事件處理)

    淺談Vue.js中的v-on(事件處理)

    本篇文章主要介紹了Vue.js中的v-on(事件處理),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • vue中v-for數(shù)據(jù)狀態(tài)值變了,但是視圖沒改變的解決方案

    vue中v-for數(shù)據(jù)狀態(tài)值變了,但是視圖沒改變的解決方案

    這篇文章主要介紹了vue中v-for數(shù)據(jù)狀態(tài)值變了,但是視圖沒改變的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Spring boot 和Vue開發(fā)中CORS跨域問題解決

    Spring boot 和Vue開發(fā)中CORS跨域問題解決

    這篇文章主要介紹了Spring boot 和Vue開發(fā)中CORS跨域問題解決,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • ant design 日期格式化的實(shí)現(xiàn)

    ant design 日期格式化的實(shí)現(xiàn)

    這篇文章主要介紹了ant design 日期格式化的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • SpringBoot+Vue3實(shí)現(xiàn)文件的上傳和下載功能

    SpringBoot+Vue3實(shí)現(xiàn)文件的上傳和下載功能

    上傳文件和下載文件是我們平時(shí)經(jīng)常用到的功能,接下來就讓我們用SpringBoot,Vue3和ElementPlus組件實(shí)現(xiàn)文件的上傳和下載功能吧,感興趣的朋友跟隨小編一起看看吧
    2023-01-01
  • 使用Vue構(gòu)建動(dòng)態(tài)表單生成器的實(shí)現(xiàn)步驟

    使用Vue構(gòu)建動(dòng)態(tài)表單生成器的實(shí)現(xiàn)步驟

    在前端開發(fā)中,表單是非常常見的交互元素,然而,當(dāng)表單的結(jié)構(gòu)和字段需要根據(jù)不同的業(yè)務(wù)場(chǎng)景動(dòng)態(tài)變化時(shí),手動(dòng)編寫每個(gè)表單的代碼會(huì)變得非常繁瑣,所以我們可以使用Vue實(shí)現(xiàn)一個(gè)動(dòng)態(tài)表單生成器,本文將詳細(xì)介紹實(shí)現(xiàn)動(dòng)態(tài)表單生成器的原理,需要的朋友可以參考下
    2025-04-04
  • vue監(jiān)聽瀏覽器原生返回按鈕,進(jìn)行路由轉(zhuǎn)跳操作

    vue監(jiān)聽瀏覽器原生返回按鈕,進(jìn)行路由轉(zhuǎn)跳操作

    這篇文章主要介紹了vue監(jiān)聽瀏覽器原生返回按鈕,進(jìn)行路由轉(zhuǎn)跳操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 從Vuex中取出數(shù)組賦值給新的數(shù)組,新數(shù)組push時(shí)報(bào)錯(cuò)的解決方法

    從Vuex中取出數(shù)組賦值給新的數(shù)組,新數(shù)組push時(shí)報(bào)錯(cuò)的解決方法

    今天小編就為大家分享一篇從Vuex中取出數(shù)組賦值給新的數(shù)組,新數(shù)組push時(shí)報(bào)錯(cuò)的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue實(shí)現(xiàn)簡(jiǎn)單圖片上傳

    vue實(shí)現(xiàn)簡(jiǎn)單圖片上傳

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)簡(jiǎn)單圖片上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06

最新評(píng)論

江源县| 贵定县| 灵璧县| 屏南县| 阜阳市| 富蕴县| 乐清市| 额敏县| 靖边县| 南汇区| 安达市| 金堂县| 云龙县| 土默特右旗| 三台县| 永德县| 略阳县| 英吉沙县| 山阴县| 鸡西市| 龙江县| 崇文区| 深州市| 五家渠市| 邓州市| 建宁县| 基隆市| 澄江县| 武夷山市| 鲜城| 绥阳县| 宁远县| 巴林左旗| 开江县| 双鸭山市| 徐州市| 灵宝市| 唐山市| 怀化市| 鄢陵县| 永兴县|