国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

uniapp tab切換及tab錨點(diǎn)效果(兼容wx小程序及H5端)

這篇具有很好參考價(jià)值的文章主要介紹了uniapp tab切換及tab錨點(diǎn)效果(兼容wx小程序及H5端)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

tab切換錨點(diǎn)效果及滾動(dòng)時(shí)激活相應(yīng)的tab

效果如下
  1. H5端

H5端tab切換及tab錨點(diǎn)效果

  1. 小程序端

小程序端tab切換及tab錨點(diǎn)效果文章來源地址http://www.zghlxwxcb.cn/news/detail-768581.html

代碼實(shí)現(xiàn)-重要幾點(diǎn)
  1. 渲染頁面循環(huán)數(shù)組時(shí),每一個(gè)item都需要給不重復(fù)的id
//topicList后端返回的數(shù)據(jù)
<view :id="'a' + (i + 1)" v-for="(v,i) in topicList" :key="v.id">
  1. tab使用uviewUI庫實(shí)現(xiàn)的,list值里面每一個(gè)元素也需要給上id值。如[‘1-20’,‘21-40’,…],那么21-40給的是第21個(gè)item的id。
    這里也可以去動(dòng)態(tài)計(jì)算,如后端返回76條,一個(gè)tab數(shù)值間隔為20,那么76則是[‘1-20’,‘21-40’,‘41-60’,‘61-76’],注意數(shù)組的最后一個(gè),結(jié)尾是76而不是80
<template>
	<u-tabs :list="tabList" :current="currentTab" @change="changeTab" :bar-style="{'bottom':'6rpx'}"></u-tabs>
</template>

// 根據(jù)后端返回?cái)?shù)據(jù)總條數(shù)計(jì)算tab
getTopicTab() {
	// this.topicList.length這是渲染數(shù)據(jù)總條數(shù),20是每個(gè)tab數(shù)值間隔值,cycleIndex則是針對數(shù)據(jù)總條數(shù)一共有幾個(gè)tab
	let cycleIndex = Math.ceil(this.topicList.length / 20); // 向上取整6.01 -> 7
	let tabArr = [];
	for(let i = 1; i <= cycleIndex; i++) {
		tabArr.push({
			value: 20 * i,
			name: ((20 * (i - 1)) + 1) + '-' + (i == cycleIndex ? this.topicList.length : (20 * i)),
			id: '#a' + ((20 * (i - 1)) + 1)
		});
	};
	this.tabList = tabArr;
},
  1. 監(jiān)聽頁面滾動(dòng)周期onPageScroll,針對滾動(dòng)時(shí),該激活哪個(gè)tab。
  2. 接下來就是一些dom元素高度計(jì)算,使用uni.createSelectorQuery()獲取JQ對象,然后使用select(id/class名).boundingClientRect獲取當(dāng)前id的item距離頂部的top值;根據(jù)頂部基準(zhǔn)的top值和item的top值,之間的差值,通過uni.pageScrollTo滾動(dòng)頁面
  3. 計(jì)算高度值時(shí),需要注意,頂部是否有其他dom元素,有也需要將該dom元素高度,考慮在內(nèi)
    uniapp tab,JavaScript,Uniapp,uni-app,小程序
實(shí)現(xiàn)思路
  1. 進(jìn)入頁面時(shí),循環(huán)渲染數(shù)據(jù)之后,獲取每個(gè)tab對應(yīng)item距離頂部的距離,用數(shù)組distanceArr存起來(后面會(huì)用到)。這個(gè)頂部以誰基準(zhǔn)呢,以頁面中最外層的view為基準(zhǔn)。如上圖,(H5端)最外層dom元素的class名為page-content(后面計(jì)算高度會(huì)用到),(wx小程序端)最外層dom元素的class名為page-risk
  2. 根據(jù)后端返回?cái)?shù)據(jù)總條數(shù),渲染數(shù)據(jù),給每個(gè)item賦值不同的id。如上述 代碼實(shí)現(xiàn) 的第1點(diǎn)
  3. 根據(jù)后端返回?cái)?shù)據(jù)總條數(shù),動(dòng)態(tài)計(jì)算tab,渲染this.tabList。如上訴 代碼實(shí)現(xiàn) 的第2點(diǎn)
  4. 點(diǎn)擊tab,錨點(diǎn)到相應(yīng)位置。在點(diǎn)擊時(shí)拿到被點(diǎn)擊item的index,this.tabList[index]這樣就拿到了,當(dāng)前被點(diǎn)擊tab的數(shù)據(jù)(value,name,id)。計(jì)算dom高度:1).先獲取頂部基準(zhǔn)的top值,uni.createSelectorQuery().select(‘.page-risk’).boundingClientRect(data => { data.top });2).然后根據(jù)被點(diǎn)擊tab的id,獲取top值,然后根據(jù)差值,通過uni.pageScrollTo滾動(dòng)頁面到目標(biāo)位置。(注意這里需要注意 代碼實(shí)現(xiàn) 的第5點(diǎn),頂部是否有其他dom元素,它們高度也需要計(jì)算在內(nèi),這里稱為**偏移量**)
  5. 監(jiān)聽頁面滾動(dòng)周期onPageScroll事件,根據(jù)頁面滾動(dòng)激活相應(yīng)的tab。這里使用到了第1點(diǎn)提到的數(shù)組distanceArr
