简介

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

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

  今晚心血来潮,起了动手试试的念头。我的想法很简单,用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. sass

    本文来自阮一峰http://www.ruanyifeng.com/blog/2012/06/sass.html 学过CSS的人都知道,它不是一种编程语言. 你可以用它开发网页样式,但是没法用它编程.也 ...

  2. css3 linear-gradient实现页面加载进度条效果

    最终效果图: html结构: <div>    <p class="p1">        <span></span>    < ...

  3. CF2.C(二分贪心)

    C. Road to Cinema time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  4. ntko office在线编辑控件问题记录

    ntko office在线预览插件 http://www.ntko.com/ 问题:火狐或谷歌下保存报[没有打开的文档]错误,ie正常 原因:火狐.谷歌.ie的各方法执行文字不同,ie嵌在页面,而火狐 ...

  5. [转]html5表单上传控件Files API

    表单上传控件:<input type="file" />(IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持.) 1.允许上传文件数量 允许选择多个文件:< ...

  6. mongodb搭建和基本语法

    下载安装包 https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.0.0-signed.msi?_ga=1.2206 ...

  7. Android提权漏洞CVE-2014-7920&CVE-2014-7921分析

    没羽@阿里移动安全,更多安全类技术干货,请访问阿里聚安全博客 这是Android mediaserver的提权漏洞,利用CVE-2014-7920和CVE-2014-7921实现提权,从0权限提到me ...

  8. Android 知识杂记(MVP模式)

    MVP的模式在于将原来activity中业务逻辑的部分剥离出来,代码示例如下: Account public class Account { private String mUsername; pri ...

  9. Redis系列(四)-低成本高可用方案设计

    关于Redis高可用方案,看到较多的是keepalived.zookeeper方案. keepalived是主备模式,意味着总有一台浪费着.zookeeper工作量成本偏高. 本文主要介绍下使用官方s ...

  10. Android学习——windows下搭建NDK_r9环境

    1. NDK(Native Development Kit) 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP功能开发的工具,通过这个 ...