Zepto
github地址: https://github.com/madrobby/zepto
官方地址: http://zeptojs.com/
中文版地址: http://www.css88.com/doc/zeptojs_api/
Zepto就是jQuery的移動(dòng)端版本, 可以看做是一個(gè)輕量級(jí)的jQuery
注意點(diǎn)
Zepto的設(shè)計(jì)目的是提供 jQuery 的類似的API,但并不是100%覆蓋 jQuery
jQuery的底層是通過(guò)DOM來(lái)實(shí)現(xiàn)效果的, zepto.js 是用css3 來(lái)實(shí)現(xiàn)的;
官網(wǎng)下載的zepto,就已經(jīng)包含了官網(wǎng)所述的默認(rèn)模塊了
github上下載的zepto模塊需要自己導(dǎo)入
<!--<!–引入核心模塊;包含許多jQuery中常見(jiàn)方法–>--> <script src="js/zepto.js"></script> <!--<!–引入zepto事件模塊, 包含了常見(jiàn)的事件方法on/off/click ...–>--> <script src="js/event.js"></script> <!--<!–引入zepto動(dòng)畫(huà)模塊,–>--> <script src="js/fx.js"></script> <!--<!–引入zepto動(dòng)畫(huà)模塊的常用方法,–>--> <script src="js/fx_methods.js"></script>
Zepto點(diǎn)擊事件
由于移動(dòng)端的手勢(shì)多而且分單擊雙擊,所以移動(dòng)端的click事件有300ms左右的延遲,所以移動(dòng)端的點(diǎn)擊事件用tab
$("div").tap(function(){ ...... })
zepto中touch相關(guān)事件
touchstart
touchstart是手指剛觸摸到元素時(shí)觸發(fā)的事件
touchmove
touchmove是手指移動(dòng)時(shí)觸發(fā)的事件
touchend
當(dāng)手指離開(kāi)指定元素時(shí)觸發(fā)
注意點(diǎn)
添加以上三個(gè)事件的時(shí)候用addEventListener
以上三個(gè)事件對(duì)pc端無(wú)效
zepto中touch事件的對(duì)象
touches:
保存了屏幕上所有手指的列表
targetTouches
保存了元素上所有手指的列表
changedTouches
包含了剛剛與屏幕接觸的手指或者剛剛離開(kāi)屏幕的手指
TouchEvent {isTrusted: true, touches: TouchList, targetTouches: TouchList, changedTouches: TouchList}
zepto中touch事件的XY
client: 可視區(qū)域
page: 內(nèi)容
var oDiv = document.querySelector("div"); /* 1.注意點(diǎn): 無(wú)論是event對(duì)象中的touches/targetTouches/changedTouches都是一個(gè)偽數(shù)組 所以我們想要獲取手指位置的時(shí)候, 需要從偽數(shù)組中取出需要獲取的那個(gè)手指對(duì)象 */ oDiv.addEventListener("touchstart", function (event) { // 獲取手指距離屏幕左上角的位置 // console.log(event.targetTouches[0].screenX); // console.log(event.targetTouches[0].screenY); // 獲取相對(duì)于當(dāng)前視口的距離 console.log("clientX", event.targetTouches[0].clientX); console.log("clientY", event.targetTouches[0].clientY); /* clientX 10 clientY 8 pageX 1156 pageY 8 */ // 獲取相對(duì)于當(dāng)前頁(yè)面內(nèi)容的距離 console.log("pageX", event.targetTouches[0].pageX); console.log("pageY", event.targetTouches[0].pageY); });
簡(jiǎn)單案例: 物塊拖拽
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>08-touch事件練習(xí)</title> <style> *{ margin: 0; padding: 0; } div{ width: 100px; height: 100px; background: red; } </style> </head> <body> <div></div> <script> var oDiv = document.querySelector("div"); var startX, startY, moveX, moveY; // 1.監(jiān)聽(tīng)手指按下事件 oDiv.addEventListener("touchstart", function (event) { // 記錄手指按下的位置 startX = event.targetTouches[0].clientX; startY = event.targetTouches[0].clientY; }); // 2.監(jiān)聽(tīng)手指一動(dòng)事件 oDiv.addEventListener("touchmove", function (event) { // 記錄手指移動(dòng)之后的位置 moveX = event.targetTouches[0].clientX; moveY = event.targetTouches[0].clientY; // 計(jì)算兩個(gè)位置之間相差的距離, 相差的距離就是需要移動(dòng)的距離 var offsetX = moveX - startX; var offsetY = moveY- startY; // 讓div移動(dòng)起來(lái) oDiv.style.transform = "translate("+offsetX+"px,"+offsetY+"px)"; }); </script> </body> </html>
zepto中touch事件的點(diǎn)透問(wèn)題
如果兩個(gè)元素是重疊的(一個(gè)在另一個(gè)上面), 并且上面一個(gè)監(jiān)聽(tīng)了touchstart事件, 下面一個(gè)監(jiān)聽(tīng)了click事件,那么如果上面一個(gè)元素觸發(fā)touchstart事件之后消失了, 那么就會(huì)出現(xiàn)點(diǎn)透問(wèn)題
解決方案: fastclick框架
注: 框架必須在前面調(diào)用, 并且所有的元素都被注冊(cè)了fastclick中的事件, 以后所有的click事件都是fastclick的click事件
zepto中的swipe事件
手指在元素上滑動(dòng)觸發(fā)的事件
$("div").swipeLeft(function () { // console.log("左滑動(dòng)"); $(this).animate({left: "0px"}, 1000); }); $("div").swipeRight(function () { // console.log("右滑動(dòng)"); $(this).animate({left: "100px"}, 1000); }); $("div").swipeUp(function () { // console.log("上滑動(dòng)"); $(this).animate({top: "0px"}, 1000); }); $("div").swipeDown(function () { // console.log("下滑動(dòng)"); $(this).animate({top: "100px"}, 1000);
移動(dòng)端hover事件
移動(dòng)端只能使用mouseenter和mouseleave來(lái)監(jiān)聽(tīng)移入和移出
iscroll框架
當(dāng)我們做移動(dòng)端側(cè)邊欄的時(shí)候, 自己實(shí)現(xiàn)可能會(huì)出現(xiàn)bug也可能比較麻煩,這時(shí)候可以用iscroll框架
github地址: https://github.com/cubiq/iscroll
實(shí)現(xiàn)步驟
按照框架的需要搭建一個(gè)三層的結(jié)構(gòu)
引入iscroll.js框架
創(chuàng)建一個(gè)IScroll對(duì)象, 把需要滾動(dòng)的容器給它
var myScroll = new IScroll('.test', { mouseWheel: true, // 開(kāi)啟鼠標(biāo)滾動(dòng)滾動(dòng) scrollbars: true // 開(kāi)啟滾動(dòng)條, 但是容器必須是定位的, 否則滾動(dòng)條的位置不對(duì) }); // 相關(guān)常用的回調(diào)函數(shù) myScroll.on("beforeScrollStart", function () { console.log("手指觸摸, 還沒(méi)有開(kāi)始滾動(dòng)"); }); myScroll.on("scrollStart", function () { console.log("開(kāi)始滾動(dòng)"); }); myScroll.on("scrollEnd", function () { console.log("結(jié)束滾動(dòng)"); });
swiper框架
Swiper是純javascript打造的滑動(dòng)特效插件,面向手機(jī)、平板電腦等移動(dòng)終端。
Swiper能實(shí)現(xiàn)觸屏焦點(diǎn)圖、觸屏Tab切換、觸屏多圖切換等常用效果。
Swiper開(kāi)源、免費(fèi)、穩(wěn)定、使用簡(jiǎn)單、功能強(qiáng)大,是架構(gòu)移動(dòng)終端網(wǎng)站的重要選擇!
如何使用:
引入對(duì)應(yīng)的css和js文件
按照框架的需求搭建三層結(jié)構(gòu)
創(chuàng)建一個(gè)Swiper對(duì)象, 將容器元素傳遞給它,第二個(gè)參數(shù)接收一個(gè)對(duì)象
<div> <ul> <li>slider1</li> <li>slider2</li> <li>slider3</li> </ul> </div> <script> var mySwiper = new Swiper('.test',{ loop: true, autoplay: true, // 如果需要分頁(yè)器 pagination: { el: '.swiper-pagination', }, // 如果需要前進(jìn)后退按鈕 navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev', }, // 如果需要滾動(dòng)條 scrollbar: { el: '.swiper-scrollbar', },); </script>
推薦教程:《JS教程》