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 ...
随机推荐
- C\C++ 1A2B小游戏源码
学了一段时间,心血来潮写了一个1A2B小游戏,很多人应该玩过,是一个挺有意思的益智小游戏,之前用易语言写过,现在又用C++重写了一下. 编译运行无错,整体程序设计思路为:进入循环,初始化游戏,读入一个 ...
- ubuntu 下emacs 配置
(set-language-environment 'Chinese-GB) (set-keyboard-coding-system 'utf-8) (set-clipboard-coding-sys ...
- java 心得
11. 最后的笑声 package javaBookPractice; public class LastLaugh { public static void main(String[] args) ...
- angularjs 自定义服务的三种方式
angularjs 中可通过三种($provider,$factory,$service)方式自定义服务,以下是不同的实现形式: // 定义module , module中注入$providevar ...
- eclipse 中的注释 快捷键
(1)Ctrl+Space 说明:内容助理.提供对方法,变量,参数,javadoc等得提示, 应运在多种场合,总之需要提示的时候可先按此快捷键. 注:避免输入法的切换设置与此设置冲突 (2)Ctrl ...
- Repeater的分页
Repeater控件是个好东西.轻量级.又好用.完全的自定义.但是,正是因为这些优点它没有自动分页的功能.这个需要研究一下.我看了一下起点等小说网站,那些什么推荐排名榜用Repeater控件那是很 ...
- Unity学习疑问记录之坐标体系
[Unity3D的四种坐标系] 1.World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的.transform.position可以获得该位置坐标. ...
- Android中Intent的用法总结
Intent只在Android中特有,我把它比作一种运载工具,就像飞机一样,会把一些人带到某个地方,而且如果需要的话,还可以找到机上有哪些人员(数据),这就需要另外一些设备来支持(如:Bundle), ...
- 安装ant
从ant官方网站下载ant安装包:apache-ant-1.9.7-bin.tar.gz,解压 tar xvf apache-ant-1.9.7-bin.tar.gz -C /usr/java/ 配置 ...
- 通过Javascript得到URL中的参数(query string)
我们知道,"GET"请求中,通常把参数放在URL后面,比如这样http://www.cnblogs.com/season-huang/index?param=yes&art ...