canvas实现拖动页面时显示窗口视频
简介
当前主流的视频网站目前有不少新鲜好玩的功能,最明显的莫过于小视频的显示--当视频不在当前视口范围
时,会在右下角用一个小窗口来显示当前的视频,而且可以拖拽。
今晚心血来潮,起了动手试试的念头。我的想法很简单,用canvas来获取视频每一帧的数据,并用动画函数
requestAnimationFrame函数(这里没有考虑兼容性)来显示每一帧的视频数据。另外,对canvas绑定拖动的
功能,这样就基本实现了简易的窗口视频。
本章内容的重点就是requestAnimationFrame函数和canvas的drawImage函数,canvas的drawImage函数
可以获取图片或者视频的帧数据ImageData,可以对其操作,在之前的文章 使用cancas改变视频的灰度 一文中
已经介绍过该函数。另外就是拖动的实现,之前的文章中也有涉及。
现将demo呈上:
<style>
html{height:2000px;}
div{width: 500px;margin:40px auto;}
</style> ------------------------------------------------------------------------ <div>
<video id="v" controls="controls" autoplay="autoplay" src="a.mp4" width="" height=""></video>
</div> ------------------------------------------------------------------------ function $(i){return document.getElementById(i)}
var v = $("v");
function fixScrollEvent(el,fn,context){
var type = "mousewheel";
context = context || window;
try{
document.createEvent("MouseScrollEvents");
type = "DOMMouseScroll";
}catch(e){}
if(type == "mousewheel"){
el.onmousewheel = function(e){
e = e || window.event;
if(window.opera && window.opera.version()<){
e.delta = -e.wheelDelta / ;
}else{
e.delta = e.wheelDelta / ;
}
fn.call(context,e);
}
}else{
el.addEventListener("DOMMouseScroll",function(e){
e.delta = -e.detail;
fn.call(context,e);
},false)
}
} fixScrollEvent(window,function(e){
var dh,cp;
var c, d,graphic;
var imageData;
//视口宽度和高度
var vpWidth = window.innerWidth || document.documentElement.clientWidth
|| document.body.clientWidth;
var vpHeight = window.innerHeight || document.documentElement.clientHeight
|| document.body.clientHeight;
cp = v.getBoundingClientRect();
dh = cp.top + v.scrollTop + v.clientHeight; c = $("miniVideo");
if(dh < document.documentElement.scrollTop){
if(c){
c.setAttribute("data-flag",);
c.style.display = "";
}else{
c = document.createElement("canvas");
c.id = "miniVideo";
// Drag 拖动插件必须要确定top和left值,不能使用right和bottom代替。
c.style.cssText = "width:300px;height:200px;background:black;position:fixed;" +
"left:"+(vpWidth - - )+"px;top:"+(vpHeight - - )+"px;";
c.setAttribute("data-flag",);
if(c.innerText !== undefined){
c.innerText = "Your Browser can not support Canvas!";
}else{
c.textContent = "Your Browser can not support Canvas!";
}
document.body.appendChild(c);
new Drag(c) }
requestAnimationFrame(function recurse(){
graphic = c.getContext("2d");
graphic.drawImage(v,,, c.width, c.height);
if(c.getAttribute("data-flag")){
requestAnimationFrame(recurse);
}
})
}else{
if(c){
//设置空字符串,之前犯了个错误,在html property保存的始终是字符串。
c.setAttribute("data-flag","");
c.style.display = "none";
}
}
})
实例图片:

