【问题标题】:Keep scroll position in div as sibling div shrinks or expands? [duplicate]当兄弟 div 缩小或扩展时,保持 div 中的滚动位置? [复制]
【发布时间】:2017-04-28 22:40:02
【问题描述】:

这是我目前拥有的: https://jsfiddle.net/Lt4cmfbo/

CSS

.parent {
    position: relative;
    float: none;
    height: 400px;
    width: auto;
    background: purple;
    overflow: hidden;
    display: flex;
    flex-direction: column;
}

.childOne {
  background: blue;
  width: 100%;
  height: auto;
  overflow-y: auto;
  flex-grow: 1;
}

.childTwo {
  background: red;
}

.input-chat {
    background-color: white;
    margin: 5px auto;
    border: solid 1px #000;
    min-height:10px;
    max-height: 100px;
    overflow: auto;
    width: 95%;
}

HTML

<div class="parent">
  <div class="childOne">
    <p>
      content #1
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      hello
    </p>
  </div>
  <div class="childTwo">
      <div class="input-chat" contentEditable="true"></div>
  </div>
</div>

基本上,我正在尝试建立聊天。父 div 内部是两个子 div:顶部是可滚动的(用于显示消息),底部是用于键入要发送的消息。

我正在使用弹性框来控制高度,以便两个子 div 一起始终等于父 div 高度。底部子 div 必须根据内容扩展或缩小(我已经做过),而顶部子 div 根据底部子 div 的高度扩展或缩小(我也做过)。

问题是我还希望顶部 div 在其高度变化时保持其滚动位置。如果我滚动到顶部子 div 的底部并看到“你好”,我希望在底部 div 中输入几行时仍然看到“你好”。但相反,底部 div 似乎隐藏了它,除非我手动滚动以显示它。

我希望这足够清楚,但如果不是,我可以尝试用其他方式解释。

我希望我的答案是 CSS(或 CSS3),但如果这不可能,jquery 或纯 javascript 就可以了。

【问题讨论】:

  • 如果你可以使用 jQuery,你可以使用 Scroll 并在滚动事件中保存滚动位置,然后当用户按下“Enter”时滚动回到那里
  • 问题在于,我希望它在用户点击“输入”之前准确地保持在原来的位置。话虽这么说,你已经给了我一个关于如何用 jquery 解决这个问题的想法......但我想知道是否有更清洁的解决方案?当我最初搞砸这个时,我在“childTwo”类中添加了一个最小高度。这实际上阻止了顶部的孩子滚动(以我想要的确切方式),但它弄乱了底部 div 的外观,所以我无法保留它。
  • 我想这个答案解决了它(如何让滚动保持在底部):stackoverflow.com/a/34330934/2827823 .... 让我知道如果是这样,我把它作为一个骗子关闭
  • 是的!!!这正是我所需要的。太感谢了! @LGSon

标签: javascript jquery html css


【解决方案1】:

设置scrollTop等于scrollHeight

let c1 = document.querySelector('.childOne'),
  c2 = document.querySelector('.childTwo>div'),
  b = document.querySelector('button');

b.addEventListener(
  'click', () => {
    c1.innerHTML += '<br>' + c2.innerHTML;
    c1.scrollTop = c1.scrollHeight;
    c2.innerHTML = '';
    c2.focus();
  },
  false);
.parent {
  position: relative;
  float: none;
  height: 400px;
  width: auto;
  background: purple;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
.childOne {
  background: blue;
  width: 100%;
  height: auto;
  overflow-y: auto;
  flex-grow: 1;
}
.childTwo {
  background: red;
}
.test {
  background-color: white;
  margin: 5px auto;
  border: solid 1px #000;
  min-height: 10px;
  max-height: 100px;
  overflow: auto;
  width: 95%;
}
<div class="parent">
  <div class="childOne">
    <p>
      content #1
      <br><br><br><br><br><br><br><br><br>
      <br><br><br><br><br><br><br><br><br>
      <br><br>hello
    </p>
  </div>
  <div class="childTwo">
    <div class="test" contentEditable="true"></div>
    <button>
      Add</button>
  </div>
</div>

【讨论】:

  • 感谢您的回答!但我可能不清楚:我的问题是随着底部子 div 的扩展,它会覆盖顶部 div 内的内容。因此,如果我滚动到显示“你好”的底部并开始输入几行,扩展的 div 现在会覆盖“你好”,即使高度似乎调整得很好。
猜你喜欢
  • 2014-04-24
  • 2012-05-15
  • 2013-05-31
  • 1970-01-01
  • 2014-09-13
  • 2022-09-24
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
相关资源
最近更新 更多