国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - 通過滑動翻頁效果實現和移動端click事件問題

通過滑動翻頁效果實現和移動端click事件問題

2022-01-07 17:14行舟客 js教程

這篇文章主要介紹了滑動翻頁效果實現和移動端click事件問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前述

本文很短~
主要是為了總結和講述移動端click和js事件機制導致的一個問題。
(:咳咳,其實幾句話就能寫完的還要水一篇文章,不愧是我…


正文

最近做了一個小活動,里面要用到一個效果:滑動翻頁。大概是這樣的:

通過滑動翻頁效果實現和移動端click事件問題

<!-- HTML代碼 -->
<div class="page-container">
	<div class="page" style="background: #dc3b26">1</div>
	<div class="page" style="background: #f3b03d">2</div>
	<div class="page" style="background: #44a2f8">3</div>
</div>

在css中,首先因為是滑動翻頁,所以我們要保證“始終只有一屏”,這個可以放在全局樣式表里控制,然后是其中的“每一頁”都要占滿父元素 ―― 這里其實用了“div是塊元素,無外力情況下豎直排列”的特性。

/** css樣式 */
html,
body{
	margin: 0;
	padding: 0;
	width: 100%;
	height: 100vh;
	overflow: hidden;
	font-size: 60px;
}
.page-container{
	width: 100%;
	height: 100%;
}
.page-container .page{
	width: 100%;
	height: 100%;
}

其JS實現也很簡單:因為在移動端,所以使用了touchstarttouchmovetouchend事件來實現手勢滑動功能:

  • start(剛按下)時記錄此時的手指位置――作為初始值;
  • 在move(觸摸滑動)時根據實時的手指位置和初始手指位置變量實現要求判斷,在本文場景為代表的場景下這一步一般還要求出“移動距離”實時賦值;
  • 在end(手指離開)時(也有直接在move時進行的)進行收尾工作――比如:圖片滑動完全劃過去、元素跑到結束位置、將事件監聽取消;
// 這里是控制全局js的文件
// 全局阻止瀏覽器默認行為
document.addEventListener("touchstart",function(e){
	if(e.cancelable){
		e.preventDefault();
	}
},{passive: false})
// {passive: false}就是告訴前面可能有需要重置行為的代碼
document.addEventListener("touchmove",function(e){
	if(e.cancelable){
		e.preventDefault();
	}
},{passive: false})
// JavaScript代碼
let curPageIndex=0;
let pageContainer=document.querySelector(".page-container");
let pageNumber=pageContainer.children.length;  //頁面的數量
// 文檔的視窗高度(這里就是一屏的高度)
let cHeight=document.documentElement.clientHeight;
// 設置頁面容器的margin-top為合適的值,讓其顯示在視野中
function toPage(){
	pageContainer.style.transition="all .5s ease";
	pageContainer.style.marginTop=-curPageIndex*cHeight+"px";
	
	// 變化完成后去掉過渡效果 !
	pageContainer.addEventListener("transitionend",function(){
		pageContainer.style.transition="none";
	},{once:true})
}
toPage()

pageContainer.ontouchstart=function(e){
	let y=e.changedTouches[0].clientY;  //手指按下的縱坐標
	pageContainer.ontouchmove=function(e){
		let dis=e.changedTouches[0].clientY-y;  //計算距離
		// 計算page-container的margin-top
		let mtop=-curPageIndex*cHeight+dis
		if(mtop>0){
			mtop=0;
		}else if(mtop<-(pageNumber-1)*cHeight){
			mtop=-(pageNumber-1)*cHeight;
		}
		// 實時改變位置
		pageContainer.style.marginTop=mtop+"px";
	}
	pageContainer.ontouchend=function(e){
		let dis=e.changedTouches[0].clientY-y;
		// 如果滑動距離實在太短,就回到滑動前的位置狀態
		if(Math.abs(dis)<=60){
			toPage()
		}else if(dis>0 && curPageIndex>0){
			curPageIndex--;
			toPage()
		}else if(dis<0 && curPageIndex<pageNumber-1){
			curPageIndex++;
			toPage()
		}
		
		// 手指離開后,取消監聽事件
		pageContainer.ontouchmove=null;
		pageContainer.ontouchend=null;
	}
}

至此,功能上似乎很完美。但這時候,我們在第一個page里添加一個button:

<div class="page" style="background: #dc3b26">
	<button onclick="alert("哈哈哈")" class="but">click me!</button>
	1
</div>

然后到頁面上查看效果:

通過滑動翻頁效果實現和移動端click事件問題

無效!

這是因為在上方全局js文件里我們加了“阻止瀏覽器默認事件”的代碼。
――在移動端瀏覽器中,click事件和mousestart事件是同時被觸發的。因為移動端瀏覽器是沒有click事件的,它是由mouse事件模擬的! :也正是這個原因,才有了所謂的“移動端瀏覽器300ms延遲”的問題 1 。
――還有就是,在微信自帶的瀏覽器中,有一個“觸頂下拉回彈”的操作,這其實是不應該的。它也屬于瀏覽器默認事件。
所以一般我們需要禁止掉這些東西。

但是如上面所示,全部禁止掉總會造成一些困擾,怎么辦?
H5提供了“自定義屬性”,針對本文方法,我們完全可以 ―― 在全局事件里檢測當前觸發的元素有沒有某一個自定義屬性,如果有,就什么也不攔截;否則就執行禁止默認行為的代碼:
比如

<button data-default="true" onclick="alert("哈哈哈")" class="but">click me!</button>

將上面“控制全局js的文件”內容改為如下:

// 全局阻止瀏覽器默認行為
document.addEventListener("touchstart",function(e){
	if(e.target.dataset.default){
		return;
	}
	if(e.cancelable){
		e.preventDefault();
	}
},{passive: false})
document.addEventListener("touchmove",function(e){
	if(e.target.dataset.default){
		return;
	}
	if(e.cancelable){
		e.preventDefault();
	}
},{passive: false})

就OK了:

通過滑動翻頁效果實現和移動端click事件問題


其實還有另一種“解法”:既然上面說了,移動端click實際上是通過mouse事件模擬的,那么我們可以從mousestart事件入手;又因為button元素是“第一個頁面”內的(子)元素,所以可以用阻止事件冒泡

<!-- button就是普通的button -->
<button class="but">click me!</button>
document.querySelector(".but").addEventListener("touchstart",function(e){
	e.stopPropagation();
	alert("噶哈哈");
},false)

通過滑動翻頁效果實現和移動端click事件問題

關于捕獲和冒泡→

我們首先要知道的是:當我們鼠標按下一個按鈕時,并不是“點擊了一個按鈕”,而是在這個區域內,鼠標(上的按鍵)被按下,操作系統和瀏覽器把這個信息對應到了“按鈕”所在區域并觸發其邏輯。
事實上鼠標點擊并沒有位置信息,是操作系統一直在監聽鼠標移動,根據累積的位移計算出來的坐標,將其傳給瀏覽器。
那么,把這個坐標轉換為具體的元素上的事件的過程,就可稱作“捕獲”。那“冒泡”呢?這個不好解釋,但有一點想必你是明白的:當你按下電視開關時,你也按到了電視!
這就是很多文章會講到的“冒泡過程由內向外,捕獲過程由外向內”,或者說是“洋蔥模型”。
還有一點就是:事件addEventListener的第三個參數 true/false ,即為“是捕獲/冒泡”。(別多想,這只是瀏覽器提供的事件模型之一。無論是否監聽,在一個事件發生時,捕獲和冒泡總是先后發生的)

到此這篇關于滑動翻頁效果實現和移動端click事件問題的文章就介紹到這了,更多相關滑動翻頁效果內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_43624878/article/details/111923975

延伸 · 閱讀

精彩推薦
  • js教程JavaScript this關鍵字的深入詳解

    JavaScript this關鍵字的深入詳解

    這篇文章主要給大家介紹了關于JavaScript this關鍵字的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要...

    JAVA_樸先生9062021-12-31
  • js教程JS數組索引檢測中的數據類型問題詳解

    JS數組索引檢測中的數據類型問題詳解

    這篇文章主要給大家介紹了關于JS數組索引檢測中的數據類型問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考...

    行舟客11862021-12-29
  • js教程微信小程序之高德地圖多點路線規劃過程示例詳解

    微信小程序之高德地圖多點路線規劃過程示例詳解

    這篇文章主要介紹了微信小程序之高德地圖多點路線規劃過程示例詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的...

    heli步籬6582022-01-04
  • js教程js簡單粗暴的發布訂閱示例代碼

    js簡單粗暴的發布訂閱示例代碼

    這篇文章主要給大家介紹了js簡單粗暴的發布訂閱的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要...

    威威威威vvvv6272022-01-06
  • js教程uniapp微信小程序:key失效的解決方法

    uniapp微信小程序:key失效的解決方法

    這篇文章主要介紹了uniapp微信小程序:key失效的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    灬都是個謎10952022-01-05
  • js教程JavaScript實現滑塊驗證解鎖

    JavaScript實現滑塊驗證解鎖

    這篇文章主要為大家詳細介紹了JavaScript實現滑塊驗證解鎖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    努力的黑皮4722021-12-27
  • js教程使用 JavaScript 進行數據分組最優雅的方式

    使用 JavaScript 進行數據分組最優雅的方式

    對數據進行分組,是我們在開發中經常會遇到的需求,使用 JavaScript 進行數據分組的方式也有很多種,但是由于沒有原生方法的支持,我們自己實現的數據...

    code秘密花園4392021-12-27
  • js教程使用AutoJs實現微信搶紅包的代碼

    使用AutoJs實現微信搶紅包的代碼

    這篇文章主要介紹了使用AutoJs實現微信搶紅包的代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    王略5962021-12-23
主站蜘蛛池模板: 国产美女视频网站 | 99国产精品99久久久久久 | 日韩免费视频一区二区 | 欧美一级片在线观看 | 欧美日韩视频 | 日韩在线一区二区 | 亚洲午夜精品毛片成人播放器 | 在线观看亚洲a | 久久久久久久久久久久久国产 | 天天插狠狠插 | 91精品一区二区 | 国产成人久久一区二区三区 | 成年人免费在线观看视频网站 | 国产一区二区视频在线观看 | 一区二区视频免费 | 久久成人av | 久久人人爽人人爽人人片av不 | 久久精品夜夜夜夜夜久久 | 污视频网站在线观看 | 国精品一区二区三区 | 欧美日韩视频在线观看免费 | 成人免费网站 | 视频1区 | 亚洲一区二区三区高清 | 国产精品久久久久久久久久免费 | 久久天天躁狠狠躁夜夜躁2014 | 免费高清黄色 | 国产三级精品在线 | 日韩一二三 | 九九热在线视频观看这里只有精品 | 99国产精品99久久久久久 | 国产亚洲一区二区精品 | 久久人人爽爽爽人久久久 | 久久高清片 | 午夜精品久久久久 | 日韩美女一级片 | 午夜影院免费 | 在线看国产 | 狠狠爱天天操 | 免费黄色成人 | 亚洲精品久久久一区二区三区 |