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瀏覽器的支持,能力監測來實現不同移動設備支持。
二,搭建全屏切換動畫
未完