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

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

這篇具有很好參考價值的文章主要介紹了uniapp h5 豎向的swiper內(nèi)嵌視頻實現(xiàn)抖音短視頻垂直切換,絲滑切換視頻效果,無限數(shù)據(jù)加載不卡頓。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、項目背景:實現(xiàn)仿抖音短視頻全屏視頻播放、點贊、評論、上下切換視頻、視頻播放暫停、分頁加載、上拉加載下一頁、下拉加載上一頁等功能。。。

二、前言:博主一開始一直想實現(xiàn)類似抖音進入頁面自動播放當前視頻,上下滑動切換之后播放當前視頻,但最后在ios上出現(xiàn)聲音播放,但畫面卡頓的問題,估計是ios的瀏覽器對自動播放做了安全限制,導致自動播放失效,為了功能的可用性,最終放棄自動播放,實現(xiàn)手動點擊視頻正中心的播放按鈕進行播放,再點擊視頻暫停,這個bug在安卓端暫時沒出現(xiàn),大概率是ios的安全性更高導致的瀏覽器策略攔截了,需要用戶手動交互。

三、項目框架組件:uniapp h5項目、vue2、 swiper組件、video組件

四、效果

仿抖音全屏視頻切換播放暫停


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

五、布局:可根據(jù)自已的項目需求進行修改,博主這里的邏輯是數(shù)據(jù)由接口返回,如果沒有視頻,就展示圖片,只有視頻才進行播放,標題最多展示三行,超過三行顯示‘展開’,點擊展開談起標題的底部彈窗,這里彈窗的代碼就不展示了,有需要可私信

<view class="widget-video pos-r" :style="{height:`${videoHeight}px`}">
	<swiper class="video-list" :current="current" :style="{height:`${videoHeight}px`}" :vertical="true"
		@change="changeHandler" @transition="transitionHandler" @touchstart="touchStart" @touchend="touchEnd">
		<swiper-item class="video-item" :style="{height:`${videoHeight}px`}" v-for="(item, index) in datas"
			:key="index">
			<video
				v-if="!$util.validatenull(item.videourl) || !$util.validatenull(item.videourl_low) || !$util.validatenull(item.videourl_fhd) || !$util.validatenull(item.videourl_hd)"
				class="thumb-img" :id="`video_${item.id}`" :src="item.videourl" :show-progress="false"
				:show-fullscreen-btn="false" :show-play-btn="false" :loop="true" :show-center-play-btn="false"
				enable-play-gesture :poster="item.thumb" preload="auto" x5-playsinline="" playsinline="true"
				webkit-playsinline="true" x-webkit-airplay="allow" x5-video-player-type="h5"
				x5-video-player-fullscreen="" x5-video-orientation="portraint" @click="playOrpauseFn">
			</video>
			<image v-else class="thumb-img" :src="item.thumb" mode="aspectFit"></image>
			<template v-if="item.videourl || item.videourl_fhd || item.videourl_hd || item.videourl_low">
				<image v-if="showPlayIcon" class="play-icon pos-a pos-tl-c"
					:src="$util.isCandu()?'/static/h5AndWeixin/home/cd_video_play.png':'/static/h5AndWeixin/home/common_icon_item_video_play.png'"
					mode="aspectFill" @tap="playOrpauseFn">
				</image>
			</template>
			<view class="calcwidth pos-a pos-bottom padding-l padding-b">
				<view class="wrapper" @click="openIntroducePop(item.title,item.description)">
					<view :id="'video-title'+item.id" class="c-f video-title"
						:style="{fontSize:$util.isElder()?'39rpx':'30rpx',maxHeight: titleMaxHeight}">
						<text v-if="showExpand" class="expand">展開</text>
						{{item.title}}
					</view>
				</view>
				<from-time-view :item="item" :hideViews="true" :textColor="'#fff'"></from-time-view>
			</view>
			<view class="right-icon-wrap pos-a dflex col-s flex-d pos-right">
				<view v-if="item.allow_comment === 1" class="pos-r tac mt30">
					<image
						:style="{width:$util.isElder()?'104rpx':'80rpx',height:$util.isElder()?'104rpx':'80rpx'}"
						src="/sub-live/static/comment.png"
						@click="openCommentPop(item.catid,item.contentid,item.id)" mode="scaleToFill">
					</image>
					<view v-if="commentCount> 0" class="zan-num tac pos-a pos-b-full"
						:style="{fontSize:$util.isElder()?'32rpx':'20rpx',backgroundColor:$config.INFO.SUB_THEME_COLOR}">
						{{$util.filterViews(commentCount)}}
					</view>
				</view>
				<view v-if="item.islike === 1" class="pos-r tac mt30">
					<image
						:style="{width:$util.isElder()?'104rpx':'80rpx',height:$util.isElder()?'104rpx':'80rpx'}"
						:src="likeObj.liked ? '/sub-live/static/zan-active.png' : '/sub-live/static/zan-inactive.png'"
						mode="scaleToFill" @click="goZanFn(item.catid,item.id)">
					</image>
					<view v-if="likeObj.like_count > 0" class="zan-num tac pos-a pos-b-full"
						:style="{fontSize:$util.isElder()?'32rpx':'20rpx',backgroundColor:$config.INFO.SUB_THEME_COLOR}">
						{{$util.filterViews(likeObj.like_count)}}
					</view>
				</view>
			</view>
		</swiper-item>
	</swiper>
	<view class="nav-bar dflex padding-left-and-right pos-a pos-top">
		<image :style="{width:$util.isElder()?'39rpx':'30rpx',height:$util.isElder()?'39rpx':'30rpx'}"
			src="/static/h5AndWeixin/public/white-back.png" @click="goBack"></image>
	</view>
