所有分类
  • 所有分类
  • 后端开发
HTML5与CSS3:仿优酷视频截图,画布技巧揭秘

HTML5与CSS3:仿优酷视频截图,画布技巧揭秘

-模仿优酷视频截图功能的详解:一般的视频网站对于用户上传的视频,在用户上传完成后,可以对播放的视频进行截图,然后作为视频的展示图。项目中也可以引入这样的功能给用户一种不错的体验,而不是让用户额外上传一张展示图。

HTML5与CSS3技术概述

HTML5和CSS3可是网页设计的神器!它们能帮助我们做出更炫酷、功能更强的页面,这主要得归功于HTML5对新功能的支持,比如视频、音频等等;以及它改善了文档的结构和可读性。再说说CSS3,有了这个,我们就可以玩出更多花样来!网站变得更活泼有趣,让用户忍不住多看几眼。那么,今天就让我来给大家介绍一下如何用HTML5和CSS3仿照优酷视频那样截图的功能,看看它是怎么做到的,以及关键步骤有哪些。

视频截图功能介绍

HTML5与CSS3:仿优酷视频截图,画布技巧揭秘

每个视频网站上都有上传视频就得配张图片当封面的设定,为了招揽大家点开看,但如果你学会了用HTML5和CSS3代码去实现优酷那个视频截图功能的话,就能在用户上传影片之后自动给它截个图然后放在网页上!这样一来,用户就可以省下不少时间,同时也让整个页面更有趣、更吸引人呐~

核心代码解析

_canvas = document.createElement("canvas");
_ctx = _canvas.getContext("2d");
_ctx.fillStyle = '#ffffff';
_ctx.fillRect(0, 0, _videoWidth, _videoWidth);
_ctx.drawImage(_video, 0, 0, _videoWidth, _videoHeight, 0, 0, _videoWidth, _videoHeight);
var dataUrl = _canvas.toDataURL("image/png");

咱就来聊聊怎样弄个类似于优酷视频截图功能,关键环节就是用Canvas来画视频截图,然后就像听到口令一样,监控视频加载事件,以及搞定缩略图啥的。首先,用ctx.drawImage把视频对象送入Canvas画布,接下来就该用toDataURL方法拿到画布里的东西,然后给img标签喂进去,这样视频截图就能出炉了。在敲代码的时候也别忘了监控下视频加载事件,必要时清除一下防止卡顿现象发生。

HTML结构设计

搞定仿照优酷截屏功能,其实HTML结构设计挺直观的!就用video标签来看视频,canvas用来画截图,img就在那显示做好的缩小图片啥的。只要把这些东西摆摆好,加上些特定属性,整个网页看起来不但清爽,还挺条理!

CSS样式设置

利用 CSS3 就能让网页变得更美,更吸引人!你看,像我们做YouTube视频截图仿真时,就得靠这些CSS样式来调整video、canvas、img之类的东西位置、大小啥的,还能加入过渡和动画,整个页面的视觉效果一下子就上去了。



    
    
    
        html
        {
            overflow: hidden;
        }
        body
        {
            background-color: #999;
        }
        video
        {
            display: block;
            margin: 60px auto 0;
        }
        #shotBar
        {
            position: absolute;
            bottom: 5px;
            height: 120px;
            width: 98%;
            background-color: #000;
            box-shadow: -5px -5px 10px #fff;
            border-radius: 5px;
            padding: 2px;
            overflow: auto;
        }
        #shotBar img
        {
            border: 3px solid #fff;
            border-radius: 5px;
            height: 110px;
            width: 210px;
            margin-left: 4px;
        }
    
    
    
    
        $(function ()
        {
            ZhangHongyang.click2shot.init();
        });
    



JavaScript交互实现

你知道吗?JavaScript这门脚本语言在前端开发里可是个大有用处!尤其是做优酷视频截图这种功能,更离不开它。只要写点JavaScript代码,就能搞定播放、暂停这些动态事件,当用户按下截图按钮时,就能让缩略图动起来,用jQuery库弄点儿特效啥的,缩略图就能从视频那儿飞过来然后展示出来了~

安全性考虑与部署方式

要用Canvas.toDataURL来生成图不容易!因为这个方法可能受浏览器安全政策影响而不能用。所以,最好把你写的网页放在像Tomcat这种网站服务器上试试看效果如何,这样就能避免那些安全问题影响到我们的功能!

扩展与优化建议

/**
 * Created with JetBrains WebStorm.
 * User: zhy
 * Date: 14-6-18
 * Time: 上午12:24
 * To change this template use File | Settings | File Templates.
 */
var ZhangHongyang = {};
ZhangHongyang.click2shot = (function ()
{
    var _ID_VIDEO = "video";
    var _ID_SHOTBAR = "shotBar";
    var _videoWidth = 0;
    var _videoHeight = 0;
    var _canvas = null;
    var _ctx = null;
    var _video = null;
    function _init()
    {
        _canvas = document.createElement("canvas");
        _ctx = _canvas.getContext("2d");
        _video = document.getElementById(_ID_VIDEO);
        _video.addEventListener("canplay", function ()
        {
            _canvas.width = _videoWidth = _video.videoWidth;
            _canvas.height = _videoHeight = _video.videoHeight;
            console.log(_videoWidth + " , " + _videoHeight);
            _ctx.fillStyle = '#ffffff';
            _ctx.fillRect(0, 0, _videoWidth, _videoWidth);
            $("#" + _ID_SHOTBAR).click(_click2shot);
            _video.removeEventListener("canplay", arguments.callee);
        });
    }
    function _click2shot(event)
    {
        _video.pause();
        _ctx.drawImage(_video, 0, 0, _videoWidth, _videoHeight, 0, 0, _videoWidth, _videoHeight);
        var dataUrl = _canvas.toDataURL("image/png");
        //创建一个和video相同位置的图片
        var $imgBig = $("");
        $imgBig.width(_videoWidth).height(_videoHeight).css({position: "absolute", left: _video.offsetLeft, top: _video.offsetTop, 
        width: _videoWidth + "px", height: _videoWidth + "px"}).attr("src", dataUrl);
        $("body").append($imgBig);
        //创建缩略图,准备加到shotBar
        var $img = $("");
        $img.attr("src", dataUrl);
        $(this).append($img);
        var offset = _getOffset($img[0]);
        $img.hide();
        //添加动画效果
        $imgBig.animate({left: offset.x + "px", top: offset.y + "px", width: $img.width() + "px", height: $img.height() + "px"}, 200, function ()
        {
            $img.attr("src", dataUrl).show();
            $imgBig.remove();
            _video.play();
        });
    }
    /**
     * 获取元素在显示区域的leftOffset和topOffset
     * @param elem
     * @returns {{x: (Number|number), y: (Number|number)}}
     * @private
     */
    function _getOffset(elem)
    {
        var pos = {x: elem.offsetLeft, y: elem.offsetTop};
        var offsetParent = elem.offsetParent;
        while (offsetParent)
        {
            pos.x += offsetParent.offsetLeft;
            pos.y += offsetParent.offsetTop;
            offsetParent = offsetParent.offsetParent;
        }
        return pos;
    }
    return {init: _init}
})();

除了最基础的截屏功能以外,我们还可以拓展和优化这个模拟视频的功能!比如加入把图片传到服务器上的功能,可以试着做一下GIF动图缩略图的功能,再优化调整一下图片清晰度的设置,这些都能大大提高用户的使用感受和功能的完备程度!

原文链接:https://www.icz.com/technicalinformation/web/2024/04/13837.html,转载请注明出处~~~
0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?