jQuery outerHeight()&高度变化窗口上的闪烁/失败大小调整为奇​​数像素

时间:2016-09-29 02:41:56

标签: javascript jquery css flicker outerheight

我在页面上有两个并排元素。一个元素具有固定大小(100vh) - .hero-half - 另一个元素具有不同长度的文本流体 - .project-details 。当流体文本容器延伸到比图像容器更高时,我想要一个类来限制它的一个子元素的高度,使总文本容器高度回到与图像高度相等。

HTML:

        <div class="project-details left">
          <h1 class="project">Title</h1>
          <div class="project-summary">
            <div class="summary-container">
              <p>A bunch of paragraphs here</p>
            </div>
            <a class="more" href="#">More</a>
            <a class="less" href="#">Less</a>
          </div>
        </div>
        <div class="hero hero-half right" style="background-image: url('/img/placeholder-vert1.jpg')"></div>

相关的CSS:

.hero-half {
  width: 50%;
  height: 100vh;
}

.project-details {
  width: 50%;
  height: auto;
}

.project-summary .summary-container {
  overflow: hidden;

  &.restrict-height {

    .summary-container {
      // set max height
      max-height: calc(100vh - 615px);
    }
  }
}

这是我的JS代码:

$(function () {

  var bpTab = 1024;

  resize = function() {
    var winWidth = $(window).width();
    var heroHeight = $(".hero-half").outerHeight();
    var boxHeight = $(".project-details").outerHeight();
    var $box = $(".project-summary");

    if ( boxHeight > heroHeight && winWidth > bpTab) {
      // if on desktop layout AND if text is pusing box too big, restrict box height
      $box.addClass("restrict-height");
    } else {
      // if not on desktop or text is not pushing box too big
        $box.removeClass("restrict-height");
      $box.removeClass("is-expanded");
    }; 
  };

  // resize on window resize 
  $(window).bind("resize orientationchange", function(){
    resize(); 
  });

  // resize on page load
  resize();
});

因此,当项目详细信息div达到高于.hero-half的高度时,它会添加一个类,在其中一个子项上设置最大高度,这会使.project-details的总高度恢复到相等或者少于.hero-half。

然而,当我调整窗口大小以强制文本将项目细节高度推得太高并触发限制高度类时,它仅在屏幕宽度和高度加起来为偶数时才起作用(宽度和宽度都是高度均匀,或两者都是奇数)。如果它是一个奇数总数,那么项目细节的外部高度似乎计算不正确。

我认为,问题在于.project-details的outerHeight有时会在它受限制的文本高度之前的自然高度计算,有时它会在该类之后计算出来。应用并在文本高度限制之后,因此将.project-details高度降低到可接受的范围。

我已经尝试为类的添加添加超时延迟,希望额外的时间意味着outerHeight计算始终是正确的,但它并没有产生影响。

如何更改此JS代码以确保.project-details outerHeight始终在应用restrict-height类之前读取高度?

并且相关:为什么奇数像素尺寸会对此产生影响?

1 个答案:

答案 0 :(得分:0)

解决方案是在if / else循环之前添加一个重置来标准化div高度,删除可能首先改变其高度的额外类。

var $box = $(".project-summary");

// reset
$box.removeClass("restrict-height");
$box.removeClass("is-expanded");

var winWidth = $(window).width();
var heroHeight = $(".hero-half").outerHeight();
var boxHeight = $(".project-details").outerHeight();