</view>

六、js:主要展示視頻代碼

data() {
	return {
		videoHeight: uni.getWindowInfo().windowHeight,
		current: 0,
		datas: [],
		page: 0, // 當前頁0,上一頁-1,下一頁1
		showPlayIcon: false,
		pageStartY: 0,
		pageEndY: 0,
		titleMaxHeight: '',
		showExpand: false,
		videoCtx: null
	};
},
onLoad() {
	// 獲取當前頁數(shù)據(jù)
	this.getvideolists();
},
methods: {
	getvideolists() {
		const _this = this;
		// 請求數(shù)據(jù),改成自已接口的路徑和參數(shù)
		_this.$api.getVerticalVideoList({
			catid: _this.catid,
			id: _this.id, // 請求上一頁傳第一條數(shù)據(jù)的id,請求下一頁傳最后一條數(shù)據(jù)的id
			page: _this.page
		}).then(res => {
			if (res.data) {
				// 判斷是否有數(shù)據(jù),有數(shù)據(jù)才進行操作
				if (!_this.$util.validatenull(res.data.lists)) {
					// 下拉加載上一頁,將數(shù)據(jù)插入當前數(shù)據(jù)的頭部,并且播放數(shù)據(jù)的最后一條
					if (_this.current === 0 && _this.page === -1) {
						_this.datas.unshift(...res.data.lists);
						_this.current = res.data.lists.length - 1;
					} else {
						// 上拉加載下一頁,將數(shù)據(jù)添加到當前數(shù)據(jù)的尾部
						_this.datas.push(...res.data.lists);
					}
					const firstItem = _this.datas[0];
					// 只創(chuàng)建當前視頻的播放器,以免卡頓
					_this.playOrpauseFn();
				} 
			}
		}).catch((err) => {
			console.error(err);
		})
	},
	// 上下切換視頻
	changeHandler(e) {
		const _this = this;
		if (e.detail.source == 'touch') {
			const {
				current
			} = e.detail;
			// 將播放按鈕隱藏
			_this.showPlayIcon = false;
			// 設(shè)置當前視頻
			_this.current = current;
			// 只創(chuàng)建當前視頻播放器,播放當前視頻,暫停其他視頻
			_this.playOrpauseFn();
		}
	},
	transitionHandler(e) {
		if (e.detail.dy === 0) {
			// 最后一條數(shù)據(jù)上拉加載下一頁
			if (this.current === this.datas.length - 1) {
				if (this.pageStartY > this.pageEndY) {
					this.page = 1;
					this.id = this.datas.at(-1).id;
					this.getvideolists();
				}
			}
			// 第一條數(shù)據(jù)下拉加載上一頁
			if (this.current === 0) {
				if (this.pageStartY < this.pageEndY) {
					this.page = -1;
					this.id = this.datas.at(0).id;
					this.getvideolists();
				}
			}
		}
	},
	// 獲取當前觸發(fā)的縱坐標以此來判斷是上拉還是下拉
	// 記錄開始滑動的手指的縱坐標
	touchStart(res) {
		if (this.current === this.datas.length - 1 || this.current === 0) {
			this.pageStartY = res.changedTouches[0].pageY;
		}
	},
	// 記錄滑動結(jié)束的手指的縱坐標
	touchEnd(res) {
		if (this.current === this.datas.length - 1 || this.current === 0) {
			this.pageEndY = res.changedTouches[0].pageY;
		}
	},
	// 根據(jù)視頻id創(chuàng)建播放器
	playOrpauseFn() {
		let video_id = this.datas[this.current].id;
		this.videoCtx = uni.createVideoContext(`video_${video_id}`, this);
		// 點擊播放按鈕視頻播放,按鈕隱藏,再點擊視頻暫停,按鈕顯示
		if (this.showPlayIcon) {
			this.videoCtx.seek(0);
			this.videoCtx.play();
			this.showPlayIcon = false;
		} else {
			this.videoCtx.pause();
			this.showPlayIcon = true;
		}
	}
}

