• 移动端滑屏全应用【二】滑屏封装注意事项与移动端轮播


    移动端滑屏封装注意事项:

    1.touchMove时候方向判断(可以控制在 以x轴位中心正负15度之内为横向滑屏,纵向滑屏同理)

    2.上下滑屏与左右滑屏的冲突(判断用户滑动方向后,只做单方向的处理)

    3.安卓触摸(例如某个人手指很粗)触发touchMove(记录上一次的手指坐标,每一次move的时候判断,上次的坐标与这一次的坐标相同则return掉)

    移动端轮播封装注意事项:

    1.使用transition做过度效果时,需要在每次start的时候清除transition,否则效果会有卡顿

    2.每次end时算出当前应处于的位置,再利用transition做过渡效果

    3.做无缝滚动时,需要在将结点复制一份,在start时判断:若是第一张,则迅速移动到新复制结点的第一张;若是最后一张,则迅速移动到第一份结点的最后一张。(仿照PC端复制第一张和最后一张行不通)

    轮播图封装如下:

    function transform (el, attr, val) {
        if (!el.transform) {
            el.transform = {
            };
        }
        if (val === undefined) {
            return el.transform[attr];
        }
        el.transform[attr] = val;
        var str = "";
        // 此处要注意必须要在原由的基础上遍历
        for (var s in el.transform) {
            switch (s) {
                case "rotate":
                case "rotateX":
                case "rotateY":
                case "rotateZ":
                case "skewX":
                case "skewY":
                    str += s + "(" + el.transform[s] + "deg) ";
                    break;
                case "scale":
                case "scaleX":
                case "scaleY":
                    str += s + "(" + el.transform[s] + ") ";
                    break;
                case "translateX":
                case "translateY":
                case "translateZ":
                    str += s + "(" + el.transform[s] + "px) ";
                    break;
            }
        }
        el.style.WebkitTransform = el.style.transform = str;
    }
    function css (el, attr, val) {
        var transformAttr = ["rotate", "rotateX", "rotateY", "rotateZ", "skewX", "skewY", "scale", "scaleX", "scaleY", "translateX", "translateY", "translateZ"];
        for (var i = 0; i < transformAttr.length; i++) {
            if (attr === transformAttr[i]) {
                return transform(el, attr, val);
            }
        }
        if (val === undefined) {
            val = getComputedStyle(el)[attr];
            val = parseFloat(val);
            return val;
        }
        if (attr === "opacity") {
            el.style[attr] = val;
        } else {
            el.style[attr] = val + "px";
        }
    }
    function TSwiper (obj) {
        obj = obj || {};
        this.default = {
            wrapper: '#wrapper',
            dir: 'x',
            start: {},
            target: {},
            interval: 3000,
            beforeSlide: function () {},
            afterSlide: function () {},
            dirHandler: {
                x: 'translateX',
                y: 'translateY'
            },
            changedVal: {
                x: 'pageX',
                y: 'pageY'
            }
        };
        for (var index in this.default) {
            if (!obj[index]) {
                obj[index] = this.default[index];
            }
        }
        this.wrapper = obj.wrapper;
        this.nowPos = null;   // 当前位置的translate
        this.dir = obj.dir;    // 方向 x || y
        this.start = obj.start;
        this.target = obj.target;
        this.interval = obj.interval;
        this.beforeSlide = obj.beforeSlide;  // 手指刚触摸时的回调,可依赖注入当前滑动结点,实践对象和当前swiper实例对象
        this.afterSlide = obj.afterSlide;   // 滑屏结束后的回调,依赖注入值同上
        this.autoTimer = null;
        this.now = 0;
    }
    TSwiper.prototype.init = function () {
        var _this = this;
        this.wrapper = document.querySelector(this.wrapper);
        this.slideItem = document.querySelectorAll('.slide-item');
        this.pager = document.querySelector('#pager');
        this.aPagerItem = document.querySelectorAll('.pager-item');
        this.slideItem.forEach(function (item, index) {
            item.style.width = window.outerWidth + 'px';
            if (index === 0) {
                _this.pager.innerHTML += '<li class="pager-item active"></li>'
            } else {
                _this.pager.innerHTML += '<li class="pager-item"></li>'
            }
        })
        this.aPagerItem = document.querySelectorAll('.pager-item');
        this.wrapper.innerHTML += this.wrapper.innerHTML;  // 将结点复制一份
        css(_this.wrapper, 'translateX', 0);
        css(_this.wrapper, 'translateY', 0);
        css(_this.wrapper, 'translateZ', 0);
        this.wrapper.style.width = this.slideItem.length * 2 * window.outerWidth + 'px';
        this.judge = function (specialIndexFn) {
            if (_this.now === 0) {
                _this.now = _this.slideItem.length;
                specialIndexFn && specialIndexFn();
            } else if (_this.now === _this.slideItem.length * 2 - 1) {
                _this.now = _this.slideItem.length - 1;
                specialIndexFn && specialIndexFn();
            }
        }
        this.setPageIndex = function () {
            let pageIndex;
            // 设置轮播点
            pageIndex = _this.now % _this.slideItem.length;
            _this.aPagerItem.forEach(function (item, index) {
                item.className = '';
            })
            _this.aPagerItem[pageIndex].className = 'active';
        }
        this.wrapper.addEventListener('touchstart', function (ev) {
            clearInterval(_this.autoTimer);
            _this.beforeSlide && _this.beforeSlide.call(_this.wrapper, ev, _this);
            _this.wrapper.style.transition = 'none';  // 初始化时清除过度,手指按下时需要设置判断并设置初始位置
            _this.nowPos = css(_this.wrapper, _this.default.dirHandler[_this.dir]);
            _this.now = Math.round(Math.abs(_this.nowPos / window.outerWidth))
            // 三张图片复制一份一共六张,如果是第一张,迅速移动到第四张,如果是第六张,迅速移动到第三张
            _this.judge();
            css(_this.wrapper, _this.default.dirHandler[_this.dir], -_this.now * window.outerWidth)
            _this.nowPos = css(_this.wrapper, _this.default.dirHandler[_this.dir]);
            _this.start.x = ev.changedTouches[0].pageX;
            _this.start.y = ev.changedTouches[0].pageY;
        })
        _this.wrapper.addEventListener('touchmove', function (ev) {
            css(_this.wrapper, _this.default.dirHandler[_this.dir], _this.nowPos + ev.changedTouches[0][_this.default.changedVal[_this.dir]] - _this.start[_this.dir])
        })
        _this.wrapper.addEventListener('touchend', function (ev) {
            _this.nowPos = css(_this.wrapper, _this.default.dirHandler[_this.dir]);
            _this.now = Math.round(Math.abs(_this.nowPos / window.outerWidth));
            _this.wrapper.style.transition = '0.3s';
            _this.afterSlide && _this.afterSlide.call(_this.wrapper, ev, _this);
            css(_this.wrapper, _this.default.dirHandler[_this.dir], -_this.now * window.outerWidth);
            _this.setPageIndex();
            _this.autoTimer = setInterval(_this.timerFn, _this.interval);
        })
        _this.timerFn = function () {
            _this.wrapper.style.transition = 'none';
            _this.judge(function () {
                css(_this.wrapper, _this.default.dirHandler[_this.dir], -_this.now * window.outerWidth);
            });
            _this.now++;
            setTimeout(function () {
                _this.wrapper.style.transition = '0.3s';
                css(_this.wrapper, _this.default.dirHandler[_this.dir], -_this.now * window.outerWidth);
                _this.setPageIndex();
            }, 50)
        }
        _this.autoTimer = setInterval(_this.timerFn, _this.interval);
    }
    export default TSwiper

    调用方法:

    var tSwiper = new TSwiper().init()

    有问题可留言。

  • 相关阅读:
    博弈论进阶之树的删边游戏与无向图的删边游戏
    博弈论进阶之Every-SG
    HDU 3595 GG and MM(Every-SG)
    博弈论入门之斐波那契博弈
    博弈论入门之威佐夫博弈
    博弈论进阶之Multi-SG
    博弈论进阶之Anti-SG游戏与SJ定理
    博弈论进阶之SG函数
    【每天一个Linux命令】12. Linux中which命令的用法
    《数学之美》之悟——学懂数学为何如此重要?
  • 原文地址:https://www.cnblogs.com/pomelott/p/10054737.html
Copyright © 2020-2023  润新知