成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一段代碼闡述一個(gè)輪播思路

shleyZ / 913人閱讀

摘要:一段代碼闡述一個(gè)輪播思路不,直接上代碼如果是下一個(gè),那就先吧下個(gè)的設(shè)置成來(lái)移動(dòng)位置,防止用戶看到將下個(gè)放到指定的位置開始輪播注意以上只是主思路代碼,完整的代碼解讀完之后會(huì)貼出來(lái)供大家參考。

一段代碼闡述一個(gè)輪播思路 不BB,直接上代碼:
1. if (direction === "next") {
2.     this.index = nextIndex;
3.     /*如果是下一個(gè),那就先吧下個(gè)的dom設(shè)置成none來(lái)移動(dòng)位置,防止用戶看到*/
4.     nextEl.style.display = "none";
5.     nextEl.style.webkitTransition = "";
6.     currentEl.style.display = "block";
7.     currentEl.style.webkitTransition = "-webkit-transform " + this.speed + "ms ease-in-out";
8.     setTimeout(()=> {
9.         /*將下個(gè)放到指定的位置*/
10.         nextEl.style.webkitTransform = this.toward === "horizontal" ? `translate3d(100%, 0, 0)` : `translate3d(0, 100%, 0)`;
11.         nextEl.style.display = "block";
12.         nextEl.style.webkitTransition = "-webkit-transform " + this.speed + "ms ease-in-out";
13.         setTimeout(() => {
14.             /*開始輪播*/
15.             currentEl.style.webkitTransform = this.toward === "horizontal" ? `translate3d(-100%, 0, 0)` : `translate3d(0, -100%, 0)`;
16.             nextEl.style.webkitTransform = `translate3d(0, 0, 0)`;
17.         }, 20);
18.     }, 10);
19. } 

注意:以上只是主思路代碼,完整的代碼解讀完之后會(huì)貼出來(lái)供大家參考。

代碼解讀:思路是先判斷滾動(dòng)方向,如果是向下一個(gè)節(jié)點(diǎn)那我就準(zhǔn)備下一個(gè)節(jié)點(diǎn)到指定位置(僅適合界面一次展示一個(gè)輪播節(jié)點(diǎn)),如果直接移動(dòng)到指定位置肯定是不合理的,因?yàn)楣?jié)點(diǎn)直接移動(dòng)會(huì)讓用戶在瀏覽器界面看到,可是節(jié)點(diǎn)是肯定要移動(dòng)啊,思路很簡(jiǎn)單,那我給節(jié)點(diǎn)穿一件隱身衣(display:none),之后再移動(dòng)到指定位置用戶不就看不到了,但是注意這里存在一個(gè)問(wèn)題,如果直接設(shè)置設(shè)置display:none之后立馬就移動(dòng)位置的話會(huì)存在一個(gè)問(wèn)題,移動(dòng)的效果用戶仍然能看的到,這是因?yàn)榉钱惒降腏S代碼在執(zhí)行的過(guò)程中是會(huì)阻止瀏覽器的繪圖和重繪的,所以為了繞開瀏覽器這個(gè)機(jī)制那就使用異步好了(setTimeout),下一個(gè)節(jié)點(diǎn)的位置現(xiàn)在已經(jīng)準(zhǔn)備好了,現(xiàn)在如果還是直接移動(dòng)的話,又會(huì)存在一個(gè)問(wèn)題下一個(gè)節(jié)點(diǎn)竟然看不到移動(dòng),這是因?yàn)槲覀冊(cè)跍?zhǔn)備節(jié)點(diǎn)的節(jié)點(diǎn)的時(shí)候已經(jīng)將它隱藏了,所以為了讓用戶看到就不得不把隱身衣脫了(display:block)才行,這樣又得加一個(gè)異步(setTimeout)才能生效了,現(xiàn)在就可以安心的執(zhí)行當(dāng)前節(jié)點(diǎn)和早已就緒的下一個(gè)節(jié)點(diǎn)了。

完整代碼如下:

下面的輪播JS部分的代碼是vue寫的,主要功能包括了垂直輪播,水平輪播,手勢(shì)輪播等幾個(gè)輪播的主要功能