七、sass:

	.widget-video {
		width: 100%;
		background-color: #000;
		overflow: hidden;

		.nav-bar {
			width: 100%;
			height: 88rpx;
		}
	}


	.video-list {
		width: 100%;
		height: 100%;

		.video-item {
			width: 100%;
			position: relative;

			.play-icon {
				width: 64rpx;
				height: 64rpx;
			}

			.right-icon-wrap {
				// width: 112rpx;
				bottom: 208rpx;
				right: 18rpx;

				.mt30 {
					margin-top: 60rpx;
				}

				.zan-num {
					// width: 68rpx;
					margin: auto;
					border-radius: 4rpx;
					font-weight: 600;
					color: #FFFFFF;
					transform: scale(0.8);
				}
			}

			.calcwidth {
				width: calc(100% - 130rpx);
			}

			.wrapper {
				display: flex;
				width: 100%;
				overflow: hidden;

				.video-title {
					overflow: hidden;
					text-overflow: ellipsis;
					text-align: justify;
					position: relative;
				}

				.video-title::before {
					content: '';
					height: calc(100% - 42rpx);
					float: right;
				}

				.expand {
					position: relative;
					float: right;
					clear: both;
					margin-left: 40rpx;
					color: #A9A9B8;
					cursor: pointer;
					border: 0;
				}

				.expand::before {
					content: '...';
					position: absolute;
					left: -10rpx;
					color: #fff;
					transform: translateX(-100%);
				}
			}

		}
	}

**end:**如果出現(xiàn)畫面卡頓,聲音播放等問題,請一定要關(guān)閉視頻自動播放功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-681224.html

