微信小程序video组件实现点击全屏自动播放的实战技巧

微信小程序video组件实现点击全屏自动播放的实战技巧 1. 微信小程序video组件全屏播放的核心逻辑微信小程序的video组件本身并不直接支持点击自动全屏播放的功能这需要通过组合API来实现完整交互流程。核心原理是监听用户点击事件后先触发视频播放再立即调用全屏API。这里有个关键细节播放和全屏必须是异步顺序执行如果同步执行会导致部分机型失效。实际开发中我遇到过这样的场景用户上传的内容可能是图片或视频需要实现点击图片预览大图点击视频则全屏播放。这时候就需要用条件渲染来区分处理。下面这段代码是我在电商项目中实际验证过的方案view v-for(item, index) in mediaList :keyindex image v-ifisImage(item.url) :srcitem.url clickpreviewImage(index) /image video v-else :idvideo_item.id :srcitem.url :posteritem.cover clickplayFullscreen(item.id) /video /view2. 实现自动全屏播放的完整代码解析2.1 视频上下文对象的正确使用很多开发者容易忽略createVideoContext的调用时机。我在实际项目中测试发现必须在点击事件触发时动态创建上下文如果提前创建会导致全屏失效。下面是经过多个项目验证的可靠写法methods: { playFullscreen(videoId) { // 创建视频上下文必须每次点击时新建 const videoContext wx.createVideoContext(video_ videoId, this) // 先播放再全屏注意异步顺序 videoContext.play().then(() { videoContext.requestFullScreen({ direction: 90 // 横屏全屏 }) }) } }2.2 全屏状态的事件监听全屏状态变化时需要特别处理播放控制。有次上线后收到用户反馈退出全屏后视频仍在后台播放。后来我们增加了fullscreenchange监听Page({ onReady() { this.videoState {} }, handleFullscreenChange(e) { const { fullScreen, videoId } e.detail if (!fullScreen) { wx.createVideoContext(video_ videoId, this).pause() this.videoState[videoId] false } } })3. 循环列表中的常见问题解决方案3.1 动态ID的唯一性保证在渲染视频列表时最常遇到的坑就是动态ID冲突。有次我们项目出现诡异现象点击任意视频都会播放最后一个。后来发现是v-for的key和视频ID没有正确关联。正确的做法是block v-for(item, index) in videoList :keyitem.id video :idvideo_item.id_index :data-iditem.id clickhandleVideoClick /video /block3.2 性能优化技巧当列表较长时视频组件会严重影响性能。我们通过以下优化手段将页面加载速度提升了60%使用懒加载lazy-load属性初始只加载首屏视频通过in-viewport检测离开屏幕时自动暂停onPageScroll() { this.checkVideoVisibility() }, checkVideoVisibility() { const query wx.createSelectorQuery() query.selectAll(.video-item).boundingClientRect() query.exec(res { res[0].forEach(rect { const isVisible rect.top windowHeight rect.bottom 0 const videoId rect.dataset.id this.toggleVideoPlay(videoId, isVisible) }) }) }4. 用户体验优化实践4.1 自定义控制栏的实现原生控制栏样式受限我们通过隐藏原生控件自定义UI实现了更灵活的交互video :controlsfalse :show-center-play-btnfalse timeupdateupdateProgress cover-view classcustom-controls cover-image src/images/play.png clicktogglePlay /cover-image progress :percentcurrentProgress stroke-width4 /progress /cover-view /video4.2 加载状态优化视频加载时的等待体验很重要。我们采用三级加载策略先显示封面图加载时显示骨架屏添加重试机制data() { return { loadStates: {} } }, methods: { handleVideoLoad(videoId) { this.$set(this.loadStates, videoId, { loading: true, error: false }) }, handleVideoError(videoId) { this.loadStates[videoId].error true setTimeout(() { this.retryLoad(videoId) }, 1500) } }5. 真机调试中的注意事项5.1 iOS/Android差异处理在真机测试时我们发现两个平台的主要差异点iOS全屏时必须竖屏锁定Android横屏视频需要额外设置x5-video-orientation部分Android机型需要添加x5-video-player-typeh5最终我们的兼容方案是video :x5-video-player-typeisAndroid ? h5 : :x5-video-orientationisAndroid ? landscape : :webkit-playsinlinetrue :playsinlinetrue /video5.2 微信版本兼容旧版微信(7.0以下)需要polyfill处理requestFullScreen方法名不同全屏事件监听方式有差异退出全屏时需要手动暂停我们封装了兼容方法function safeRequestFullScreen(ctx) { if (ctx.requestFullScreen) { return ctx.requestFullScreen() } if (ctx.requestFullscreen) { return ctx.requestFullscreen() } return Promise.reject(API not supported) }