欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue3實現(xiàn)無縫滾動組件的示例代碼

 更新時間:2023年09月14日 16:37:18   作者:葉落風(fēng)塵  
在日常開發(fā)中,經(jīng)常遇到需要支持列表循環(huán)滾動展示,特別是在數(shù)據(jù)化大屏開發(fā)中,所以小編今天為大家介紹一下如何利用vue3實現(xiàn)一個無縫滾動組件吧

前言

在日常開發(fā)中,經(jīng)常遇到需要支持列表循環(huán)滾動展示,特別是在數(shù)據(jù)化大屏開發(fā)中,無縫滾動使用頻率更為頻繁,在jquery時代,我們常用的無縫滾動組件為liMarquee,在vue中已經(jīng)有vue-seamless-scroll組件(通過Vue2實現(xiàn),不支持鼠標手動滾動),但是在使用過程中,發(fā)現(xiàn)滾動后會存在點擊事件失效的問題,并且產(chǎn)品提了個需求,需要支持鼠標手動滾動,也要支持自動滾動,于是痛定思痛,決定通過Vue3來實現(xiàn)該功能,該組件已經(jīng)實現(xiàn)上傳npm,可以直接安裝使用,鏈接在文尾。

實現(xiàn)

html部分

首先寫一個基礎(chǔ)的list結(jié)構(gòu),通過插槽接收外部傳入的list數(shù)據(jù),因為需要實現(xiàn)無縫滾動,需要復(fù)制出同一份的Dom,在最外層監(jiān)聽鼠標hover和leave的狀態(tài),以實現(xiàn)鼠標hover暫停滾動,綁定鼠標滾動事件,在鼠標滾動時記住滾動的位置,在恢復(fù)自動滾動時能從當(dāng)前滾動位置繼續(xù)滾動。

<div class="custom-list" ref="scrollBody" @mouseenter="mouseenterFunc" @mouseleave="mouseleaveFunc"
        @mousewheel="mousewheelFunc">
        <div class="list-body" :class="{
            'list-body2': isHorizontal
        }" ref="listBody" :style="{ transform: getScrollDistance() }">
            <slot></slot>
        </div>
        <div class="list-body" :class="{
            'list-body2': isHorizontal
        }" ref="tBody" v-if="isCanScroll" :style="{ transform: getScrollDistance() }">
            <slot></slot>
        </div>
</div>

實現(xiàn)邏輯

開始

通過父級傳入的isHorizontal判斷是橫向滾動,還是垂直滾動

const start = () => {
    //判斷是否可以滾動函數(shù)
    let isScrollFunc = (bodySize:number, listSize:number) => {
        if (bodySize > listSize) {
            scrollDistance.value = 0;
            isCanScroll.value = !1;
        }
    };
    isStop.value = !1;
    //判斷是否可以滾動
    if (!isHorizontal.value) {
        isScrollFunc(bodyHeight.value, listHeight.value);
    } else {
        isScrollFunc(bodyWidth.value, listWidth.value);
    }
    if (isCanScroll.value) {
        run();
    }
}

開始滾動

計算目前滾動的距離,并判斷需要滾動的方向,計算下一步滾動的距離。

const run = () => {
    //清空動畫
    clearAnimation();
    animationFrame.value = window.requestAnimationFrame(() => {
        //滾動主邏輯函數(shù)
        let main = (listSize:number, bodySize:number) => {
            let tempScrollDistance = Math.abs(scrollDistance.value);
            if (scrollDistance.value < 0) {
                let cc = 2 * listSize - bodySize;
                if (tempScrollDistance > cc) {
                    scrollDistance.value = -(listSize - bodySize);
                }
            } else {
                scrollDistance.value = -listSize;
            }
        };
        //根據(jù)滾動方向判斷使用高度或?qū)挾瓤刂菩Ч?
        if (!isHorizontal.value) {
            main(listHeight.value, bodyHeight.value);
        } else {
            main(listWidth.value, bodyWidth.value);
        }
        //判斷滾動值
        if (!isStop.value) {
            if (
                props.scrollDirection === "top" ||
                props.scrollDirection === "left"
            ) {
                scrollDistance.value -= props.steep;
            } else if (
                props.scrollDirection === "bottom" ||
                props.scrollDirection === "right"
            ) {
                scrollDistance.value += props.steep;
            }
            run();
        }
    });
}

獲取滾動樣式

通過translate實現(xiàn)列表平移,已實現(xiàn)平滑滾動。

const getScrollDistance = () => {
    let style;
    if (!isHorizontal.value) {
        style = "translate(0px, " + scrollDistance.value + "px)";
    } else {
        style = "translate(" + scrollDistance.value + "px,0px)";
    }
    return style;
}
const clearAnimation = () => {
    if (animationFrame.value) {
        cancelAnimationFrame(animationFrame.value);
        animationFrame.value = null;
    }
}

鼠標滾動

鼠標滾動時實時計算滾動的距離,可通過傳入的鼠標滾動速率來計算每次滾動多少。