到了這里,關(guān)于uniapp h5 豎向的swiper內(nèi)嵌視頻實現(xiàn)抖音短視頻垂直切換,絲滑切換視頻效果,無限數(shù)據(jù)加載不卡頓的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 關(guān)于uniapp的app和uniapp的H5互相通訊實現(xiàn)H5調(diào)取app掃碼再傳入H5(app內(nèi)嵌H5,webView)

    關(guān)于uniapp的app和uniapp的H5互相通訊實現(xiàn)H5調(diào)取app掃碼再傳入H5(app內(nèi)嵌H5,webView)

    一.h5傳值給app 1,在h5項目的mian.js中引入 //此處需要注意的是如果項目本身要打包成app,記得使用條件編譯,否則在app運行時本次引入會報錯 2.h5頁面給app傳值部分 3.app頁面接收 html js由于我做的是掃碼 二.掃碼過后app向h5傳值并跳轉(zhuǎn) 1.app發(fā)起傳值 在“一“的app接收h5傳值部分我

    2024年02月02日
    瀏覽(28)
  • uniapp實現(xiàn)微信小程序內(nèi)嵌h5頁面的相互跳轉(zhuǎn)

    前期準備3個頁面,小程序內(nèi)2個,h5一個。 小程序內(nèi):操作頁pageA,展示容納h5的展示頁PageWebview.vue。 h5:h5頁面pageB,并且有可以訪問的線上url。 【微信小程序pageA-內(nèi)嵌h5頁面pageB】 1.1 pageA實現(xiàn)點擊跳轉(zhuǎn),將pageB的訪問地址url拼接,并進入展示頁PageWebview.vue 1.2 PageWebview.vue頁面用

    2024年02月12日
    瀏覽(95)
  • 抖音短視頻矩陣系統(tǒng)-源碼-系統(tǒng)搭建

    抖音短視頻矩陣系統(tǒng)-源碼-系統(tǒng)搭建

    目錄 ?1. 短視頻AI智能創(chuàng)作 2. 托管式賬號管理: 3. 數(shù)據(jù)分析 ?4. 智能營銷獲客 開發(fā)流程 抖音賬號矩陣系統(tǒng)開發(fā),抖音賬號矩陣系統(tǒng)源碼搭建,抖音賬號技術(shù)系統(tǒng)源碼部署 抖音矩陣系統(tǒng)專注于為短視頻私域運營達人或企業(yè)提供一站式賦能服務(wù)平臺。具體包括智能觸客一鍵式自

    2024年02月11日
    瀏覽(92)
  • 抖音短視頻矩陣系統(tǒng)/源碼/系統(tǒng)搭建

    抖音短視頻矩陣系統(tǒng)/源碼/系統(tǒng)搭建

    矩陣推廣是一種非常重要的營銷思維。玩的都是高手,自然不缺流量。 那么,短視頻矩陣系統(tǒng)是什么?我給你介紹一下吧! 我們可以理解為矩陣是多賬戶操作,每個數(shù)之間有一定的相關(guān)性。通過布局一定數(shù)量的賬號,通過工具、技術(shù)、運營策略等手段,獲取流量。 那么,短

    2024年02月16日
    瀏覽(86)
  • 抖音字幕視頻怎么做能滾動 抖音個性字幕怎么做 抖音短視頻用什么軟件剪輯

    抖音字幕視頻怎么做能滾動 抖音個性字幕怎么做 抖音短視頻用什么軟件剪輯

    不管是抖音短視頻,還是其他影視網(wǎng)站的影視劇,字幕基本都是必不可少的,字幕本身就能加強觀眾對視頻的理解,而且像一些滾動字幕,會更加吸引觀眾的注意力,那抖音字幕視頻怎么做能滾動?抖音個性字幕怎么做?本文將詳細說明。 一、抖音字幕視頻怎么做能滾動 以

    2024年02月03日
    瀏覽(97)
  • 抖音短視頻查重機制與應(yīng)對措施

    一.查重機制是什么? 平臺首先要檢查的是MD5,這是一種通用的、穩(wěn)定的和快速的信息摘要算法,其主要作用是保證信息傳輸?shù)耐耆恢滦?,有時也用于普通數(shù)據(jù)的加密和保護領(lǐng)域, MD5起到加密和保護的作用,也是檢查平臺重復的最快方法。 然后查看視頻的標題,底部的描述

    2023年04月23日
    瀏覽(91)
  • 抖音短視頻seo源碼矩陣系統(tǒng)開發(fā)

    抖音短視頻seo源碼矩陣系統(tǒng)開發(fā)

    抖音SEO源碼矩陣系統(tǒng)開發(fā)是一項專為抖音平臺設(shè)計的SEO優(yōu)化系統(tǒng),能夠幫助用戶提升抖音視頻的搜索排名和曝光度。為了確保系統(tǒng)運行正常,需要安裝FFmpeg和FFprobe工具。FFmpeg是一個用于處理多媒體數(shù)據(jù)的開源工具集,而FFprobe則是FFmpeg的一部分,用于分析多媒體文件的信息。

    2024年02月14日
    瀏覽(97)
  • 攻略分享,抖音短視頻、頭條自媒體養(yǎng)號

    無論是做短視頻賬號還是自媒體賬號,養(yǎng)號重要嗎? 如果你的視頻本身沒有問題,但是卻沒有播放量?那就是賬號的問題了。 如何提升賬號權(quán)限?大周來告訴你,記得先點贊收藏起來! 1、使用實名手機號注冊登錄。 2、如果你注冊的是抖音賬號,可以關(guān)聯(lián)頭條號。(反之也

    2023年04月25日
    瀏覽(79)
  • HarmonyOS 實戰(zhàn)開發(fā)案例-仿抖音短視頻應(yīng)用

    HarmonyOS 實戰(zhàn)開發(fā)案例-仿抖音短視頻應(yīng)用

    前段時間看到一篇文章,但是沒有源碼,是一個仿寫抖音的文章,最近也在看這塊,順便寫個簡單的短視頻小應(yīng)用。 技術(shù)點拆分 1、http請求數(shù)據(jù); 2、measure計算文本寬度; 3、video播放視頻; 4、onTouch上滑/下拉切換視頻; 5、List實現(xiàn)滾動加載; 效果展示 http請求數(shù)據(jù) 通過對

    2024年02月22日
    瀏覽(103)
  • 抖音短視頻腳本制作的一些技巧,快快收藏起來!

    抖音短視頻腳本制作的一些技巧,快快收藏起來!

    在抖音上發(fā)布一個成功的短視頻需要多方面的考慮,其中最重要的是腳本的制作。一個好的腳本不僅可以吸引用戶觀看,還可以讓用戶產(chǎn)生共鳴,從而提高視頻的傳播效果。以下是不若與眾科技一些關(guān)于抖音短視頻腳本制作的技巧。 ? 1. 簡短明了 抖音短視頻的時長通常在1

    2024年02月16日
    瀏覽(38)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包