用于显示滚动容器的位置绝对div的CSS

时间:2016-07-28 18:54:20

标签: html css

对于此问题,页面上有两个容器。每个都设置为overflow:auto。

在上部容器(绿色)中,我们有一系列按钮。每个按钮切换弹出窗口的显示(蓝色)。无论上部容器的滚动位置如何,该蓝色容器都需要显示在下部容器(红色)的顶部。

通过将弹出窗口设置为position:absolute,我们可以获得部分路径。如此截图中所示。

enter image description here

但是,当我们进一步向下滚动并尝试单击之前隐藏的按钮时,它不会正确地位于按钮下方。

enter image description here

我想要一个解决方案,不需要按下按钮进行Javascript计算。我也不想使用固定位置,因为我希望即使在页面调整大小时弹出窗口仍保留在按钮下。

以下是重现此问题的代码。

  function togglePopup(index) {
    var element = document.getElementById('popup'+index);

    if (element.style.display === 'none') {
      element.style.display = '';
    } else {
      element.style.display = 'none';
    }
  }
  .outerWrapper {
    width: 200px;
    height: 400px;
  }

  .upper {
    height: 30%;
    overflow:auto;
    border: 1px solid green;
  }

  .lower {
    height: 70%;
    overflow: auto;
    border: 1px solid red;
  }

  .row {
    height: 70px;
  }

  .popup {
    border: 1px solid blue;
    background-color: white;
    height: 100px;
    width: 50px;
    position:absolute;
  }
<div class="outerWrapper">

  <div class="upper">
    <div class="row">
      <button onclick="togglePopup(1)">test</button>
      <div class="popup" id="popup1" style="display:none">
        popup content
      </div>
    </div>
    <div class="row">
      <button onclick="togglePopup(2)">test</button>
      <div class="popup" id="popup2" style="display:none">
        popup content
      </div>
    </div>
    <div class="row">
      <button onclick="togglePopup(3)">test</button>
      <div class="popup" id="popup3" style="display:none">
        popup content
      </div>
    </div>
  </div>

  <div class="lower">


  </div>


</div>

1 个答案:

答案 0 :(得分:0)

以下是使用vanilla javascript的一种可能方法:

var buttons = document.getElementsByTagName('button');
var popups = document.getElementsByClassName('popup');

function togglePopup() {

    var index = Array.prototype.indexOf.call(buttons,this);

    var popup = popups.item(index);
    getComputedStyle(popup,null).display === 'none' ? popup.style.display = 'block' : popup.style.display = 'none';

	for (var i = 0; i < popups.length; i++) {
		if (i === index) {continue;}
        var popup = popups[i];
        popup.style.display = 'none';
    }

}

for (var i = 0; i < buttons.length; i++) {
    var button = buttons[i];
    button.addEventListener('click',togglePopup,false);
}
.box, .box button {
display: block;
position: relative;
}

.box {
width: 200px;
overflow: auto;
}

.top {
height: 120px;
border: 1px solid rgb(0,191,0);
}

.bottom {
height: 280px;
border: 1px solid rgb(255,0,0);
}

.box button {
margin-bottom: 60px;
}

.popup {
display: none;
position: absolute;
top: 0;
left: 0;
background-color: rgb(255,255,255);
border: 1px solid rgb(0,0,255);
width: 50px;
height: 100px;
}
<div class="box top">
<button>test</button>
<button>test</button>
<button>test</button>
</div>

<div class="box bottom">
<div class="popup">popup 1 content</div>
<div class="popup">popup 2 content</div>
<div class="popup">popup 3 content</div>
</div>