const mousewheelFunc = (e:any) => {
    if (!isCanScroll.value || !props.isRoller) {
        return false;
    }
    let dis = e.deltaY;
    if (dis > 0) {
        scrollDistance.value -= props.rollerScrollDistance;
    } else {
        scrollDistance.value += props.rollerScrollDistance;
    }
    run();
}

使用

該組件已上傳npm倉庫,歡迎satrt使用

npm install @fcli/vue-auto-scroll --save-dev 來安裝

在項目中使用
import VueAutoScroll from '@fcli/vue-auto-scroll';
const app=createApp(App)
app.use(VueAutoScroll);

使用示例:

<div class="content">
    <vue-auto-scroll :data="list" :steep="0.5" scrollDirection="top" :isRoller="true" :rollerScrollDistance="50">
      <div class="li" v-for="i in list" :key="i">
        {{ i }}
      </div>
    </vue-auto-scroll>
</div>
屬性屬性名稱類型可選值
steep滾動的速率number為正數(shù)即可
scrollDirection滾動的方向stringtop ,bottom,left,right
isRoller是否可以使用滾輪滾動booleantrue,false
rollerScrollDistance滾輪滾動的速率number(isRoller 必須為 true)為正數(shù)即可
data接收異步數(shù)據(jù)array同步任務(wù)可不傳

注: 當(dāng)scrollDirection 為top或bottom時,一定要為 vue-auto-scroll 組件設(shè)置高度。 當(dāng)scrollDirection 為left或right時,一定要為 vue-auto-scroll 組件設(shè)置寬度。并為嵌入vue-auto-scroll中的標簽設(shè)置樣式為display:inline-block; 示例樣式名為list-item可以更改為其他類名。當(dāng)scrollDirection 為left或right時,是基于行內(nèi)元素的“white-space: nowrap;” 來控制強制不換行的。有可能會影響其內(nèi)部的文字排列。可以在list-item 層添加 white-space: normal; 來處理給問題。并為其添加固定寬度,以保證文字可以正常換行及插件的正確計算與顯示。如果沒有為其添加固定寬度,會造成插件獲取父容器層的寬度值錯誤,導(dǎo)致顯示混亂

git地址:gitee.com/fcli/vue-auto-scroll

到此這篇關(guān)于vue3實現(xiàn)無縫滾動組件的示例代碼的文章就介紹到這了,更多相關(guān)vue3無縫滾動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vuejs入門教程之Vue生命周期,數(shù)據(jù),手動掛載,指令,過濾器

    Vuejs入門教程之Vue生命周期,數(shù)據(jù),手動掛載,指令,過濾器

    本篇文章主要介紹了Vuejs入門教程之Vue生命周期,數(shù)據(jù),手動掛載,指令,過濾器的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • Vue全局自適應(yīng)大小:使用postcss-pxtorem方式

    Vue全局自適應(yīng)大小:使用postcss-pxtorem方式

    本文介紹了如何在Vue項目中使用postcss-pxtorem插件實現(xiàn)響應(yīng)式設(shè)計,postcss-pxtorem可以自動將CSS文件中的px單位轉(zhuǎn)換為rem單位,從而實現(xiàn)更好的自適應(yīng)布局,通過配置postcss-pxtorem插件,可以在構(gòu)建時自動完成轉(zhuǎn)換,無需手動修改代碼
    2025-01-01
  • vue中axios實現(xiàn)數(shù)據(jù)交互與跨域問題

    vue中axios實現(xiàn)數(shù)據(jù)交互與跨域問題

    這篇文章主要介紹了vue中axios實現(xiàn)數(shù)據(jù)交互與跨域問題,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-05-05
  • Vuex實現(xiàn)記事本功能

    Vuex實現(xiàn)記事本功能

    這篇文章主要為大家詳細介紹了Vuex實現(xiàn)記事本功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • vue2.0中組件傳值的幾種方式總結(jié)

    vue2.0中組件傳值的幾種方式總結(jié)

    這篇文章主要介紹了vue2.0中組件傳值的幾種方式總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • vue?elementUI?處理文件批量上傳方式

    vue?elementUI?處理文件批量上傳方式

    這篇文章主要介紹了vue?elementUI?處理文件批量上傳方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • VUE中的v-if與v-show區(qū)別介紹

    VUE中的v-if與v-show區(qū)別介紹

    這篇文章介紹了VUE中v-if與v-show的區(qū)別,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • Django Vue實現(xiàn)動態(tài)菜單和動態(tài)權(quán)限

    Django Vue實現(xiàn)動態(tài)菜單和動態(tài)權(quán)限

    本文主要介紹了Django Vue實現(xiàn)動態(tài)菜單和動態(tài)權(quán)限,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • vue中如何動態(tài)綁定圖片,vue中通過data返回圖片路徑的方法

    vue中如何動態(tài)綁定圖片,vue中通過data返回圖片路徑的方法

    下面小編就為大家分享一篇vue中如何動態(tài)綁定圖片,vue中通過data返回圖片路徑的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • 記一次vue去除#問題處理經(jīng)過小結(jié)

    記一次vue去除#問題處理經(jīng)過小結(jié)

    這篇文章主要介紹了vue去除#問題處理經(jīng)過,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01

最新評論