初入前端,分享一下手機上觸控版輪播器的實作過程,大致功能如下:
支援循環滑動
- #寬度可任意設置,不需要與螢幕等寬
- 頁面可縱向捲動
- 可設定回呼監聽元素的切換
-
的#假設子元素
.item width - 為375px,使用絕對定位將所有子元素放在父元素內
設定為375px,與子元素將父元素
.carousel的
width .item - 寬度相同
,為父元素
.carousel#添加觸摸事件:
touchstart,
touchmove touchend -
手指按下時,儲存初始位置( clientX - )
- ##手指向左滑動,則同時移動目前元素和目前元素右邊的元素
- 手指向右滑動,則同時移動目前元素和目前元素左邊的元素
- 手指抬起時,透過滑動距離判斷是否切換到下一頁
- 移動距離未超過子元素寬度的50%,將目前頁面回滾到初始位置,不切換目前元素。
- 移動距離超過子元素寬度的50%,切換目前元素為下一個元素。
-
z-index將目前元素的
transform
屬性設為translate3d(0px, 0px, 0px)
,並將 屬性+1 -
z-index將下一個子元素的
transform
屬性設為translate3d(375px, 0px, 0px)
,並將 屬性+1 -
z-index將上一個子元素的
transform
屬性設為translate3d(-375px, 0px, 0px)
,並將 屬性+1 -
z-index#將其他所有子元素的
屬性設為預設值 - 第一個子元素的上一個元素是最後一個元素,最後一個元素的下一個元素是第一個元素,該步驟透過循環鍊錶實現。
- 手指滑動時,透過滑動距離判斷滑動的方向:
.carousel
移動時設定的是子元素.item的transform屬性,而不是父元素
實現步驟
html&css
//html <p class="carousel" ontouchstart="" > <p class="item" style="background: #3b76c0" > <h3 id="item">item-1</h3> </p> <p class="item" style="background: #58c03b;"> <h3 id="item">item-2</h3> </p> <p class="item" style="background: #c03b25;"> <h3 id="item">item-3</h3> </p> <p class="item" style="background: #e0a718;"> <h3 id="item">item-4</h3> </p> <p class="item" style="background: #c03eac;"> <h3 id="item">item-5</h3> </p> </p> //css .carousel{ height: 50%; position: relative; overflow: hidden; } .item { position: absolute; left: 0; top: 0; width: 100%; height: 100%; }
js
設定初始狀態
首先實作一個雙向鍊錶,用於維護輪播元件中的元素。
function Node(data) { this.data = data; this.prev = null; this.next = null; this.index = -1; } //双向循环列表 function LinkList() { var _nodes = []; this.head = null; this.last = null; if (typeof this.append !== "function") { LinkList.prototype.append = function (node) { if (this.head == null) { this.head = node; this.last = this.head; } else { this.head.prev = node; this.last.next = node; node.prev = this.last; node.next = this.head; this.last = node; } node.index = _nodes.length; //务必在push前设置node.index _nodes.push(node); } } }
有了鍊錶之後,建立一個鍊錶實例,將子元素加入進鍊錶內,並設定一些初始狀態
var _container = document.querySelector("." + containerClass); var _items = document.querySelectorAll("." + itemClass); var list = loop ? new LinkList() : new SingleList(); for(var i = 0; i < _items.length; i++) { list.append(new Node(_items[i])); } var _prev = null; //保存之前显示的元素 var _current = list.head; //保存当前显示的元素,默认为第一个元素 var _normalZIndex = _current.data.style.zIndex; //未显示元素的z-index值 var _activeZIndex = _normalZIndex + 1; //当前显示元素的z-index值 var _itemWidth = _current.data.offsetWidth; //子元素宽度 positionItems(); //初始化元素位置 zindexItems(_current, _activeZIndex); //将当前元素及其左右元素的z-index加1
綁定觸控事件
touchstart事件
手指按下時,儲存初始位置
_container.addEventListener("touchstart", function(e) { // e.preventDefault();//取消此行代码的注释会在该元素内阻止页面纵向滚动 var touch = e.touches[0]; startX = touch.clientX; //保存手指按下时的位置 startY = touch.clientY; _container.style.webkitTransition = ""; //取消动画效果 startT = new Date().getTime(); //记录手指按下的开始时间 isMove = false; transitionItems(_prev, false); //取消之前元素的过渡 transitionItems(_current, false); //取消当前元素的过渡 }, false);
touchmove事件
#手指在螢幕上滑動,頁面跟隨手指移動
_container.addEventListener("touchmove", function(e) { // e.preventDefault();//取消此行代码的注释会在该元素内阻止页面纵向滚动 var touch = e.touches[0]; var deltaX = touch.clientX - startX; //计算手指在X方向滑动的距离 var deltaY = touch.clientY - startY; //计算手指在Y方向滑动的距离 //如果X方向上的位移大于Y方向,则认为是左右滑动 if (Math.abs(deltaX) > Math.abs(deltaY)){ translate = deltaX > _itemWidth ? _itemWidth : deltaX; translate = deltaX < -_itemWidth ? -_itemWidth : deltaX; //同时移动当前元素及其左右元素 moveItems(translate); isMove = true; } }, false);
touchend事件
手指離開螢幕時,計算最終需要停留在哪一頁
_container.addEventListener("touchend",function(e) { // e.preventDefault();//取消此行代码的注释会在该元素内阻止页面纵向滚动 //是否会滚 var isRollback = false; //计算手指在屏幕上停留的时间 var deltaT = new Date().getTime() - startT; if (isMove) { //发生了左右滑动 //如果停留时间小于300ms,则认为是快速滑动,无论滑动距离是多少,都停留到下一页 if(deltaT < 300){ translate = translate < 0 ? -_itemWidth : _itemWidth; }else { //如果滑动距离小于屏幕的50%,则退回到上一页 if (Math.abs(translate) / _itemWidth < 0.5){ isRollback = true; }else{ //如果滑动距离大于屏幕的50%,则滑动到下一页 translate = translate < 0 ? -_itemWidth : _itemWidth; } } moveTo(translate, isRollback); } }, false);
Carousel庫為了方便使用,我將整個實現過程封裝成了一個庫,並添加了
prev()
,
方法,使用非常簡單:
<script src="lib/carousel.js"></script> CreateCarousel("carousel", "item", true) .bindTouchEvent() .setItemChangedHandler(onPageChanged); //参数"carousel"为容器的类名 //参数"item"为子元素的类名 //第三个参数设置是否需要循环播放,true为循环播放
該函式庫可到github下載
參考
H5單頁手勢滑幕切換原理
good night!
免費h5線上影片教學HTML5 完整版手冊php.cn原始html5影片教學#######以上是利用H5實作一個輪播器(觸控版)的實例教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

H5代碼的最佳實踐包括:1.使用正確的DOCTYPE聲明和字符編碼;2.採用語義化標籤;3.減少HTTP請求;4.使用異步加載;5.優化圖像。這些實踐能提升網頁的效率、可維護性和用戶體驗。

Web标准和技术从HTML4、CSS2和简单的JavaScript演变至今,经历了显著的发展。1)HTML5引入了Canvas、WebStorage等API,增强了Web应用的复杂性和互动性。2)CSS3增加了动画和过渡功能,使页面效果更加丰富。3)JavaScript通过Node.js和ES6的现代化语法,如箭头函数和类,提升了开发效率和代码可读性,这些变化推动了Web应用的性能优化和最佳实践的发展。

H5不僅僅是HTML5的簡稱,它代表了一個更廣泛的現代網頁開發技術生態:1.H5包括HTML5、CSS3、JavaScript及相關API和技術;2.它提供更豐富、互動、流暢的用戶體驗,能在多設備上無縫運行;3.使用H5技術棧可以創建響應式網頁和復雜交互功能。

H5與HTML5指的是同一個東西,即HTML5。 HTML5是HTML的第五個版本,帶來了語義化標籤、多媒體支持、畫布與圖形、離線存儲與本地存儲等新功能,提升了網頁的表現力和交互性。

H5referstoHTML5,apivotaltechnologyinwebdevelopment.1)HTML5introducesnewelementsandAPIsforrich,dynamicwebapplications.2)Itsupportsmultimediawithoutplugins,enhancinguserexperienceacrossdevices.3)SemanticelementsimprovecontentstructureandSEO.4)H5'srespo

H5開發需要掌握的工具和框架包括Vue.js、React和Webpack。 1.Vue.js適用於構建用戶界面,支持組件化開發。 2.React通過虛擬DOM優化頁面渲染,適合複雜應用。 3.Webpack用於模塊打包,優化資源加載。

HTML5hassignificantlytransformedwebdevelopmentbyintroducingsemanticelements,enhancingmultimediasupport,andimprovingperformance.1)ItmadewebsitesmoreaccessibleandSEO-friendlywithsemanticelementslike,,and.2)HTML5introducednativeandtags,eliminatingthenee

H5通過語義化元素和ARIA屬性提升網頁的可訪問性和SEO效果。 1.使用、、等元素組織內容結構,提高SEO。 2.ARIA屬性如aria-label增強可訪問性,輔助技術用戶可順利使用網頁。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器