export default {
    name: "swipe",
    props: {
        /*默認(rèn)是水平滾動(dòng)*/
        toward: {
            type: String,
            default: "vertical"
        },
        /*是否展示指示標(biāo)志*/
        showIndicators: {
            type: Boolean,
            default: true
        },
        /*滾動(dòng)速度*/
        speed: {
            type: Number,
            default: 300
        },
        /*默認(rèn)下標(biāo)從哪兒開始*/
        defaultIndex: {
            type: Number,
            default: 0
        },
        /*自動(dòng)滾動(dòng)間隔*/
        interval: {
            type: Number,
            default: 3000
        }
    },
    data() {
        return {
            dots: [],    // 頁(yè)面標(biāo)記圓點(diǎn)
            index: this.defaultIndex,   //當(dāng)前頁(yè)面的下標(biāo)
            pageEls: [],   // 所有的子輪播項(xiàng)集合
            timer: null, //輪播定時(shí)器對(duì)象
            noSwipe: false,  //禁止?jié)L動(dòng)
            startPosition: "",  //touch的起始位置
            currentPosition: "",  //touch的目前位置
            translatePosition: "",  //touch位移的位置
            distance: 10,    //touch的位移大于10的時(shí)候生效
        }
    },
    watch: {},
    beforeMount: function () {
    },
    mounted(){
        this.initSwipe();
        this.swipeTimeout();
        this.initTouchEvent();
    },
    computed: {
        getNum(){
            return this.pageEls.length;
        },
    },
    methods: {
        /*手動(dòng)上一張*/
        prev(){
            window.clearTimeout(this.timer);
            this.swipeTimeout("prev");
        },
        /*手動(dòng)下一張*/
        next(){
            window.clearTimeout(this.timer);
            this.swipeTimeout("next");
        },
        initTouchEvent(){
            let dom = this.$el.querySelector(".swipe-warp");
            dom.addEventListener("touchstart", this.handleTouchStart);
            dom.addEventListener("touchmove", this.handleTouchMove);
            dom.addEventListener("touchend", this.handleTouchEnd);
            console.log(dom);
        },
        /*初始化輪播節(jié)點(diǎn)*/
        initSwipe(){
            var children = this.$children;
            if (children.length === 1) {
                this.noSwipe = false;
                return;
            }
            children.forEach((child, _index)=> {
                this.pageEls.push(child.$el);
            });
        },
        /*定時(shí)輪播*/
        swipeTimeout(toward = "next"){
            this.translate(toward, ()=> {
                this.timer = window.setTimeout(()=> {
                    this.swipeTimeout("next");
                }, this.interval);
            });
        },
        /*滾動(dòng)方法*/
        translate(direction = "next", cb){
            let length = this.pageEls.length;
            let currentIndex = this.index;
            let currentEl = this.pageEls[currentIndex];
            let nextIndex = ((this.index + 1) > (length - 1)) ? 0 : (this.index + 1);
            let nextEl = this.pageEls[nextIndex];
            let pervIndex = (this.index - 1) < 0 ? (length - 1) : (this.index - 1);
            let pervEl = this.pageEls[pervIndex];
            if (direction === "next") {
                this.index = nextIndex;
                /*如果是下一個(gè),那就先吧下個(gè)的dom設(shè)置成none來(lái)移動(dòng)位置,防止用戶看到*/
                nextEl.style.display = "none";
                nextEl.style.webkitTransition = "";
                currentEl.style.display = "block";
                currentEl.style.webkitTransition = "-webkit-transform " + this.speed + "ms ease-in-out";
                setTimeout(()=> {
                    /*將下個(gè)放到指定的位置*/
                    nextEl.style.webkitTransform = this.toward === "horizontal" ? `translate3d(100%, 0, 0)` : `translate3d(0, 100%, 0)`;
                    nextEl.style.display = "block";
                    nextEl.style.webkitTransition = "-webkit-transform " + this.speed + "ms ease-in-out";
                    setTimeout(() => {
                        /*開始輪播*/
                        currentEl.style.webkitTransform = this.toward === "horizontal" ? `translate3d(-100%, 0, 0)` : `translate3d(0, -100%, 0)`;
                        nextEl.style.webkitTransform = `translate3d(0, 0, 0)`;
                    }, 20);
                }, 10);
            } else {
                this.index = pervIndex;
                /*如果是上一個(gè),那就先吧上個(gè)的dom設(shè)置成none來(lái)移動(dòng)位置,防止用戶看到*/
                pervEl.style.display = "none";
                pervEl.style.webkitTransition = "";
                currentEl.style.display = "block";
                currentEl.style.webkitTransition = "-webkit-transform " + this.speed + "ms ease-in-out";
                setTimeout(()=> {
                    /*將上個(gè)放到指定的位置*/
                    pervEl.style.webkitTransform = this.toward === "horizontal" ? `translate3d(-100%, 0, 0)` : `translate3d(0, -100%, 0)`;
                    pervEl.style.display = "block";
                    pervEl.style.webkitTransition = "-webkit-transform " + this.speed + "ms ease-in-out";
                    setTimeout(() => {
                        /*開始輪播*/
                        currentEl.style.webkitTransform = this.toward === "horizontal" ? `translate3d(100%, 0, 0)` : `translate3d(0, 100%, 0)`;
                        pervEl.style.webkitTransform = `translate3d(0, 0, 0)`;
                    }, 20);
                }, 10);
            }
            this.once(currentEl, "webkitTransitionEnd", ()=> {
                cb && cb();
            });
        },
        handleTouchStart($evnet){
            this.startPosition = this.toward === "horizontal" ? $evnet.touches[0].clientX : $evnet.touches[0].clientY;
        },
        handleTouchMove($evnet){
            this.currentPosition = this.toward === "horizontal" ? $evnet.touches[0].clientX : $evnet.touches[0].clientY;
            this.translatePosition = this.currentPosition - this.startPosition;
            this.translatePosition !== 0 && window.clearTimeout(this.timer);
            $evnet.preventDefault();
            $evnet.stopPropagation();
        },
        handleTouchEnd($evnet){
            this.translatePosition < 0 && this.translatePosition < -this.distance && this.swipeTimeout("next");
            this.translatePosition > 0 && this.translatePosition > this.distance && this.swipeTimeout("prev");
        },
        /*管理事件*/
        once(el, event, fn) {
            var that = this;
            var listener = function () {
                if (fn) {
                    fn.apply(this, arguments);
                }
                that.off(el, event, listener);
            };
            this.on(el, event, listener);
        },
        /*監(jiān)聽事件*/
        on(element, event, handler){
            if (element && event && handler) {
                element.addEventListener(event, handler, false);
            }
        },
        /*移除事件*/
        off(element, event, handler) {
            if (element && event) {
                element.removeEventListener(event, handler, false);
            }
        }
    }
};

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/84011.html

