基于 Vue.js 2.0 酷炫自適應(yīng)背景視頻登錄頁面實現(xiàn)方式
本文講述如何實現(xiàn)擁有酷炫背景視頻的登錄頁面,瀏覽器窗口隨意拉伸,背景視頻及前景登錄組件均能完美適配,背景視頻可始終鋪滿窗口,前景組件始終居中,視頻的內(nèi)容始終得到最大限度的保留,可以得到最好的視覺效果。并且基于 Vue.js 2.0 全家桶。具體效果如下圖所示:
最終效果可以翻到文章最后觀看。
1. 背景視頻 Web 頁面的既有實現(xiàn)方式
國外有一個很好的網(wǎng)站 「Coverr」 ,提供了完善的教程和視頻資源,幫助前端開發(fā)者構(gòu)建酷炫的背景視頻主頁,網(wǎng)站效果示例如下圖所示:
教程如下所示:
從圖中以及我的實踐可以得出以下觀點:
- 該教程使用了 jQuery 。由于我們想要使用 Vue.js,則 jQuery 可被完全替代掉。
- 該教程的 CSS、JavaScript 代碼均過于冗余。
- 直接運行示例,發(fā)現(xiàn)效果并不好,瀏覽器窗口隨意拉伸時,背景視頻并不能完美適配「會出現(xiàn)黑邊等瑕疵」,效果未達(dá)到預(yù)期。
2. 設(shè)計完美的背景視頻 Web 頁面
首先基于腳手架工具 vue-cli 來創(chuàng)建一個使用 vue-loader 的項目,構(gòu)建完畢后,在相應(yīng)目錄下創(chuàng)建「.vue」文件,作為登錄頁面的模板文件,具體細(xì)節(jié)不再贅述。本節(jié)內(nèi)容僅局限于該.vue文件。
2.1 HTML 模板
基于需求,對 Coverr 提供的 HTML 模板進(jìn)行了細(xì)微修改,結(jié)果如下:
<template> <div class="homepage-hero-module"> <div class="video-container"> <div :style="fixStyle" class="filter"></div> <video :style="fixStyle" autoplay loop class="fillWidth" v-on:canplay="canplay"> <source src="PATH_TO_MP4" type="video/mp4"/> 瀏覽器不支持 video 標(biāo)簽,建議升級瀏覽器。 <source src="PATH_TO_WEBM" type="video/webm"/> 瀏覽器不支持 video 標(biāo)簽,建議升級瀏覽器。 </video> <div class="poster hidden" v-if="!vedioCanPlay"> <img :style="fixStyle" src="PATH_TO_JPEG" alt=""> </div> </div> </div> </template>
模板中, filter 類的 div 標(biāo)簽是一層背景視頻的蒙版,可以通過蒙版控制視頻的亮暗以及色溫等。
video 標(biāo)簽為標(biāo)準(zhǔn)的 HTML5 標(biāo)簽,提供兩種格式的視頻以及一張圖片占位符,背景視頻在加載完畢后即自動播放。
Coverr 提供的原始模板,直接調(diào)試,頁面只顯示圖片,而無法播放視頻,通過使用 Vue.js 的 v-if 指令解決了該問題。
2.2 CSS
對原始模板 CSS 代碼進(jìn)行了大幅精簡,修改后的 CSS 代碼如下所示:
<style scoped> .homepage-hero-module, .video-container { position: relative; height: 100vh; overflow: hidden; } .video-container .poster img, .video-container video { z-index: 0; position: absolute; } .video-container .filter { z-index: 1; position: absolute; background: rgba(0, 0, 0, 0.4); } </style>
由于大多數(shù)樣式均被項目全局修改了,所以在此專用于此模板的樣式只剩下三條,簡要說明如下:
- 容器 div 鋪滿瀏覽器窗口
- 蒙版 div 位于視頻的上方,以起到蒙版的作用。
2.3 JavaScript 代碼
<script> export default { name: 'login', data() { return { vedioCanPlay: false, fixStyle: '' } }, methods: { canplay() { this.vedioCanPlay = true } }, mounted: function() { window.onresize = () => { const windowWidth = document.body.clientWidth const windowHeight = document.body.clientHeight const windowAspectRatio = windowHeight / windowWidth let videoWidth let videoHeight if (windowAspectRatio < 0.5625) { videoWidth = windowWidth videoHeight = videoWidth * 0.5625 this.fixStyle = { height: windowWidth * 0.5625 + 'px', width: windowWidth + 'px', 'margin-bottom': (windowHeight - videoHeight) / 2 + 'px', 'margin-left': 'initial' } } else { videoHeight = windowHeight videoWidth = videoHeight / 0.5625 this.fixStyle = { height: windowHeight + 'px', width: windowHeight / 0.5625 + 'px', 'margin-left': (windowWidth - videoWidth) / 2 + 'px', 'margin-bottom': 'initial' } } } window.onresize() } } </script>
以上代碼中最重要的部分是對 window 對象的 onresize 事件的監(jiān)聽。當(dāng)窗口大小更改時,程序同步修改 video 及蒙版 dom 的尺寸,使得視頻的最窄的邊始終撐滿瀏覽器的窗口,而長的邊左右兩邊被均勻地裁減。
這樣操作,可以使得視頻不會被拉伸,視頻中心始終位于瀏覽器的中心,并且在隨意拉伸瀏覽器窗口時,視頻的內(nèi)容始終得到最大限度的保留,并且可以得到最好的視覺效果。
最終效果如下所示:
參考資料
資源網(wǎng)站「Coverr」
總結(jié)
以上所述是小編給大家介紹的基于 Vue.js 2.0 酷炫自適應(yīng)背景視頻登錄頁面實現(xiàn)方式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
vue.js路由mode配置之去掉url上默認(rèn)的#方法
今天小編就為大家分享一篇vue.js路由mode配置之去掉url上默認(rèn)的#方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11vue項目或網(wǎng)頁上實現(xiàn)文字轉(zhuǎn)換成語音播放功能
這篇文章主要介紹了在vue項目或網(wǎng)頁上實現(xiàn)文字轉(zhuǎn)換成語音,需要的朋友可以參考下2020-06-06Vue數(shù)據(jù)監(jiān)聽方法watch的使用
這篇文章主要介紹了Vue數(shù)據(jù)監(jiān)聽方法watch的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03