加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 资源 > 正文

html – 防止{overflow-y:auto} div中的绝对定位元素触发滚动条

发布时间:2020-12-14 23:26:14 所属栏目:资源 来源:网络整理
导读:有没有办法防止绝对定位的元素在设置overflow-y时触发滚动条?我认为它不会,因为绝对定位的元素通常不会影响父元素的宽度/高度.出于某种原因,在设置overflow-y:auto时确定是否显示滚动条似乎并不重要.有没有办法解决这个问题,而不将下拉内容放在DOM中完全不
有没有办法防止绝对定位的元素在设置overflow-y时触发滚动条?我认为它不会,因为绝对定位的元素通常不会影响父元素的宽度/高度.出于某种原因,在设置overflow-y:auto时确定是否显示滚动条似乎并不重要.有没有办法解决这个问题,而不将下拉内容放在DOM中完全不同的位置?

我只希望通常会使元素增长的东西能够触发滚动条.

这是一个显示问题的codepen:

http://codepen.io/isaksky/pen/zxedXe

解决方法

由于性能问题,IMO用户代理在包装器中呈现绝对定位的元素,而不是以这种方式显示溢出.

因为在滚动期间他们必须重新绘制(并改变位置)与containing block相关的绝对定位元素.

在浮子的存在下发生同样的事情 – 见:

> Why does CSS2.1 define overflow values other than “visible” to establish a new block formatting context?

一种可能的选择是让绝对定位的元素相对于initial containing block(< html>元素所在的位置)而不是位置.

为了实现这一点,我们可以从#dialog-1中删除position:relative,因此绝对定位元素的包含块将是初始包含块.它也随页面一起滚动.

Example Here

function forAllNodes(nodes,fn) {
  Array.prototype.forEach.call(
    nodes,function(node) {
      fn.call(node);
    }
  );
}

var layoutGate = function() {
  forAllNodes(
    document.querySelectorAll('.dropdown-contents'),function() {
      if (this.classList) this.classList.toggle('hide');
    }
  );
};

var intervalId = setInterval(layoutGate,1000);

forAllNodes(
  document.querySelectorAll('.toggle-dropdown-btn'),function() {
    var elm = this;
    elm.addEventListener('click',function() {
      if (intervalId) {
    	clearInterval(intervalId);
   		intervalId = null;    
      }
      layoutGate();
    },false);
  }
);
.wrapper {
  padding-left: 20px;
}

p {
  line-height: 1.3em;
}

#dialog-1 {
  padding: 10px;
  border: 3px solid black;
  width: 400px;
  min-height: 100px;
  max-height: 150px;
  overflow-y: auto;
}

.dropdown-control {
  /* position: relative; */
  margin: 0;
  padding: 0;
}

.toggle-dropdown-btn {
  padding: 0;
  margin: 0;
}

.dropdown-contents {
  list-style-type: none;
  position: absolute;
  /* min-width: 100%; */
  width: 400px;
  background-color: #81d4fa;
  margin: 0;
  padding: 0;
  border: 1px solid green;
  /* top: 100%; */
  /* left: 0; */
}

#dialog-2 {
 padding: 10px;
  border: 3px solid black;
  width: 400px;
  min-height: 100px;
  max-height: 150px;
}

.hide {
  display: none;
}
<div class="wrapper">
  <h1>Div with overflow-y:</h1>
  <div id="dialog-1">
    <p>Stuff in Dialog blah blah</p>

    <div class="dropdown-control">
      <button type="button" class="toggle-dropdown-btn">Toggle Dropdown</button>
      <ul class="dropdown-contents">
        <li>why</li>
        <li>do i </li>
        <li>trigger </li>
        <li>scroll</li>
      </ul>  
    </div>
  </div>

  <h1>Normal div,no overflow-y</h1>
  <div id="dialog-2">
    <p>Stuff in Dialog blah blah</p>
    <div class="dropdown-control">
      <button type="button" class="toggle-dropdown-btn">Toggle Dropdown</button>
      <ul class="dropdown-contents">
        <li>this</li>
        <li>does not </li>
        <li>grow </li>
        <li>the div</li>
      </ul>  
    </div>
  </div>
</div>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读