摘要:在基本信息通過幻燈效果顯示商品的大圖,通過手指的滑動來控制幻燈的顯示。在本設計中借鑒了各大主流電商平臺的主流做法,即在無效滑動情況下降低幻燈的滑動速度讓用戶知道已近無法移動了。
移動端人機交互方式同PC端發生了本質的變化,在PC端使用鼠標和鍵盤進行交互,而移動端使用的是手指的觸摸和滑動。PC端開發時主要監聽鼠標事件,例如mouseEnter(鼠標進入事件)、mouseMove(鼠標移動事件)、mouseLeave(鼠標離開事件)。而在移動端監聽事件為觸摸的開始事件,觸摸移動事件,以及觸摸的結束事件。在本設計中商品詳情頁通過選項卡來達到切換顯示基本信息、商品細節信息以及評論信息。在基本信息通過幻燈效果顯示商品的大圖,通過手指的滑動來控制幻燈的顯示。移動端手勢操作效果圖:
實現的方法是監聽手勢的開始事件,記錄手指在屏幕上的起始位置。監聽手勢的移動事件,獲取移動中手指的坐標,并將移動的手指坐標減去起始位置的坐標得到手指移動的距離。然后實時地去改變幻燈片的transform的值來達到幻燈移動的效果。最后需要監聽手勢的結束事件,在該事件的處理函數中得到手指最后的位置,同樣使用最后的位置減去手指的起始位置得到最終手指移動的距離,判斷手指最終的移動距離是否大于滑動的臨界值,本設計在此處設置臨界值為100px,如果大于臨界值則切換幻燈片,否則不進行切換。
在切換中特殊情況是幻燈處于第一張并向左滑動,以及最后一張并向右滑動,這兩種操作都是無效的因為第一張幻燈左側以及第二張幻燈右側都是沒有圖片的。如何友好的告訴用戶已近滑動到了第一張或者最后一張是提升用戶體驗的關鍵。在本設計中借鑒了各大主流電商平臺的主流做法,即在無效滑動情況下降低幻燈的滑動速度讓用戶知道已近無法移動了。這種做法既保持了操作上的一致性,因為沒有直接不響應用戶的操作,又清楚明白的告訴了用戶已經滑動到了盡頭。
在PC端的開發過程中,使用絕對定位改變top與left的值來實現元素的移動。在第一次嘗試使用絕對定位來實現,當手指滑動時改變元素的top值與left值,此時出現了元素左右抖動的情況。因為移動端都很好的支持了CSS3與HTML5,所以在移動端開發過程中可以放心地使用CSS3中transform樣式,其樣式值有translate3d(三個方向的移動)、transformX(橫向的移動)、transformY(縱向的移動)、scale(2d縮放轉換)、rotate(定義2d的旋轉)等等。這里使用translate3d來改變元素位置。transform與絕對定位在表現上的不同是由于瀏覽器在樣式改變時會觸發重構與重繪,在改變絕對定位的left與top值是首先觸發了重構接著觸發重繪,而通過transform只觸發了瀏覽器的重繪。從而使用transform提高了瀏覽器的處理效率,擁有更好的性能。在實際表現中transform也能夠非常完美解決問題。
HTML結構為:
div.piclist-outer div.piclist-inner each singleBig in gmainImgs img(src="#{singleBig}" alt="slide img") div.piclist-signal-wrapper ul.piclist-signal each singleBig in gmainImgs li
因為使用的是Jade,所以為上邊的格式。最外層的div是整個滑動區域,類名為.piclist-inner的div包裹著若干個圖片,這些圖片水平并列。類名為.piclist-signal-wrapper包裹的是當前顯示是第幾個圖片的標志。
下面再來看具體js代碼:
// @begin finger js var slidewrap=document.getElementsByClassName("piclist-outer")[0] var slideInner= document . getElementsByClassName("piclist-inner")[0] var page=0 var distanceX=0 var transX=0 var listUl=document.getElementsByClassName("piclist-signal")[0].getElementsByTagName("li") var listUlLen=listUl.length //觸摸的開始事件的處理函數 function handlestart (e) { if(e.touches.length!==1){ return } //獲取觸摸時的橫縱坐標 startX=e.touches[0].pageX startY=e.touches[0].pageY slidewrap.addEventListener("touchmove",handlemove,false) // console.log("sx is: "+ startX+"sy is : " + startY) } //觸摸的移動事件處理函數 function handlemove (e) { transX = - page * screenWidth // console.log("page:"+(-page * screenWidth)) slideInner.style.transform="translate3d("+transX+"px,0,0)" var touches=e.touches if (touches&&touches.length) { distanceX=startX-touches[0].pageX // console.log("distanceX :"+distanceX) // console.log("handlemove"+transX) //如果當前是第一張幻燈或者最后一張幻燈,則讓滑動速度降為原來的三分之一,已到達提示用戶已不可滑動。 if ((page == 0 && distanceX < 0) || (page == (listUlLen - 1) && distanceX > 0)) { distanceX=distanceX / 3 } //通過改變transform屬性值來達到移動的效果 var transX=-distanceX-page * screenWidth slideInner.style.transform="translate3d("+transX+"px,0,0)" } e.preventDefault() } //觸摸的結束事件處理函數 function handleend(argument) { transX=- page * screenWidth - distanceX var move_time =1 var move_dis=8 // console.log("move end") //如果是第一張幻燈并向左滑動或者最后一張幻燈向右滑動的情況下,在滑動結束時顯示原先的幻燈不發生改變 if ((page == 0 && distanceX < 0) || (page == (listUlLen - 1) && distanceX > 0)) { transX=- page * screenWidth slideInner.style.transform="translate3d("+transX+"px,0,0)" return } //如果滑動的距離大于100px,則向右切換幻燈片 if (distanceX>=100) { listUl[page].style.background="#e0e0e0" page++ listUl[page].style.background="#c40000" //通過定時器實現滑動的動畫效果 var timer=setInterval(function () { slideInner.style.transform="translate3d("+transX+"px,0,0)" transX-=move_dis // console.log("transX:"+transX) // console.log("page:"+-page*(screenWidth + 1)) if (transX <= -page * (screenWidth + 1)) { clearInterval(timer) } },move_time) } //如果滑動距離小于100px,則向左切換幻燈片 else if (distanceX<=-100) { listUl[page].style.background="#e0e0e0" page-- listUl[page].style.background="#c40000" var timer=setInterval(function () { slideInner.style.transform="translate3d("+transX+"px,0,0)" transX+=move_dis // console.log("transX:"+transX) // console.log("page:"+-page*(screenWidth + 1)) if (transX >= -page * (screenWidth + 1)) { clearInterval(timer) } },move_time) } //如果滑動的距離沒有達到臨界的距離則不切換 else{ transX=- page * screenWidth slideInner.style.transform="translate3d("+transX+"px,0,0)" } }
查看完整項目可以去我的GitHub,歡迎大家的下載、提問和關注哈。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/84006.html
摘要:在基本信息通過幻燈效果顯示商品的大圖,通過手指的滑動來控制幻燈的顯示。在本設計中借鑒了各大主流電商平臺的主流做法,即在無效滑動情況下降低幻燈的滑動速度讓用戶知道已近無法移動了。 移動端人機交互方式同PC端發生了本質的變化,在PC端使用鼠標和鍵盤進行交互,而移動端使用的是手指的觸摸和滑動。PC端開發時主要監聽鼠標事件,例如mouseEnter(鼠標進入事件)、mouseMove(鼠標移動...
摘要:在移動端的商品詳情頁涉及多個內容切換的問題,這里使用選項卡設計方式,使用選項卡的設計是各大主流電商平臺所采用主要形式,例如淘寶和京東。然后構造第二個函數,根據傳入的現在選項卡的和要顯示選項卡的,在條件語句中執行相應的滑動函數。 在移動端的商品詳情頁涉及多個內容切換的問題,這里使用選項卡設計方式,使用選項卡的設計是各大主流電商平臺所采用主要形式,例如淘寶和京東。簡單的選項卡實現起來比較容...
摘要:在移動端的商品詳情頁涉及多個內容切換的問題,這里使用選項卡設計方式,使用選項卡的設計是各大主流電商平臺所采用主要形式,例如淘寶和京東。然后構造第二個函數,根據傳入的現在選項卡的和要顯示選項卡的,在條件語句中執行相應的滑動函數。 在移動端的商品詳情頁涉及多個內容切換的問題,這里使用選項卡設計方式,使用選項卡的設計是各大主流電商平臺所采用主要形式,例如淘寶和京東。簡單的選項卡實現起來比較容...
摘要:在移動端的商品詳情頁涉及多個內容切換的問題,這里使用選項卡設計方式,使用選項卡的設計是各大主流電商平臺所采用主要形式,例如淘寶和京東。然后構造第二個函數,根據傳入的現在選項卡的和要顯示選項卡的,在條件語句中執行相應的滑動函數。 在移動端的商品詳情頁涉及多個內容切換的問題,這里使用選項卡設計方式,使用選項卡的設計是各大主流電商平臺所采用主要形式,例如淘寶和京東。簡單的選項卡實現起來比較容...
摘要:值得注意的是和方法,前者是顯示上一個視圖,后者則是顯示后一個視圖。最后還要記住,返回值要改為,否則觸摸事件是無法響應的。前面兩個參數分別表示手指按下和松開時的事件,通過它們的對象去調用方法就可以獲取滑動前后的坐標了。 大家都使用過ViewPager,但是ViewPager還有一個兄弟,那就是ViewFlipper。兩者的名字非常相似,我們可以將ViewPager理解成一頁一頁的視圖,V...
閱讀 2880·2021-11-22 13:54
閱讀 3533·2021-11-16 11:44
閱讀 1374·2021-09-07 10:19
閱讀 1475·2019-08-29 17:30
閱讀 3202·2019-08-29 11:33
閱讀 3548·2019-08-26 12:18
閱讀 2892·2019-08-26 11:53
閱讀 1341·2019-08-26 10:47