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

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

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()

有问题可留言。

原文地址:https://www.cnblogs.com/pomelott/p/10054737.html

时间: 2024-10-10 07:48:22

移动端滑屏全应用【二】滑屏封装注意事项与移动端轮播的相关文章

MUI组件二:复选框、对话框、图片轮播、图标和输入框

1.checkbox(复选框) checkbox常用于多选的情况,比如批量删除.添加群聊等: DOM结构 <div class="mui-input-row mui-checkbox"> <label>checkbox示例</label> <input name="checkbox1" value="Item 1" type="checkbox" checked> </di

Web全栈之路 1.CSS3中3D立方体以及3D轮播图

1.3D坐标系 3D坐标可以用左手来模拟,其中大拇指方向默认是X轴正方向,食指方向是Y轴正方向,中指方向是Z轴正方向.注意:当设置transform:rotateX(90deg)时,相当于将X轴转动90°,此时Z轴正方向向上,所以设置transform:translateZ(150px)时,就产生了3D立方体的上面,具体原理可以通过chrome浏览器审查元素来调试. 2.3D视图 transform-style:flat(默认,二维效果) / preserve-3d(三维效果).设置一个元素的t

移动端滑屏全应用【一】cssHandler操作基础动画函数封装

前言: 大家都知道,在移动端进行操作结点移动时,我们都会使用操作transform来代替top等用以提高性能,必要的时候还可开启3d加速.我们都会使用getComputedStyle来获取结点的最终样式,但使用getComputedStyle来获取transform时我们获取到的是一个矩阵值,而且是无法通过设置矩阵值反向设置transform的效果的.如下: body.style.WebkitTransform = 'translateY(50px)' getComputedStyle(body

一个丝滑的全屏滑动返回手势

一个丝滑的全屏滑动返回手势 全屏返回手势 自 iOS7 之后,Apple 增加了屏幕边缘右划返回交互的支持,再配合上 UINavigationController 的交互式动画,pop 到上一级页面的操作变的非常顺畅和丝滑,从此,我很少再使用点击左上角导航栏上的返回按钮的方式返回了,因为这对单手操作十分不友好:如果一个 App 居然胆敢不支持滑动返回,那离被卸载就不远了. 说到全屏返回手势,首先我感觉这件事本身可能就有问题,毕竟有点反苹果官方的交互,让用户从任意的地方都能够滑 动返回这个交互在国

利用轮播原理结合hammer.js实现简洁的滑屏功能

最近有个任务,做一个非常小的h5的应用,只有2屏,需要做横向的全屏滑动切换和一些简单的动画效果,之前做这种东西用的是fullpage.js和jquery,性能不是很好,于是就想自己动手弄一个简单的东西来实现.最后我用zepto + hammer.js 和轮播的方式解决了这个问题,效果还不错,整个页面不开启Gzip时所有资源请求的数据大小为200KB左右.这篇文章总结下这个方法的实现思路. 效果演示(代码下载): 1. 实现要点 1)滑屏借鉴bootstrap的carousel插件,不过完全没有它

viewpager 滑至最后一屏禁止向右滑,滑至第一屏禁止向左滑,怎么实现

============问题描述============ 如题 viewpager 滑至最后一屏禁止向右滑,滑至第一屏禁止向左滑,怎么实现 ============解决方案1============ 谢谢楼主分享,我学习了

javascript无缝全屏轮播

虽然平时能利用插件来实现,但是总是觉得,如果连个无缝轮播都写不出来,还玩个毛线: 其实现在还真的是玩毛线,因为代码都是别人的,不过嘛,很快就变成是我的啦! 代码还没封装成插件,其实我也还没弄清楚. 下面有很多注释的,如果路过的你认为有错误,请指出来啊,使劲拍. html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-C

Swiper实现全屏视觉差轮播

Swiper作为当代流行的js框架,非常受到青睐,这里演示swiper在pc端全屏视觉轮播的效果,这也是pc端常用的一种特性 一  以教师节为主题的一个全屏轮播 1 首先加载插件,需要用到的文件有swiper.min.js和swiper.min.css文件以及jquery-1.11.3.min.js官网都有(可以下载完整的压缩文件) <link rel="stylesheet" href="css/swiper.min.css" > <script

淘宝店如何加入全屏轮播图片

淘宝店如何加入全屏轮播图片? | 浏览:5779 | 更新:2014-06-11 11:31 | 标签: 淘宝 1 2 3 4 5 分步阅读 百度经验:jingyan.baidu.com 开淘宝店的朋友,看到很多店铺有各式各样的轮播大图,很高端大气,您是否也想拥有一款属于自己的轮播图呢?今天我就交给大家如何制作全屏轮播图. 百度经验:jingyan.baidu.com 工具/原料 电脑/网络 百度经验:jingyan.baidu.com 方法/步骤 1 登录淘宝店. 登录到您的淘宝店,点击“卖家