基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式


Posted in Javascript onJanuary 17, 2018

本文讲述如何实现拥有酷炫背景视频的登录页面,浏览器窗口随意拉伸,背景视频及前景登录组件均能完美适配,背景视频可始终铺满窗口,前景组件始终居中,视频的内容始终得到最大限度的保留,可以得到最好的视觉效果。并且基于 Vue.js 2.0 全家桶。具体效果如下图所示:

最终效果可以翻到文章最后观看。

基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式 

1. 背景视频 Web 页面的既有实现方式

国外有一个很好的网站 「Coverr」 ,提供了完善的教程和视频资源,帮助前端开发者构建酷炫的背景视频主页,网站效果示例如下图所示:

基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式 

教程如下所示:

基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式 

从图中以及我的实践可以得出以下观点:

  • 该教程使用了 jQuery 。由于我们想要使用 Vue.js,则 jQuery 可被完全替代掉。
  • 该教程的 CSS、JavaScript 代码均过于冗余。
  • 直接运行示例,发现效果并不好,浏览器窗口随意拉伸时,背景视频并不能完美适配「会出现黑边等瑕疵」,效果未达到预期。

2. 设计完美的背景视频 Web 页面

首先基于脚手架工具 vue-cli 来创建一个使用 vue-loader 的项目,构建完毕后,在相应目录下创建「.vue」文件,作为登录页面的模板文件,具体细节不再赘述。本节内容仅局限于该.vue文件。

2.1 HTML 模板

基于需求,对 Coverr 提供的 HTML 模板进行了细微修改,结果如下:

<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 标签,建议升级浏览器。
 <source src="PATH_TO_WEBM" type="video/webm"/>
 浏览器不支持 video 标签,建议升级浏览器。
 </video>
 <div class="poster hidden" v-if="!vedioCanPlay">
 <img :style="fixStyle" src="PATH_TO_JPEG" alt="">
 </div>
 </div>
 </div>
</template>

模板中, filter 类的 div 标签是一层背景视频的蒙版,可以通过蒙版控制视频的亮暗以及色温等。

video 标签为标准的 HTML5 标签,提供两种格式的视频以及一张图片占位符,背景视频在加载完毕后即自动播放。

Coverr 提供的原始模板,直接调试,页面只显示图片,而无法播放视频,通过使用 Vue.js 的 v-if 指令解决了该问题。

2.2 CSS

对原始模板 CSS 代码进行了大幅精简,修改后的 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>

由于大多数样式均被项目全局修改了,所以在此专用于此模板的样式只剩下三条,简要说明如下:

  • 容器 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 事件的监听。当窗口大小更改时,程序同步修改 video 及蒙版 dom 的尺寸,使得视频的最窄的边始终撑满浏览器的窗口,而长的边左右两边被均匀地裁减。

这样操作,可以使得视频不会被拉伸,视频中心始终位于浏览器的中心,并且在随意拉伸浏览器窗口时,视频的内容始终得到最大限度的保留,并且可以得到最好的视觉效果。

最终效果如下所示:

基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式 

参考资料

资源网站「Coverr」

Vue.js 中文官网

总结

以上所述是小编给大家介绍的基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
特殊字符、常规符号及其代码对照表
Jun 26 Javascript
js静态作用域的功能。
Dec 25 Javascript
关于JavaScript的面向对象和继承有利新手学习
Jan 11 Javascript
网页右侧悬浮滚动在线qq客服代码示例
Apr 28 Javascript
如何通过js实现图片预览功能【附实例代码】
Mar 30 Javascript
ionic实现可滑动的tab选项卡切换效果
Apr 15 Javascript
jquery实现全选、不选、反选的两种方法
Sep 06 Javascript
使用jQuery卸载全部事件的思路详解
Apr 03 jQuery
使用Webpack提高Vue.js应用的方式汇总(四种)
Jul 10 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
Nov 22 Javascript
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
Dec 01 Javascript
layui select 禁止点击的实现方法
Sep 05 Javascript
使用Vue开发一个实时性时间转换指令
Jan 17 #Javascript
angularjs 页面自适应高度的方法
Jan 17 #Javascript
VueJs监听window.resize方法示例
Jan 17 #Javascript
详解AngularJS之$window窗口对象
Jan 17 #Javascript
React-native桥接Android原生开发详解
Jan 17 #Javascript
vue自定义指令directive实例详解
Jan 17 #Javascript
移动web开发之touch事件实例详解
Jan 17 #Javascript
You might like
PHP 和 XML: 使用expat函数(一)
2006/10/09 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
redis+php实现微博(一)注册与登录功能详解
2019/09/23 PHP
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
基于jQuery的js分页代码
2010/06/10 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
Jquery倒数计时按钮setTimeout的实例代码
2013/07/04 Javascript
js操作输入框提示信息且响应鼠标事件
2014/03/25 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
深入理解JQuery循环绑定事件
2016/06/02 Javascript
ES6所改良的javascript“缺陷”问题
2016/08/23 Javascript
Vue面试题及Vue知识点整理
2018/10/07 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
JQuery获得内容和属性方法解析
2020/05/30 jQuery
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
2020/09/02 Javascript
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
2018/01/30 Python
python使用KNN算法手写体识别
2018/02/01 Python
python的scikit-learn将特征转成one-hot特征的方法
2018/07/10 Python
Python获取Redis所有Key以及内容的方法
2019/02/19 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
python检测服务器端口代码实例
2019/08/31 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
2020/02/27 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
2020/04/22 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
Unix如何在一行中运行多个命令
2015/05/29 面试题
档案接收函
2014/01/13 职场文书
项目投资合作意向书
2014/07/29 职场文书
学生保证书格式
2015/02/27 职场文书
Python数据分析之绘图和可视化详解
2021/06/02 Python
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
浅谈Python魔法方法
2021/06/28 Java/Android
Django实现WebSocket在线聊天室功能(channels库)
2021/09/25 Python
MySQL如何修改字段类型和字段长度
2022/06/10 MySQL