【问题标题】:jQuery equal height responsive div rowsjQuery等高响应div行
【发布时间】:2018-03-12 08:14:39
【问题描述】:

我知道这个问题已被问过一百万次,但我正在寻找更具体的问题。

由于我的网站是完全响应式的,我需要根据每行调整 div 的大小,而不是全部设置为一个高度。

我正在使用以下修改后的代码来设置容器内所有 div 的高度:

$.fn.eqHeights = function() {
    var el = $(this);
    if (el.length > 0 && !el.data('eqHeights')) {
        $(window).bind('resize.eqHeights', function() {
            el.eqHeights();
        });
        el.data('eqHeights', true);
    }
    return el.each(function() {
        var curTop = 0;
        var curHighest = 0;
        $(this).children().each(function(indx) {
            var el = $(this),
                elHeight = el.height('auto').outerHeight();

            var thisTop = el.position().top;
            if (curTop > 0 && curTop != thisTop) {
                curHighest = 0;
            }

            if (elHeight > curHighest) {
                curHighest = elHeight;
            }

            curTop = thisTop;

        }).height(curHighest);
    });
};

我有var thisTop = el.position().top; 来确定哪些元素位于同一行,但我不确定如何将同一行中的所有元素设置为最大值?

目前.height(curHighest); 将所有元素设置为相同的高度,无论它们是否在同一行。

感谢您的帮助。

【问题讨论】:

  • 您是否尝试过将el.height(curHighest); 放在.each 循环内的末尾,而不是在其后加上.height(curHighest)
  • 是的,我试过了,但它不起作用,因为下一个元素可能有更大的高度,因此循环不能返回并设置行中前一个元素的高度。 :(
  • 是否有一个包含每一行的<div> 不起作用?
  • 问题是行根据浏览器宽度动态不同。每行可能有 4,2 或 1 个元素。

标签: javascript jquery responsive-design equal-heights


【解决方案1】:

设法使用以下 sn-p 进行此工作:

$.fn.eqHeights = function(options) {

    var defaults = {  
        child: false 
    };  
    var options = $.extend(defaults, options); 

    var el = $(this);
    if (el.length > 0 && !el.data('eqHeights')) {
        $(window).bind('resize.eqHeights', function() {
            el.eqHeights();
        });
        el.data('eqHeights', true);
    }

    if( options.child && options.child.length > 0 ){
        var elmtns = $(options.child, this);
    } else {
        var elmtns = $(this).children();
    }

    var prevTop = 0;
    var max_height = 0;
    var elements = [];
    elmtns.height('auto').each(function() {

        var thisTop = this.offsetTop;

        if (prevTop > 0 && prevTop != thisTop) {
            $(elements).height(max_height);
            max_height = $(this).height();
            elements = [];
        }
        max_height = Math.max(max_height, $(this).height());

        prevTop = this.offsetTop;
        elements.push(this);
    });

    $(elements).height(max_height);
};

我还添加了指定某个元素的功能,以便改为更改高度。

用法:

$('.equalheight').eqHeights();
$('.equalheight-frame').eqHeights({child:'.frame'});

【讨论】:

  • 非常感谢您。它比我尝试过的其他几个效果更好,而且大小也只有 10%!
  • 很棒的脚本,当您的 html 包含图像时,请确保在加载时调用它而不是在文档就绪时调用它。如果不是,它可能会在 webkit 上不正确地呈现,因为图像并不总是被考虑在内!
【解决方案2】:

我最近不得不做同样的事情,这就是我最终的结果:

$.fn.equalRowHeights = function() { 

    var count = this.length;

    // set element's height auto so it doesn't mess up when the window resizes
    this.height('auto');

    for (var i = 0; i < count; ) {

        // get offset of current element
        var x = this.eq(i).offset().top;

        // get elements in the same row
        var $rowEls = this.filter(function() {
            return $(this).offset().top === x;
        });

        // set the height elements in the same row
        $rowEls.height( 
            Math.max.apply(null, $rowEls.map(function() { 
                return $(this).height(); 
            }).get()); 
        );

        // set i to avoid unnecessary iterations
        i = $rowEls.filter(':last').index() + 1;    
    }

    var $this = this,
        timer = 0;

    // bind the resize event if it hasn't been added already 
    if (!$this.data('equalRowHeights')) {
        $(window).on('resize.equalRowHeights', function(e) {
            // add a buffer to prevent firing equalRowHeights() too much
            if (timer) {
                clearTimeout(timer);
            }
            timer = setTimeout(function() {
                $this.equalRowHeights();
            }, 50);
        });
        $this.data('equalRowHeights', true);
    }   
};

Here's a fiddle

【讨论】:

    【解决方案3】:

    我采纳了 dclawson 的出色答案并进行了一些修改,使其在其他情况下也能正常工作,尤其是在引导行中常见的嵌套元素。

    $.fn.resEqHeight = function(options) {
        var defaults = {
            child: false
        };
        var options = $.extend(defaults, options);
    
        var $el = $(this);
        if ($el.length > 0) {
            if(!$el.data('resEqHeight')) {
                $(window).bind('resize.resEqHeight', function () {
                    $el.resEqHeight(options);
                });
                $el.data('resEqHeight', true);
            }
        } else {
            console.log("No items found for resEqHeight.");
        }
    
        if( options.child && options.child.length > 0 ){
            var elmtns = $(options.child, this);
        } else {
            var elmtns = $(this).children();
        }
    
        var prevTop = 0;
        var max_height = 0;
        var elements = [];
        elmtns
            .height('auto')
            .each(function() { $(this).data('resEqHeight.top', $(this).offset().top ); })
            .each(function(index) {
                var $el2 = $(this);
                var thisTop = $el2.data('resEqHeight.top');
    
                if (index > 0 && prevTop != thisTop) {
                    $(elements).height(max_height);
                    max_height = $el2.height();
                    elements = [];
                }
                max_height = Math.max(max_height, $el2.height());
    
                prevTop = thisTop;
                elements.push(this);
            });
    
        $(elements).height(max_height);
    };
    

    语法相同

    $('.equalheight').resEqHeight();
    $('.equalheight-frame').resEqHeight({child:'.frame'});
    

    【讨论】:

    • 它基本上在应用高度变化之前存储每个元素的屏幕位置。这是因为,在流畅的布局中,调整一个元素的大小可能会替换集合中后面的元素,导致它们无法与行中的其他项目匹配。
    猜你喜欢
    • 2011-02-06
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    相关资源
    最近更新 更多