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

标签: zepto 移动 插件 | 发表时间:2014-08-14 08:06 | 作者:wingkun
分享到:
出处:

最近忙着将项目内的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打造一款移动端划屏插件,转载请注明。

相关 [zepto 移动 插件] 推荐:

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

- - 博客园_首页
最近忙着将项目内的jquery 2换成zepto. 因为不想引用过多的zepto包,所以花了点时间. zepto真的精简了许多,源代码看着真舒服. 正好项目内需要一个划屏插件,就用zepto写了一个. 逻辑其实很简单,但没想到测试时,在老版本android设备浏览器上的touchmove有许多bug.

zepto的touch库安卓4.4滑动bug修复

- - Web前端 - ITeye博客
本文也是从网上摘录的,因为坑爹的zepto团队以没有安卓设备为由不予修复此问题,所以做个记录以免今后忘记了. 以下代码为zepto中部分代码,可查找后然后替换即可:. * 修复 android 4.4 swipe 事件. 已有 0 人发表留言,猛击->> 这里<<-参与讨论.

9个最新的手机/移动设备jQuery插件

- - 设计达人
随着互联网的流行,移动网站开始急速增加,在2014年手机网站将会出现很多,所以手机网站是必须要学会制作的. 手机网站不像桌面平台一样制作,否则会影响显示效果,目前大部分手机网站使用 响应式设计技术,而且也很流行. 但是新手想实现响应式技术是不容易的,所以我们可以用一些响应式框架或适用于移动设备的jQuery插件来制作,这样能方便实现我们的需求.

最佳6款用于移动网站开发的 jQuery 图片滑块插件

- - 博客园_梦想天空
  随着智能手机的普及,越来越多的用户喜欢通过手机中浏览网页. 今天这篇文章为大家推荐最佳6款用于移动应用的. jQuery 图片滑块插件,这些插件很好的处理了触屏事件,效果平滑,帮助你构建用户体验良好的移动网站. PhotoSwipe 是一款免费的. jQuery 图片库插件,支持 iPhone, iPad, Android, Blackberry 等各种移动设备.

不用插件修改 Chrome 的 User Agent 字符串、模拟移动触屏设备

- - Chrome迷
今天发现了 Chrome 上一个修改 User Agent 字符串的新方法,甚至还能模拟触屏设备,手动改变你所在的位置(经纬度). 1、打开 Chrome 的”开发者工具”,也就是菜单——工具——开发者工具. 2、在打开的开发者工具(Developer Tools)界面的右下角,点击黑色齿轮图标. 3、然后在黑底界面中点击”Overrides”标签页就能看到了.

jquery 插件

- - JavaScript - Web前端 - ITeye博客
 jQuery插件的开发包括两种:. 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法. jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别的插件开发,即给jQuery对象添加方法. 下面就两种函数的开发做详细的说明. 1 、类级别的插件开发.

XBMC 优酷插件

- iworm - Wow! Ubuntu
才知道,原来优酷还有 XMBC 的 Linux 版插件,这下看 Youku 视频就更加方便了,以下是安装方法. 1 安装 XBMC :XBMC 是支持跨平台的开源家庭多媒体娱乐中心软件,想安装最新版 XBMC 请查看此文. 2 解决乱码 : XBMC 在我的英文界面下中文会显示乱码,这是由字体原因引起的,所以先要解决此问题.

Menu - 菜单插件

- Xin - 博客园-首页原创精华区
    1)Lava Lamp基于JQuery 的水平滑动导航条.      2)jQuery.dropmenu这个插件能够将标准的UL元素转换成一个包含子菜单的下拉菜单. 易于使用,风格样式采用CSS控制.       3)JQuery Context Menu Plugin是一个非常轻便的jQuery右键菜单插件.

Charts - 图表插件

- 天使羊 - 博客园-首页原创精华区
       Charts - 图表插件.        1)Highstock 可让你使用纯 JavaScript 创建股票或者通用的时间线图表.       2)Smoothie Charts是一个小型图表生成脚本,专为生成实时数据图表而设计. 比如可以用于生成CPU使用情况的图表.       3)JQuery Gantt Chart这是一款jQuery图表插件,可以实现甘特图.

eclipse插件-easy explore

- - 博客园_首页
最近找到一个Eclipse的插件,名字是Easy Explore,是 Easy Structs 其 中的一个部分. 主要的功能就是在Eclipse里面视图的部分如果看到自己的工程,或者Package,包什么的,在安装完该插件以后点击鼠标右键,选 择"Easy Explore"就可以快速的打开该文件的windows存放文件夹,对于快速的导出源文件是一个很有用的插件.