全部代碼
export default {
	data() {
		tabList: [], // 切題tab集合
		topicList: [], // 題庫集合
		distanceArr: [], // 每道題ID對應(yīng)的top值
		isTabChange: false, // 防止在點(diǎn)擊tab的時(shí)候,頁面的滾動(dòng)導(dǎo)致重復(fù)計(jì)算、抖動(dòng)問題
	},
	// 監(jiān)聽頁面滾動(dòng)
	onPageScroll (event) {
	    if (this.isTabChange) {
			return
	    };
	    const { scrollTop } = event;
	    // 偏移量,由于吸頂?shù)膖ab、頭部的顯示信息也有高度,素以做了偏移量
	    // (這里是代碼實(shí)現(xiàn)第5點(diǎn)及實(shí)現(xiàn)思路第4點(diǎn)提到的偏移量)
	    const skewY = 103;
	    if (scrollTop >= skewY) {
	        this.$nextTick(() => {
	        	// distanceArr-進(jìn)入頁面時(shí)第一時(shí)間獲取每個(gè)tab對應(yīng)item的top值集合
	            const length = this.distanceArr.length;
	            const index = this.distanceArr.findIndex(el => el - skewY - scrollTop > skewY);
	            // 當(dāng)index  == -1 的時(shí)候,實(shí)際當(dāng)前滾動(dòng)的距離超出了最大值,也就是在最后一個(gè)tab顯示的內(nèi)容
	            // 當(dāng)index > 0 的時(shí)候,說明能在當(dāng)前的scrollTop值找到,即index的前一位
	            // currentTab 0激活第一個(gè)切題tab  1第二個(gè)
	            this.currentTab = index > 0 ? index - 1 : length - 1;
	        })
	    }
	},
	methods: {
		// 獲取題庫
		getList() {
			this.topicList = []
		},
		// 根據(jù)this.topicList計(jì)算切題tab
		getTopicTab() {
			let cycleIndex = Math.ceil(this.topicList.length / 20); // 向上取整6.01 -> 7
			let tabArr = [];
			for(let i = 1; i <= cycleIndex; i++) {
				tabArr.push({
					value: 20 * i,
					name: ((20 * (i - 1)) + 1) + '-' + (i == cycleIndex ? this.topicList.length : (20 * i)),
					id: '#a' + ((20 * (i - 1)) + 1)
				});
			};
			this.tabList = tabArr;
		},
		// 獲取每個(gè)tab對應(yīng)item的top值集合('20-41'獲取第21個(gè)item的top值)
		getDistanceArr () {
			const _this = this;
			_this.$nextTick(() => {
				const query = uni.createSelectorQuery().in(_this);
				_this.tabList.map(el => {
					query.select(el.id).boundingClientRect(data => {
						// 獲取當(dāng)前ID距離頂部的top值
						if(!_this.distanceArr.includes(data.top)) {
							_this.distanceArr.push(data.top)
						}
					}).exec()
				})
			});
		},
		// 切題tab
		changeTab(index) {
			// 防止在點(diǎn)擊tab的時(shí)候,頁面的滾動(dòng)導(dǎo)致重復(fù)計(jì)算、抖動(dòng)問題
			// true時(shí)監(jiān)聽頁面滾動(dòng)生命周期代碼則不執(zhí)行
			this.isTabChange = true;
			this.currentTab = index;
			const _this = this;
			// this.$nextTick 保證當(dāng)前isTabChange 為true后執(zhí)行代碼
			// 避免在istabChange變?yōu)閠rue的時(shí)候,執(zhí)行代碼,監(jiān)聽事件還是會(huì)繼續(xù)執(zhí)行重新計(jì)算currenTab值
			_this.$nextTick(() => {
				const query = uni.createSelectorQuery().in(_this);
				let id = _this.tabList[index].id;
				let dataTop;
				query.select(id).boundingClientRect(data => {
					dataTop = data.top;
				}).exec();
				query.select('.page-risk').boundingClientRect(res => {
					const scrollTop = dataTop - res.top // 獲取差值
					const skewY = 103 // 偏移(頂部返回和切換題tab的高度及第一題magin/padding的和)
					// 頁面開始進(jìn)行滾動(dòng)到目標(biāo)位置
					uni.pageScrollTo({
						scrollTop: scrollTop > 0 ? scrollTop - skewY :  scrollTop + skewY,
						duration: 300,
						complete: function () {
							const timer = setTimeout(() => {
								_this.isTabChange = false // 關(guān)閉(放開對onPageScroll的限制)
								clearTimeout(timer)
							}, 500) // 解決ios和安卓、鴻蒙系統(tǒng)兼容性問題
						}
					});
				}).exec()
			})
		},
		// 這里業(yè)務(wù)是題庫,所以當(dāng)必填項(xiàng)沒有填寫時(shí),就會(huì)錨點(diǎn)到該位置
		// 前提是需要將必填項(xiàng)且沒有填寫的item的id值傳遞過來
		getPageScrollTo(id) {
			const _this = this;
			_this.$nextTick(() => {
				const query = uni.createSelectorQuery().in(_this);
				let index = '#a' + (id + 1);
				let dataTop;
				query.select(index).boundingClientRect(data => {
					dataTop = data.top;
				}).exec();
				query.select('.page-risk').boundingClientRect(res => {
					const scrollTop = dataTop - res.top; // 獲取差值
					const skewY = 103; // 偏移
					// 頁面開始進(jìn)行滾動(dòng)到目標(biāo)位置
					uni.pageScrollTo({
						scrollTop: scrollTop > 0 ? scrollTop - skewY :  scrollTop + skewY,
						duration: 300,
					});
				}).exec()
			})
		},
	}
}