实现虽然简单,但是通过这个demo我又复习了一些基本的canvas用法以及相关的位置参数获取。还是挺有
收获的。
canvas实现拖动页面时显示窗口视频的更多相关文章
- 笔记-返回到前一个页面时显示前一个页面中ajax获取的数据
笔记第一部分:http://www.cnblogs.com/zczhangcui/p/6869219.html 在第一部分遇到的问题是,用ajax获取了一系列列表信息后,拼接好html后插入到了原有页 ...
- 在WebView中加载HTML页面时显示进度对话框的方法
webView.setWebViewClient(new WebViewClient(){ ProgressDialog prDialog; @Overri ...
- H5页面input输入框含有键盘自带的表情符时显示异常
在做一个关于新闻的评论功能的H5页面时,需求里面要求能够发送表情显示表情,如果使用自定义的表情库,则在评论也还要加载大量的表情符图片,极大的影响加载速度,消耗流量,去看了下别的新闻网页版的评论部分也没 ...
- 打开jsp页面时,显示空白页。
打开jsp页面时,显示空白页. #foreach($e in $listPlanItem) #set($listPlanDetail=$!e.get(2)) < ...
- 页面进行ajax时 显示一个中间浮动loading
先发效果图,加载东西的时候如果没有设计或者其它提示会降低用户体验,所以写了个简单的loading弹层. 适用于触屏和pc页面. /* 页面进行ajax时 显示一个中间浮动loading @auther ...
- Ouibounce – 在用户离开你网站时显示模态弹窗
Ouibounce 是一个微小的库,用于实现在用户离开你的网站的时候显示一个模式窗口.这个库可以帮助你增加着陆页的转换率. Ouibounce 会在当鼠标光标移动到接近(或通过)视口(viewport ...
- Directshow 通过 put_Owner 指定显示窗口后,自动刷新问题
在Directshow中,我们可以对render指定显示窗口,在写程序的过程中, 发现通过put_Owner设置的显示窗口存在自动刷新问题,譬如窗口被遮挡然后再次露出时,被遮挡部分不能自动刷新,需要拖 ...
- 【JavaScript制作页面时常用的五个特效,你用到了哪个?】
常用的五个特效的相关知识点见附录(五道例题后有附录哦~): 例一: 1.在某页面中有一个图片和五个超链接,如下图所示: 单击不同的数字超链接显示不同的图片: 图1 图片幻灯片显示效果 提示: (1)默 ...
- web页面弹出窗口代码大全
//-----------按钮提示框----------// <input type="button" name="btn2" id="btn2 ...
随机推荐
- sass
本文来自阮一峰http://www.ruanyifeng.com/blog/2012/06/sass.html 学过CSS的人都知道,它不是一种编程语言. 你可以用它开发网页样式,但是没法用它编程.也 ...
- css3 linear-gradient实现页面加载进度条效果
最终效果图: html结构: <div> <p class="p1"> <span></span> < ...
- CF2.C(二分贪心)
C. Road to Cinema time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- ntko office在线编辑控件问题记录
ntko office在线预览插件 http://www.ntko.com/ 问题:火狐或谷歌下保存报[没有打开的文档]错误,ie正常 原因:火狐.谷歌.ie的各方法执行文字不同,ie嵌在页面,而火狐 ...
- [转]html5表单上传控件Files API
表单上传控件:<input type="file" />(IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持.) 1.允许上传文件数量 允许选择多个文件:< ...
- mongodb搭建和基本语法
下载安装包 https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.0.0-signed.msi?_ga=1.2206 ...
- Android提权漏洞CVE-2014-7920&CVE-2014-7921分析
没羽@阿里移动安全,更多安全类技术干货,请访问阿里聚安全博客 这是Android mediaserver的提权漏洞,利用CVE-2014-7920和CVE-2014-7921实现提权,从0权限提到me ...
- Android 知识杂记(MVP模式)
MVP的模式在于将原来activity中业务逻辑的部分剥离出来,代码示例如下: Account public class Account { private String mUsername; pri ...
- Redis系列(四)-低成本高可用方案设计
关于Redis高可用方案,看到较多的是keepalived.zookeeper方案. keepalived是主备模式,意味着总有一台浪费着.zookeeper工作量成本偏高. 本文主要介绍下使用官方s ...
- Android学习——windows下搭建NDK_r9环境
1. NDK(Native Development Kit) 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP功能开发的工具,通过这个 ...