简介

  当前主流的视频网站目前有不少新鲜好玩的功能,最明显的莫过于小视频的显示--当视频不在当前视口范围

时,会在右下角用一个小窗口来显示当前的视频,而且可以拖拽。

  今晚心血来潮,起了动手试试的念头。我的想法很简单,用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实现拖动页面时显示窗口视频的更多相关文章

  1. 笔记-返回到前一个页面时显示前一个页面中ajax获取的数据

    笔记第一部分:http://www.cnblogs.com/zczhangcui/p/6869219.html 在第一部分遇到的问题是,用ajax获取了一系列列表信息后,拼接好html后插入到了原有页 ...

  2. 在WebView中加载HTML页面时显示进度对话框的方法

    webView.setWebViewClient(new WebViewClient(){            ProgressDialog prDialog;            @Overri ...

  3. H5页面input输入框含有键盘自带的表情符时显示异常

    在做一个关于新闻的评论功能的H5页面时,需求里面要求能够发送表情显示表情,如果使用自定义的表情库,则在评论也还要加载大量的表情符图片,极大的影响加载速度,消耗流量,去看了下别的新闻网页版的评论部分也没 ...

  4. 打开jsp页面时,显示空白页。

    打开jsp页面时,显示空白页.   #foreach($e in $listPlanItem)          #set($listPlanDetail=$!e.get(2))        < ...

  5. 页面进行ajax时 显示一个中间浮动loading

    先发效果图,加载东西的时候如果没有设计或者其它提示会降低用户体验,所以写了个简单的loading弹层. 适用于触屏和pc页面. /* 页面进行ajax时 显示一个中间浮动loading @auther ...

  6. Ouibounce – 在用户离开你网站时显示模态弹窗

    Ouibounce 是一个微小的库,用于实现在用户离开你的网站的时候显示一个模式窗口.这个库可以帮助你增加着陆页的转换率. Ouibounce 会在当鼠标光标移动到接近(或通过)视口(viewport ...

  7. Directshow 通过 put_Owner 指定显示窗口后,自动刷新问题

    在Directshow中,我们可以对render指定显示窗口,在写程序的过程中, 发现通过put_Owner设置的显示窗口存在自动刷新问题,譬如窗口被遮挡然后再次露出时,被遮挡部分不能自动刷新,需要拖 ...

  8. 【JavaScript制作页面时常用的五个特效,你用到了哪个?】

    常用的五个特效的相关知识点见附录(五道例题后有附录哦~): 例一: 1.在某页面中有一个图片和五个超链接,如下图所示: 单击不同的数字超链接显示不同的图片: 图1 图片幻灯片显示效果 提示: (1)默 ...

  9. web页面弹出窗口代码大全

    //-----------按钮提示框----------// <input type="button" name="btn2" id="btn2 ...

随机推荐

  1. Kafka设计解析(三)- Kafka High Availability (下)

    本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/06/08/KafkaColumn3 摘要 本文在上篇文章基础上,更加深入讲解了Kafka的HA机 ...

  2. nodejs 模块恩仇录

    anywhere 一句话:随时随地将你的当前目录变成一个静态文件服务器的根目录. 安装 npm install anywhere -g anywhere -h localhost -p 8060 fa ...

  3. Permission denied user=hadoop access=WRITE inode=root rootsupergroup rwxr

    有段时间没有写了,反正我写的都是跟流水账一样.不为别人看,当然,其中也记录了很多我踩过的坑,可能也能给别人提个醒.最重要的是:这是我学习的记忆 上面的错误是由于我将reducer的输出目录设置在hdf ...

  4. PHP基础知识之遍历

    遍历对象的时候,默认遍历对象的所有属性 class MyClass{    public $var1 = 'value 1';    public $var2 = 'value 2';    publ ...

  5. sql字符串分组

    create function f_myWord(@s varchar(50)) returns varchar(50) as begin declare @i int set @i=1 while ...

  6. Linux 部署ASP.NET SQLite 应用 的坎坷之旅 附demo及源码

    Linux 部署ASP.NET SQLite 应用 的坎坷之旅.文章底部 附示例代码. 有一台闲置的Linux VPS,尝试着部署一下.NET 程序,结果就踏上了坑之路,不过最后算是完美解决问题,遂记 ...

  7. MongoDB 2.6.2 发布

    NoSQL数据库MongoDB推出了全新一代产品MongoDB 2.6.2,该版本全面强化核心服务器,提供全新的自动化工具与重要的企业功能,宣称是MongoDB问世5年来最大的一次版本发布,主要改善开 ...

  8. Javascript判断两个日期是否相等

    大家一定遇到过这样的情况,有两个日期对象,然后需要判断他们是否相等. 例如: var date1 = new Date("2013-11-29"); var date2 = new ...

  9. .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法

    开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...

  10. [.net 面向对象程序设计深入](2)UML——在Visual Studio 2013/2015中设计UML用例图

    [.net 面向对象程序设计深入](2)UML——在Visual Studio 2013/2015中设计UML用例图  1.用例图简介 定义:用例图主要用来描述“用户.需求.系统功能单元”之间的关系. ...