[原创]zepto打造一款移动端划屏插件

最近忙着将项目内的jquery 2换成zepto

因为不想引用过多的zepto包,所以花了点时间

zepto真的精简了许多,源代码看着真舒服

正好项目内需要一个划屏插件,就用zepto写了一个

逻辑其实很简单,但没想到测试时,在老版本android设备浏览器上的touchmove有许多bug

做兼容倒是搞了一阵

效果图

样式1

样式2

调用

正常情况下应该是后台生成的html代码,但还是写了一套操作tab页的方法

调用简便如下:

<link rel="stylesheet" href="kslider.css" type="text/css"/>
<script type="text/javascript"  src="http://zeptojs.com/zepto.js"></script>
<script type="text/javascript"  src="zepto.kslider.js"></script>
<script type="text/javascript">
    var k;

    $(function () {

        /*
        参数:config

        change:tab页变更事件
            参数e: 当前页码
        tick:自动滚动间隔时间毫秒 (不设置则不自动滚动)
        maxWidth:容器最大宽度 (默认有100%)
        minWidth:容器最小宽度 (默认有100%)
        className:样式类名
            "ks_wt_1" 标题栏-方形 (默认)
            "ks_wt_2" 标题栏-小圆形
            或者你自定义的类名

        */

        k = $("#divs1").slider({ change: function (e) { console.log(e); }, maxWidth: 360, minWidth: 300 });
        //js添加一页并且跳转到第4页
        k.add("标题", "内容").tab(3);
        //删除页
        //k.remove(0);

        //小圆形按钮标题  每隔3秒自动滚动 myimg:自己写的css类,控制里面图片大小
        $("#divs2").slider({ maxWidth: 300, className: "ks_wt_2 myimg", tick: 3000 });
    });
</script>

html

<div id="divs1" class="kslider">
    <ul class="ks_wt">
    <li class="ks_t2">标题1</li>
    <li>标题2</li>
    <li>标题3</li>
    </ul>
    <div class="ks_dbox ks_ts">
        <div class="ks_warp">
            <ul>
                <li>text1</li>
                <li>text1</li>
                <li>text1</li>
                <li>text1</li>
                <li>text1</li>
                <li>text1</li>
                <li>text1</li>
                <li>text1</li>
            </ul>
        </div>
        <div class="ks_warp">
            <img src="img/img1.jpg" />
        </div>
        <div class="ks_warp">
            <ul>
                <li>text3</li>
                <li>text3</li>
                <li>text3</li>
                <li>text3</li>
                <li>text3</li>
                <li>text3</li>
            </ul>
        </div>
    </div>
</div>

具体代码

css

/*
    kslider.css
    lxk 2014.08.14
    www.cnblogs.com/wingkun
*/

body{margin:0px;text-align:center;font:12px 微软雅黑;}

