【问题标题】:Proportionally resize iframe to fit in a DIV using jQuery使用 jQuery 按比例调整 iframe 的大小以适合 DIV
【发布时间】:2013-09-21 05:58:39
【问题描述】:

我在 div 中有一个视频的 iframe,如下所示:

<div class="media">
    <iframe>
</div>

我在窗口调整大小时动态设置 DIV 的大小。

我想缩放 iframe 以适应 div,同时保持其纵横比。大多数代码都处理缩放图像,这更容易。

这是我目前所拥有的,但它不起作用:

jQuery.fn.fitToParent = function()
{
    this.each(function()
    {
        var width  = jQuery(this).width();
        var height = jQuery(this).height();
        var parentWidth  = jQuery(this).parent().width();
        var parentHeight = jQuery(this).parent().height();

        if(width < parentWidth)
        {
            newWidth  = parentWidth;
            newHeight = newWidth/width*height;
        }
        else
        {
            newHeight = parentHeight;
            newWidth  = newHeight/height*width;
        }

        jQuery(this).css({
            'height'     :newHeight,
            'width'      :newWidth'
        });
    });
};

基本上,我希望复制“背景大小:包含”对 CSS 中的图像所做的调整,但对于 DIV 中的 iframe。

感谢您的帮助!

【问题讨论】:

    标签: jquery scale aspect-ratio


    【解决方案1】:

    指出三个问题:

    1. 您的示例中有一个错误(尾随引号):

      :newWidth'

    2. 您需要设置 iframe 的实际高度和宽度属性,而不是样式。设置 iframe 大小的样式无效:

      $(this).width(newWidth);
      $(this).height(newHeight);
      
    3. 纵横比的计算错误(需要比较比率以查看它们重叠的方式)。如果没有这个,就不能满足所有重叠情况。

      var aspect = width/height;
      var parentAspect = parentWidth/parentHeight;
      if (aspect > parentAspect)
      {
          newWidth  = parentWidth;
          newHeight = newWidth / aspect;
      }
      else
      {
          newHeight = parentHeight;
          newWidth  = newHeight * aspect;
      }
      

    我还稍微清理了代码以加快元素访问速度。每次调用 jQuery(this) 都会花费周期。

    JSFiddle 在这里:http://jsfiddle.net/TrueBlueAussie/ZJDkF/8/

    更新:

    jsfiddle 现在有 4 种不同重叠场景的示例,每个场景都保留了 iframe 的比例。我还添加了你提到的窗口调整大小,并用它动态调整第一个 div 的大小来演示。

    【讨论】:

    • 这太棒了,做得很好。我会尽快奖励赏金。
    • Safari 会在调整大小时降低比率,因为舍入误差会累加。所以我保存了显示的纵横比,他们将这个比例用于所有未来的尺寸:jsfiddle.net/ZJDkF/9
    【解决方案2】:

    随着时间的推移,我对@TrueBlueAussie 的答案确实有所改进,并认为我会在此处发布更复杂的答案以供将来参考。

    在此处将其作为 GitHub 上的插件:https://github.com/drewbaker/fitToParent

    这里是 jQuery 插件:

    jQuery.fn.fitToParent = function (options) {
    
        this.each(function () {
    
            // Cache the resize element
            var $el = jQuery(this);
    
            // Get size parent (box to fit element in)
            var $box;
            if( $el.closest('.size-parent').length ) {
                $box = $el.closest('.size-parent');
            } else {
                $box = $el.parent();
            }
    
            // These are the defaults.
            var settings = jQuery.extend({  
                    height_offset: 0,
                    width_offset: 0,
                    box_height: $box.height(),
                    box_width: $box.width(),
            }, options );
    
            // Setup box and element widths
            var width = $el.width();
            var height = $el.height();
            var parentWidth = settings.box_width - settings.width_offset;
            var parentHeight = settings.box_height - settings.height_offset;
    
            // Maintin aspect ratio
            var aspect = width / height;
            var parentAspect = parentWidth / parentHeight;
    
            // Resize to fit box
            if (aspect > parentAspect) {
                newWidth = parentWidth;
                newHeight = (newWidth / aspect);
            } else {
                newHeight = parentHeight;
                newWidth = newHeight * aspect;
            }
    
            // Set new size of element
            $el.width(newWidth);
            $el.height(newHeight); 
    
        });
    };
    

    所以,假设你有这样的 HTML:

    <div id="wrapper">
        <iframe width="720" height="405" src="//player.vimeo.com/video/19223989"></iframe>
    </div>
    

    插件最基本的调用方式是这样的:

    jQuery('#wrapper iframe').fitToParent();
    

    但我会经常将#wrapper 设置为接近窗口的高度和宽度,如下所示:

    // Get window height and width
    var winHeight = jQuery(window).height();
    var winWidth = jQuery(window).width();
    
    // Set wrapper height/width to that of window
    jQuery('#wrapper').height(winHeight).width(winWidth);
    
    // Size Iframe
    jQuery('#wrapper iframe').fitToParent({
        height_offset: 100, // Put some space around the video
        width_offset: 100, // Put some space around the video
    });
    

    您还可以输入自定义框大小以适应元素,如下所示:

    // Get window height and width
    var winHeight = jQuery(window).height();
    var winWidth = jQuery(window).width();
    
    // Size element
    jQuery('#wrapper iframe').fitToParent({
        height_offset: 100, // Put some space around the video
        width_offset: 100, // Put some space around the video
        box_height: winHeight, // Force use of this box size
        box_width: winWidth // Force use of this box size
    });
    

    我还添加了将 CSS 类“size-parent”设置为父元素的功能,然后它将使用该父元素作为框大小。一个完整的例子:

    // HTML like this
    <div id="wrapper" class="size-parent">
        <div class="media">
            <iframe width="720" height="405" src="//player.vimeo.com/video/19223989"></iframe>
        </div>
    </div>
    
    // jQuery like this
    jQuery('.media iframe').fitToParent();    
    

    如果您不设置 .size-parent,它将回退到元素父级。如果您设置 box_height/box_width 参数,那么这些参数显然会覆盖所有内容。

    现在,为了展示它的强大功能,试试这个垂直居中、水平居中纵横比正确的 iFrame!

    // CSS like this
    #wrapper {
        text-align: center;
        display: table-cell;
        vertical-align: middle;
    }
    #wrapper iframe {
        display: inline-block;
    }
    
    // HTML like this
    <div id="wrapper" class="size-wrapper">
        <iframe width="720" height="405" src="//player.vimeo.com/video/19223989"></iframe>
    </div>
    
    // jQuery like this
    // Get window height and width
    var winHeight = jQuery(window).height();
    var winWidth = jQuery(window).width();
    
    // Size wrapper
    jQuery('#wrapper').height( winHeight ).width( winWidth );
    
    // Size element
    jQuery('#wrapper iframe').fitToParent({
        height_offset: 200, // Put some space around the video
        width_offset: 200, // Put some space around the video
    });
    
    // Fit iFrame to wrapper
    jQuery('#wrapper iframe').fitToParent();
    

    在现实生活中,我将 jQuery 包装在一个函数中,然后在调整窗口大小时调用该函数以获得真正的响应式 iFrame!

    【讨论】:

      【解决方案3】:

      这里:

      http://jsfiddle.net/fFTS8/

        <div id="test" style="width:300px;height:200px;background:red;"></div>
        <script src="js/vendor/jquery-1.10.2.min.js"></script>
        <script type="text/javascript">
           jQuery.fn.fitToParent = function()
           {
              var that = this;
      
              function rezise() {
                 that.each(function()
                 {
                   var a = $(this).width();
                   var b = $(this).height();
                   var c = $(this).parent().width();
                   var d = $(this).parent().height();
      
                   var ab = a/b;
                   var cd = c/b;
      
                   var e, f = 0; // e - newWidth, f - newHeight
      
                   if(ab > cd) {
                      e = c;
                      f = c*b/a;
                   } else {
                      e = a*d/b;
                      f = d;
                   }
      
                   $(this).width(e);
                   $(this).height(f);
                 });
              }
      
              $(window).resize(function() {
                 rezise();
              });
           };
           $('#test').fitToParent();
      
        </script>
      

      【讨论】:

      • 根据提问者的说法,iframe 旨在调整为父 div 的大小。这个是向后的,将 div 的大小调整为 JSFiddle iframe。
      猜你喜欢
      • 1970-01-01
      • 2011-12-06
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多