• 如果转载优酷、土豆视频等,怎么让视频自适应宽度?


    工作开发中要做前端展示优酷、土豆视频,但遇到视频尺寸不能自适应,研究了一下,有以下两种方法符合自己的需要:

    首先看一下优酷、土豆分享视频的html代码:

    1、优酷:

    <iframe height=498 width=510 src="http://player.youku.com/embed/XMTU1MDgzMjM5Ng==" frameborder=0 allowfullscreen></iframe>

    2、土豆:

    <iframe src="http://www.tudou.com/programs/view/html5embed.action?type=2&code=xQ5vDA_iuJk&lcode=RGsNNPq-7p0&resourceId=0_06_05_99" allowtransparency="true" allowfullscreen="true" allowfullscreenInteractive="true" scrolling="no" border="0" frameborder="0" style="480px;height:400px;"></iframe>

     ...........

    解决方法一,javascript实现:

    获取获取浏览器显示区域的高度,然后根据原视频的高、宽比例,计算出新的高、宽,来调整iframe的尺寸

    使用jquery代码:

       $(function () {
                 resizeIframe();
                 $(window).resize(function () {
                     resizeIframe();
                 });
             });
    
    //调整iframe尺寸的方法
     function resizeIframe() {
                var expectWidth = $(document).width() * 0.9; //总宽度为屏幕宽度的0.9倍
              
                $("iframe").each(function () {
                    expectWidth = $(this).parent().width();
                    $(this).height(expectWidth * $(this).height() / $(this).width());
                    $(this).width(expectWidth);
                });
            }

    不使用jquery的代码,比较麻烦一点:

    function resizeIAllframe() {
                 var clientWidth = document.body.clientWidth;
                 clientWidth = clientWidth.toString().replace("px", "");
                 clientWidth = clientWidth * 0.9;
                 console.log(clientWidth);
    
                 for (var j = 0; j < document.getElementsByTagName("iframe").length ; j++) {
                     resizeVideo(document.getElementsByTagName("iframe")[j], clientWidth);
                 }
             }
    
             function resizeIframe(objElement, exepectWidth) {
                 var flag = 0; //是否style中定义高宽
                 var height = objElement.height;
                 var width;
                 if (!height) {
                     height = objElement.style.height;
                     flag = 1;
                 }
                 if (flag) {
                     width = objElement.style.width;
                 } else {
                     width = objElement.width;
                 }
    
                 if (width) {
                     width = width.replace("px", "");
                 }
                 if (height) {
                     height = height.replace("px", "");
                 }
                 if (flag) {
                     objElement.style.width = exepectWidth + "px";
                     objElement.style.height = (exepectWidth * height / width) + "px";
    
                 } else {
                     objElement.width = exepectWidth + "px";
                     objElement.height = (exepectWidth * height / width) + "px";
                 }
             }
    
    //页面加载完后执行
     window.onload = function () {
                resizeIAllframe();
             };
    
    //窗口尺寸调整时执行
      window.onresize = function () {
                 resizeIAllframe();
             };

    第二种方法,后台实现:

    直接在服务器端用正则处理视频的尺寸,前提是需要客户端传过来一个期望宽度

    /// <summary>
            /// 转换视频的内容,主要处理视频的尺寸
            /// </summary>
            /// <param name="videoContent"></param>
            /// <returns></returns>
            private string ChangeVideoContent(string videoContent, int expectWidth)
            {
                //<iframe(.*?)</iframe>
                //height="(?<height>d*)"
                string iframePattern = @"<iframe(.*?)</iframe>";
                string heightPattern = @"height[:=][""]?(?<height>d*?)(px| |"")";
                string widthPattern = @"width[:=][""]?(?<width>d*?)(px| |"")";
                int sWidth, sHeight;
    
                return Regex.Replace(videoContent, iframePattern, t =>
                     {
                         var heightStr = Regex.Match(t.Value, heightPattern, RegexOptions.Singleline).Groups["height"].Value;
                         if (string.IsNullOrEmpty(heightStr))
                         {
                             return t.Value;
                         }
                         sHeight = int.Parse(heightStr);
    
                         var widthStr = Regex.Match(t.Value, widthPattern, RegexOptions.Singleline).Groups["width"].Value;
                         if (string.IsNullOrEmpty(widthStr))
                         {
                             return t.Value;
                         }
                         sWidth = int.Parse(widthStr);
    
                         string result = Regex.Replace(t.Value, heightPattern, p => p.Value.Replace(p.Groups["height"].Value, (sHeight * expectWidth / sWidth).ToString()), RegexOptions.Singleline);
    
                         result = Regex.Replace(result, widthPattern, p => p.Value.Replace(p.Groups["width"].Value, (expectWidth).ToString()), RegexOptions.Singleline);
    
                         return result;
                     }, RegexOptions.Singleline);
            }

    每种方法都有自己的特点,自己感觉哪个合适用哪个。

  • 相关阅读:
    使非标准 Win32 控件或自画控件也具有 Windows XP 的界面风格
    MapInfo格式到ArcInfo格式的转换
    DICOM医学图像文件格式
    香港身份证
    Cheap Tricks: Let's Talk About METADATA TypeLibs
    ASP中使用ADO访问数据源
    DirectX 9 编程 DirectX窗口
    3DES Source Code
    OLEDB Resource(Session) Pooling (在Ado开发中使用连接池)
    《仙剑奇侠传4》仙剑问答全答案
  • 原文地址:https://www.cnblogs.com/straw/p/5443899.html
Copyright © 2020-2023  润新知