.kslider{width:100%;overflow:hidden;margin:0 auto;background:#f0f0f0;}

.kslider .ks_warp{width:100%;}
.kslider .ks_ts{-webkit-transition:500ms;}
.kslider .ks_dbox{width:100%;display:-webkit-box;text-align:left;}

.kslider .ks_wt{display:-webkit-box;margin:0px;padding:0px;-webkit-box-pack:center;}
.kslider .ks_wt li{text-align:center;list-style:none;background: -webkit-linear-gradient(top, #AAAAAA 0%,#979797 100%);color: #fff;}

.ks_wt_1 .ks_wt li{-webkit-box-flex:1;height:35px;line-height:35px;border-right:solid 1px #BBB;}
.ks_wt_2 .ks_wt li{background:-webkit-linear-gradient(top, #e7e7e7 0%,#dfdfdf 100%);text-indent: 20px;height:10px;width:10px;overflow:hidden; border-radius:100%;margin:5px;}

.ks_wt_1 .ks_wt .ks_t2{background:-webkit-linear-gradient(top, #e7e7e7 0%,#dfdfdf 100%); color:#000;}
.ks_wt_2 .ks_wt .ks_t2{background: -webkit-linear-gradient(top, #AAAAAA 0%,#979797 100%); -webkit-animation:kt2 500ms linear;}

@-webkit-keyframes kt2
{
    0%{-webkit-transform:scale(1);}
    100%{-webkit-transform:scale(1.5);}
}

js

/*
    zepto.kslider.js
    lxk 2014.08.14
    www.cnblogs.com/wingkun
*/

 (function ($) {
        /*
        参数:config

        change:tab页变更事件
            参数e: 当前页码
        tick:自动滚动间隔时间毫秒 (不设置则不自动滚动)
        maxWidth:容器最大宽度 (默认有100%)
        minWidth:容器最小宽度 (默认有100%)
        className:样式类名
            "ks_wt_1" 标题栏-方形 (默认)
            "ks_wt_2" 标题栏-小圆形
            或者你自定义的类名

        */
        $.fn.slider = function (config) {

            config = $.extend({}, { className: "ks_wt_1" }, config);

            var b = $(this), tw, timer,
            target = b.find(".ks_dbox"),
            title = b.find(".ks_wt"),
            m = { initX: 0, initY: 0, startX: 0, endX: 0, startY: 0, canmove: false },
            currentTab = 0;

            b.toggleClass(config.className,true);
            if (config.maxWidth) b.css({ maxWidth: config.maxWidth });
            if (config.minWidth) b.css({ mixWidth: config.minWidth });

            title.on("click", function (e) {
                if (e.target == this) return;
                toTab($(e.target).index());
            });

            b.on("touchstart", function (e) {
                var et = e.touches[0];
                if ($(et.target).closest(".ks_dbox").length != 0) {
                    m.canmove = true, m.initX = m.startX = et.pageX;
                    m.initY = et.pageY;
                    clearTimer();
                }

            }).on("touchmove", function (e) {

                var et = e.touches[0];
                if (m.canmove && Math.abs(et.pageY - m.initY) / Math.abs(et.pageX - m.initX) < 0.6) {
                    //             if (m.canmove && Math.abs(et.pageX - m.startX) > 10) {
                    target.removeClass("ks_ts").css("-webkit-transform", "translate3d(" + (m.endX += et.pageX - m.startX) + "px,0,0)");
                    m.startX = et.pageX;
                    e.preventDefault();
                }
            }).on("touchend", function (e) {
                if (!m.canmove) return;
                target.toggleClass("ks_ts", true);

                tw = target.width();
                //是否超过了边界
                var bl = false, current = Math.abs(m.endX / tw);

                if (m.endX > 0) {
                    current = m.endX = 0;
                    bl = true;
                }
                else if (m.endX < -tw * (target.children().length - 1)) {
                    current = target.children().length - 1;
                    bl = true;
                }

                if (!bl) {
                    if (m.endX % tw != 0) {
                        //target.css("transform", "translate(" + (m.endX = -tw*Math.abs(Math.round(m.endX/tw))) + "px,0px)");
                        var str = parseInt((current + "").split(".")[1][0]);

                        if (e.changedTouches[0].pageX > m.initX) {
                            //往右
                            current = str <= 9 ? Math.floor(Math.abs(current)) : Math.abs(Math.round(m.endX / tw));
                        } else {
                            //往左
                            current = str >= 1 ? Math.floor(Math.abs(current)) + 1 : Math.abs(Math.round(m.endX / tw));
                        }
                    }
                }
                toTab(current);
                setTimer();
                m.canmove = false;
            });

            var move = function (i) {
                target.css("-webkit-transform", "translate3d(" + (m.endX = i) + "px,0,0)");
            }

            var setIndex = function (i) {
                return i < 0 ? 0 : i >= target.children().length ? target.children().length - 1 : i;
            }

            var toTab = function (i) {
                i = setIndex(i), tw = target.width();
                move(-tw * i), toTitle(i);
                if (currentTab != i && config.change) {
                    config.change(i);
                }
                currentTab = i
            }

            var toTitle = function (i) {
                if (title.length == 0) return;
                title.children().toggleClass("ks_t2", false).eq(i).toggleClass("ks_t2", true);
            }

            var setTimer = function () {
                if (!config.tick) return;
                if (timer) clearTimer();
                timer = setInterval(function () {
                    toTab(currentTab >= target.children().length - 1 ? 0 : currentTab + 1);
                }, config.tick)
            }

            var clearTimer = function () {
                clearInterval(timer);
                timer = null;
            }

            setTimer();

            return {
                add: function (t, c) {
                    //添加tab
                    title.append("<li>" + t + "</li>");
                    target.append("<div class=\"ks_warp\">" + c + "</div>");
                    return this;
                },
                remove: function (i) {
                    //移除tab
                    if (title.children().length == 1) return;
                    i = setIndex(i);
                    title.children().eq(i).remove();
                    target.children().eq(i).remove();
                    if (i == currentTab) toTab(0);
                    return this;
                }, tab: function (i) {
                    //设置或者获取当前tab
                    return i ? toTab(i) : currentTab;
                }
            }
        }
    })(Zepto);

其他

  • demo里面只引用了基础的zepto,其实移动端他的touch.js也是非常有必要的,引用了之后可以将代码内的click换成zepto的tap事件

  地址:https://github.com/madrobby/zepto/blob/master/src/touch.js#files

  • 容器用的box布局,内部html样式要注意一下
  • 只支持大部分webkit内核浏览器
  • 测试需要在移动设备上进行,电脑上需要chrome,F12打开,在控制台旁边,伪装环境,如下图:

  发布匆忙,如有纰漏麻烦大家指出哦,demo下载:这里

本人工作之余,闲暇时间好多……顺便来寻求下兼职!

asp.net/js/jquery/html5/css3/移动前端 经验丰富

(坐标[长沙],行业[彩票业] -- 如果有需要)

求多多支持!

[原创]zepto打造一款移动端划屏插件

时间: 2024-10-05 23:09:04

[原创]zepto打造一款移动端划屏插件的相关文章

雅迪的跨界:如何打造一款高端电动车?

8月末,雅迪在北京召开了一场声势浩大的产品发布会,在这场发布会上,雅迪正式面向全球用户发布了最新型电动车产品雅迪Z3. 这款电动车产品有着集艺术.科技与体验为一体的优质特性,更重要的是,它的国内售价仅有国外售价的三分之一左右.根据雅迪官方发言人的讲述内容来看,这款Z3不仅凝聚着雅迪一如既往的优秀产品品质,而且在设计.潮流和各种黑科技方面的表现亦至臻完善.笔者目前从国内大多媒体网站和社交网络用户的评判结果来看,发现大多消费者对这款电动车产品均寄予了一定程度的期望,尤其是这款电动车产品通过跨界思维打

[原创]jquery+css3打造一款ajax分页插件

最近公司的项目将好多分页改成了ajax的前台分页以前写的分页插件就不好用了,遂重写一个 支持IE6+,但没有动画效果如果没有硬需求,个人认为没必要多写js让动画在这些浏览器中实现css3的动画本来就是帮我们取代js中这部分动画代码的使js更纯粹地去实现逻辑 效果图如下: 调用代码如下: 包括常用的加载失败重试,参数可配置是否能手动输入页码,设置按钮数目,可以调用多个page等等,调用代码很简便 <script type="text/javascript"> var kpag

想打造一款成功的移动应用?你最需要关注性能指标!

其实,对于做应用开发的团队来说,有一件事非常清楚,就是如果想做一款成功的五星级移动应用,真的需要经历一段漫长的旅途.开发.测试以及发布移动应用程序只是走向成功的第一步.国内 APM 领域新兴领军企业 OneAPM 建议开发者一定要重点关注移动应用的性能指标. 诚然,想打造一款成功的移动应用绝非易事,我们需要很多评判标准.我们暂且不管如何来定义成功:你希望打造品牌也好,挣更多的钱也罢,还是为了获得更多的用户.总之,你都需要正确的衡量标准,只有这样你才能不断地优化应用程序,或者说完成对应用程序进行升

打造一款属于自己的web服务器——从简单开始

距离开篇已经过了很久,期间完善了一下之前的版本,目前已经能够完好运行,基本上该有的功能都有了,此外将原来的测试程序改为示例项目,新项目只需按照示例项目结构实现controller和view即可,详情见: easy-httpserver. demo-httpsrever.    这次我们将首先来实现一个简单版本,该版本只包括一些基本的功能,后续版本也将在此基础上一步步改进. 一.准备工作 俗话说的好,工欲善其事,必先利其器.我们在开始开发之前应做好如下准备(真的很简单): java开发环境,IDE

如何打造一款出色的APP

本文主要是讲述如何打造一款出色的APP,更多android开发技术专业知识,请登陆疯狂软件教育官网. 在这个移动互联网时代各种各样的APP层出不穷,有的APP从始至终就没有被用户接受.有的APP火爆一时最终也是昙花一现.APP是O2O.移动支付.游戏等领域在移动端不可缺少的载体,那么如何打造一款出色的APP成了众多创业者关注的话题.环球漫游APP从“冷启动“到现在被众多用户接受并使用,这其中指定会有很多宝贵的经验.下面环球漫游CTO杜长伟给我们分享APP创业干货,从中,我们可以了解打造一款出色的

打造一款属于自己的web服务器——最后的一点完善

上一篇我们通过反射实现了动态加载多个controller,就功能上来说整个项目已经基本上完成了,但是目前我们仍然还有一些问题,例如模板支持不好.很多配置信息硬编码不好修改.此外,我们预期的目标是实现一个可嵌入的jar,以实现web服务,而就目前而言明显是不行的.那么我们现在就来解决这些问题. 一.使用velocity拓展模板    想要实现一套完善的模板还是比较麻烦的,所以目前我们考虑使用java支持的模板来实现,目前比较常用的有Freemaker,Velocity等,因为比较熟悉velocit

从手游测试的角度,如何打造一款好游戏

5月15日,TestBird COO卫少峰在重庆西游汇创业咖啡,携手曲速资本投资总监Jerry.天象互动副总裁蒙琨.墨灵科技CEO白亮等一众大拿,参加“重庆移动游戏DEMO秀”并根据TestBird手游云测平台一年多来的游戏与测试经验,介绍了从手游测试的角度,如何打造一款好游戏. 开场卫少峰向现场开发者抛出了三个问题: 1.好游戏的兼容性到底如何? 2.大部分游戏得不到高分,为什么? 3.如何做好游戏的兼容性? 问题提出后引起了在场开发者们的热烈讨论,而卫少峰在随后的讲话中说出了问题的答案. 好

打造一款人见人爱的ORM(一)

      "很多人都不太认可以第三方ORM,因为考虑的点不够全面,没有用户群体大的ORM有保证,这点是不可否认确是事实.但是往往用户群体大的ORM又有不足之处,今天我们就来聊聊关于ORM的话题,打造一款人见人爱的ORM框架." 小程简介       季健国(蚂蚁Ant),10年的工作经验, 7年的IT经验是一枚名副其实的老菜鸟.技术无边界,编程靠思想.目前主要研究方向为ORM底层核心,爬虫,WebAPI,SOA,Docker,Xamarin,微信小程序,微服务架构:个人爱好:阅读,跑

19款高端大气企业网站模版

下载地址:点击下载 1.  css3简洁时尚商务整站企业模板 2.  暗红色游戏动漫设计公司html模板 3.  简洁的摩托车企业网站模板 4.  简洁干净的企业HTML5网页模板 5.  简洁极致小清新作品展示灰色整站模板 6.  简洁设计师作品展示响应式模板下载 7.  简洁时尚大气的商业网站模板 8.  简洁素雅扁平化插画设计师网页模板 9.  焦点大图摄影行业网站模板 10.        咖啡大图新闻杂志类网站模板 11.        宽屏大气的互联网科技公司css3企业模板 12.