到了這里,關(guān)于uniapp tab切換及tab錨點(diǎn)效果(兼容wx小程序及H5端)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 通過JavaScript、css、H5 實(shí)現(xiàn)簡單的tab欄的切換和復(fù)用

    通過JavaScript、css、H5 實(shí)現(xiàn)簡單的tab欄的切換和復(fù)用

    目錄 一、效果展示 二、實(shí)現(xiàn)的大致原理 三、H5的布局 四、CSS樣式 五、JS代碼內(nèi)容 六、完整代碼 1.我們先通過css 和h5布局得到最基本的tab欄樣式(有代碼參考) 2.在獲得樣式,給我們所需要點(diǎn)擊的目標(biāo)設(shè)置監(jiān)聽事件,在獲取節(jié)點(diǎn),設(shè)置一個(gè)自定義的節(jié)點(diǎn)屬性index,通過它在獲取

    2023年04月09日
    瀏覽(22)
  • 【微信小程序】實(shí)現(xiàn)頁面tab切換效果

    【微信小程序】實(shí)現(xiàn)頁面tab切換效果

    目錄 前言 本次效果展示 一、如何實(shí)現(xiàn)頁面tab 1.使用內(nèi)置組件scroll-view 2.實(shí)現(xiàn)點(diǎn)擊時(shí)出現(xiàn)的背景樣式 3.使用scroll-into-view,實(shí)現(xiàn)點(diǎn)擊時(shí)自動(dòng)滾動(dòng) 本次主要內(nèi)容是介紹頁面tab的開發(fā),如何實(shí)現(xiàn)tab與頁面內(nèi)容聯(lián)動(dòng)呢?關(guān)注我就知道! ? 如下圖所示,我們需要使用到紅色框框中的屬

    2024年02月09日
    瀏覽(505)
  • uniapp - 實(shí)現(xiàn)動(dòng)態(tài)且 “可重復(fù)“ 開啟與關(guān)閉動(dòng)畫,由 JS 點(diǎn)擊 / 長按等事件控制開啟 “某個(gè)元素“ 的 CSS 動(dòng)畫(類似常見的點(diǎn)贊動(dòng)畫效果可以一直重復(fù)觸發(fā)動(dòng)畫)兼容 H5 App 小程序

    uniapp - 實(shí)現(xiàn)動(dòng)態(tài)且 “可重復(fù)“ 開啟與關(guān)閉動(dòng)畫,由 JS 點(diǎn)擊 / 長按等事件控制開啟 “某個(gè)元素“ 的 CSS 動(dòng)畫(類似常見的點(diǎn)贊動(dòng)畫效果可以一直重復(fù)觸發(fā)動(dòng)畫)兼容 H5 App 小程序

    如果您是 Vue.js / Nuxt.js 等項(xiàng)目,請?jiān)L問 這篇文章。 本文實(shí)現(xiàn)了 uniapp 全端兼容,在函數(shù)內(nèi)用 JS 讓一個(gè)元素(DOM),“重復(fù)執(zhí)行” 寫好的 CSS 動(dòng)畫,類似點(diǎn)贊動(dòng)畫一樣, 你可以直接復(fù)制示例源碼,稍微改改(寫上你想要的動(dòng)畫,換個(gè)元素就行)就能應(yīng)用到您的項(xiàng)目中去, 如下圖

    2023年04月08日
    瀏覽(172)
  • uniapp小程序手寫tab導(dǎo)航欄切換(點(diǎn)擊切換樣式,動(dòng)態(tài)樣式綁定)

    uniapp小程序手寫tab導(dǎo)航欄切換(點(diǎn)擊切換樣式,動(dòng)態(tài)樣式綁定)

    最近寫uniapp,ui里面有一個(gè)導(dǎo)航欄切換的邏輯,因?yàn)橐鶸I保持一致,對于組件庫很難實(shí)現(xiàn)高度定制,所以這里就自己手寫實(shí)現(xiàn)一個(gè)點(diǎn)擊切換的導(dǎo)航欄。先看下圖效果: 主要實(shí)現(xiàn)的是通過點(diǎn)擊切換導(dǎo)航欄,并且樣式有一個(gè)切換的效果,大家可以根據(jù)自己的需求進(jìn)行樣式的DIY

    2024年02月12日
    瀏覽(23)
  • uniapp實(shí)現(xiàn)掃碼功能H5+APP+wx小程序

    1.首先uniapp初始化(需要引入 npm包 已經(jīng)初始化就忽略吧) 2.終端執(zhí)行(需要引入vue-qrcode-reader)//只適用于vue2版本 3 創(chuàng)建一個(gè)掃碼頁面(用于其他頁面往此頁面跳轉(zhuǎn)) 4.manifest.json配置H5 1.直接創(chuàng)建掃碼頁面(用于其他頁面往此頁面跳轉(zhuǎn)) wx小程序

    2024年02月13日
    瀏覽(83)
  • H5跳回小程序的wx.miniProgram.navigateTo不起效果,無法跳轉(zhuǎn)頁面,已解決

    H5跳回小程序的wx.miniProgram.navigateTo不起效果,無法跳轉(zhuǎn)頁面,已解決

    ?需求:H5中的點(diǎn)擊首頁按鈕跳回小程序的首頁,就寫了以下代碼 ? ?結(jié)果并沒有跳轉(zhuǎn)成功,但是alert成功,于是查找資料,換了各種api比如switchTab,redirectTo都不行,找了好多博主的帖子發(fā)現(xiàn)都不行,問題肯定出在url上面,于是改成下面這樣,就可以成功跳轉(zhuǎn)了,不得不說啊

    2024年02月11日
    瀏覽(27)
  • uniapp圖片上傳與壓縮,兼容小程序與H5

    圖片上傳借助了Uview2.0的組件 壓縮代碼

    2024年02月13日
    瀏覽(16)
  • uniapp h5 豎向的swiper內(nèi)嵌視頻實(shí)現(xiàn)抖音短視頻垂直切換,絲滑切換視頻效果,無限數(shù)據(jù)加載不卡頓

    uniapp h5 豎向的swiper內(nèi)嵌視頻實(shí)現(xiàn)抖音短視頻垂直切換,絲滑切換視頻效果,無限數(shù)據(jù)加載不卡頓

    一、項(xiàng)目背景 :實(shí)現(xiàn)仿抖音短視頻全屏視頻播放、點(diǎn)贊、評論、上下切換視頻、視頻播放暫停、分頁加載、上拉加載下一頁、下拉加載上一頁等功能。。。 二、前言 :博主一開始一直想實(shí)現(xiàn)類似抖音進(jìn)入頁面自動(dòng)播放當(dāng)前視頻,上下滑動(dòng)切換之后播放當(dāng)前視頻,但最后在

    2024年02月11日
    瀏覽(19)
  • uniapp 上傳壓縮圖片 兼容h5和小程序的方法

    項(xiàng)目是用uniapp開發(fā)的,當(dāng)時(shí)只是做App端,后來項(xiàng)目擴(kuò)展到H5端, uniapp框架可以跨平臺(tái)所以移動(dòng)端和H5使用的是一套代碼 上傳頭像的時(shí)候要求圖片的大小在2MB一下,所以要壓縮圖片,App端當(dāng)時(shí)使用的是uni.compressImage(OBJECT)壓縮的(詳情見:https://uniapp.dcloud.net.cn/api/media/image.html#

    2024年04月17日
    瀏覽(17)
  • uniapp實(shí)現(xiàn)掃碼功能兼容小程序和h5

    主要是針對h5端,uniapp自帶的掃碼方法不支持h5的 對于h5而言需要借助jweixin來實(shí)現(xiàn),也就是微信的掃碼功能 實(shí)現(xiàn)方式: 可通過npm安裝 npm install?jweixin-module 引入安裝的npm包 import jweixin from \\\'jweixin-module\\\' 在onLoad方法中加載獲取簽名的方法 onLoad() { ?? ??? ??? ?this.wx_sanCode() }

    2024年02月13日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包