swiper.js-全屏效果實現
來自: http://my.oschina.net/u/2352644/blog/614984
針對swiper.js的全屏動畫切換,我們已經簡單分析和介紹過一次:
http://my.oschina.net/u/2352644/blog/487902 這個里面非常簡單的分析了如何加入我們的動畫效果,swiper現在已經出現了3.0版本,我們這里就是使用swiper3.0去開發我們的更貼近真實的項目。
下載swiper3.0 http://www.swiper.com.cn/download/index.html 推薦下載演示包,這樣我們可以充分了解swiper都可以實現什么!
一,原理簡單分析
1.加入動畫
上一個博客只是分析了在active類名下加入我們的動畫樣式就可完成我們的效果呈現,這里我們二次的分析其中的更多知識,了解別人的原理我們在構建類似效果就可以自己動手了。
首先打開demo文件下,預覽這個html頁面,和復制此html頁面:
然后打開dist文件夾,把這個html重新命名自己喜歡的名稱,我的是demo2
demo2.html就是我們的實戰頁面,我們打開頁面,把css和js的引入路徑從全局改為dist下的css和js上:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>demo2</title> <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1"> <!-- Link Swiper's CSS --> <link rel="stylesheet" href="css/swiper.min.css"> <!-- Demo styles --> <style> html, body { position: relative; height: 100%; } body { background: #eee; font-family: Helvetica Neue, Helvetica, Arial, sans-serif; font-size: 14px; color:#000; margin: 0; padding: 0; } .swiper-container { width: 100%; height: 100%; } .swiper-slide { text-align: center; font-size: 18px; background: #fff; /* Center slide text vertically */ display: -webkit-box; display: -ms-flexbox; display: -webkit-flex; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; -webkit-justify-content: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; -webkit-align-items: center; align-items: center; } </style> </head> <body> <!-- Swiper --> <div> <div id="aa"> <div>Slide 1</div> <div>Slide 2</div> <div>Slide 3</div> <div>Slide 4</div> <div>Slide 5</div> <div>Slide 6</div> <div>Slide 7</div> <div>Slide 8</div> <div>Slide 9</div> <div>Slide 10</div> </div> <!-- Add Pagination --> <div></div> </div> <!-- Swiper JS --> <script src="js/swiper.min.js"></script> <!-- Initialize Swiper --> <script> var swiper = new Swiper('.swiper-container', { pagination: '.swiper-pagination', paginationClickable: true, direction: 'vertical' }); </script> </body> </html>
我們預覽測試,pc就可以查看,保證沒有任何問題,我們firebug查看是不是當前所在位置有active的類名:
2.顯示切換
同上次分析結果吻合,3.0同樣是這個加入動畫原理,我們進一步分析每次滑動是如何顯示當前div(這一屏內容)的:
我們利用firebug進一步分析:
分別切換到1 2 3屏我們發現在父容器.swiper-wrapper 上改變的是transform: translate3d(0px, -618px, 0px);的屬性值,
變化3d效果中移動處理y軸在發上變化,從0到-309到-618,我們試想一下這個原理方式:
上面是初始狀態,默認變化3d的位移y軸值是0。
當我們向下切換時,y軸值就會變成-1*一屏高度,這樣就利用變化移動顯示了第二屏:
其實做過tab切換的就知道這個切換原理,不過以前是利用定位處理去改變left或者top的值實現切換,這里使用的是css3變換位移處理,我們把最外層父容器定好寬高和設置超出隱藏,那么就可以去切換我們的顯示內容了,我們firebug這個.swiper-container可以查看是不是有超出隱藏。
3.方向判斷
我們預覽頁面,從按下到抬起,會識別出我們是向上或者向下,然后去切換我們的顯示內容,
我們事件觸發的過程就是
1.按下
2.移動/沒有移動
3.抬起
我們針對這三個事件可以分別獲取event的pagex和pagey,我們根據抬起的x和y與按下的x與y去比較就可分析出操作方向:
我們針對抬起和按下的坐標,構造三角形可以去分析出移動的方位:
我們算數x1 x2的差值取整和y1 y2差值取整,如果x的差值/y差值大于1說明方向不是左就是右,當然跟具體的分析我們可以去具體研究。
4.彈性下拉分析
我們在第一屏,向下拖拽:
這個效果我們在app里面非常常見,在app就會刷新頁面,這里只是單純的彈動!
這個實現和我們的切換類似,也是改變3d變化位移處理y值,不過這個y值不是在根據屏幕高度就處理,而是帶有極限和時時改變的。
1.當前是第一屏(辦法很多,比如一個全局變量,根據y值改變而變化)
2.記住mousedown事件event的pagey
3.在mousemove中不斷獲取event的pagey和down的pagey做差值,然后復制到3d變換位移出的y上
4.設置一個極限值比如100,差值和100比較如果大于100了3d位移y一直賦值為100。
5.全屏css樣式
這個說的話太繞了,我們一張圖表示:
綠色代表瀏覽器窗口,也就是window
黃色就是html標簽,我們寬度設置為100%就等于窗口寬度,高度設置為100%就是窗口高度
橘黃色是body標簽,這個同html的設置,都設置為100%,寬高等于了窗口寬高
藍色就是我們作于切換容器的div,在寬高100%等于窗口基礎上,設置超出隱藏,首先保證了滾動條的不出現,然后里面的元素在這個div預覽時,這個div就起到了窗戶的作用,我們改變窗戶里面內容位置就可以看到不同的內容了。
使用百分比設置寬高是全局切換的方法。
6.pc和移動端的事件
我們上面一直說到,切換的觸發是在mousedown move up組合事件中產生的,在手機登移動設備上,dom提供了移動設備的一套處理,
touchstat對應mousedown
touchmove對應mousemove
touchend對應mouseup
我們針對蘋果和安卓系統這種兼容處理是沒有問題的,不過在wp8上,也就是微軟手機是不被支持的,要用另一套事件做兼容處理,我們查看swiper.js源碼,看這個位置:
pointer和mspointer是對ie瀏覽器的支持,能力監測來實現不同移動設備支持。
二,搭建全屏切換動畫
未完