相關(guān)文章

  • 回顧自己三次失敗的面試經(jīng)歷

    摘要:站在這個(gè)時(shí)間點(diǎn)上,我對(duì)自己之前三次失敗的面試經(jīng)歷做了一次深度回顧。關(guān)于我第三次面試失敗的經(jīng)歷,依然是與輪播圖有關(guān)。當(dāng)然,這次思特奇面試之旅,最后也是以失敗告終,這也是我離進(jìn)大廠最近的一次。 showImg(https://segmentfault.com/img/bVYQuP?w=528&h=513); 前言 時(shí)間的齒輪已經(jīng)來(lái)到了2017年的11月份,距離2018年僅僅還剩下不到兩...

    DC_er 評(píng)論0 收藏0
  • 回顧自己三次失敗的面試經(jīng)歷

    摘要:站在這個(gè)時(shí)間點(diǎn)上,我對(duì)自己之前三次失敗的面試經(jīng)歷做了一次深度回顧。關(guān)于我第三次面試失敗的經(jīng)歷,依然是與輪播圖有關(guān)。當(dāng)然,這次思特奇面試之旅,最后也是以失敗告終,這也是我離進(jìn)大廠最近的一次。 showImg(https://segmentfault.com/img/bVYQuP?w=528&h=513); 前言 時(shí)間的齒輪已經(jīng)來(lái)到了2017年的11月份,距離2018年僅僅還剩下不到兩...

    spacewander 評(píng)論0 收藏0
  • task0002(四)- 練習(xí):數(shù)據(jù)處理、輪播及交互

    摘要:獲取下一個(gè)元素節(jié)點(diǎn),存在的話,取消現(xiàn)有選中狀態(tài),設(shè)置下一個(gè)元素節(jié)點(diǎn)為選擇中,調(diào)用運(yùn)動(dòng)框架實(shí)現(xiàn)動(dòng)畫,添加定時(shí)器,調(diào)用該函數(shù),實(shí)現(xiàn)自動(dòng)播放。移出時(shí),開啟定時(shí)器,繼續(xù)輪播。輪播間隔時(shí)間單位為毫秒,默認(rèn)為,在內(nèi)部,以下部分進(jìn)行修改或添加。 轉(zhuǎn)載自我的個(gè)人博客 歡迎大家批評(píng)指正 包括5部分: 小練習(xí)1-處理用戶輸入 小練習(xí)2-日期對(duì)象的使用 小練習(xí)3:輪播圖 小練習(xí)4:輸入提示框 小練習(xí)...

    cnTomato 評(píng)論0 收藏0
  • task0002(四)- 練習(xí):數(shù)據(jù)處理、輪播及交互

    摘要:獲取下一個(gè)元素節(jié)點(diǎn),存在的話,取消現(xiàn)有選中狀態(tài),設(shè)置下一個(gè)元素節(jié)點(diǎn)為選擇中,調(diào)用運(yùn)動(dòng)框架實(shí)現(xiàn)動(dòng)畫,添加定時(shí)器,調(diào)用該函數(shù),實(shí)現(xiàn)自動(dòng)播放。移出時(shí),開啟定時(shí)器,繼續(xù)輪播。輪播間隔時(shí)間單位為毫秒,默認(rèn)為,在內(nèi)部,以下部分進(jìn)行修改或添加。 轉(zhuǎn)載自我的個(gè)人博客 歡迎大家批評(píng)指正 包括5部分: 小練習(xí)1-處理用戶輸入 小練習(xí)2-日期對(duì)象的使用 小練習(xí)3:輪播圖 小練習(xí)4:輸入提示框 小練習(xí)...

    趙春朋 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<