我想建立一个无限的水平滚动,在两个方向滚动-左和右.当用户向左滚动时,新内容会被添加到可滚动元素中(例如,滚动日程表历史记录).当它们向右滚动时,内容被追加.

我了解到浏览器在上下滚动时会锚定内容,这真是太棒了,这正是我所期望的.这样做的效果是,将内容预先添加到滚动元素会将用户锚定到当前的逻辑位置,而内容不会"跳转".

但向左或向右滚动时,锚定似乎不起作用.这种行为就好像我设定了overflow-anchor: none.我能做些什么来让它在向上滚动时也能正常工作?

let topCounter = 0;
document.querySelector('.scrollable-top').scrollTo({ top: 100 });
document.querySelector('.scrollable-top').onscroll = (event) => {
  if (event.target.scrollTop < 100) {
    let box = document.createElement('div');
    box.className = 'content-box';
    box.textContent = `${topCounter--}`;
    document.querySelector('.scrollable-top').prepend(box);
  }
};

let leftCounter = 0;
document.querySelector('.scrollable-left').scrollTo({ left: 100 });
document.querySelector('.scrollable-left').onscroll = (event) => {
  if (event.target.scrollLeft < 100) {
    let box = document.createElement('div');
    box.className = 'content-box';
    box.textContent = `${leftCounter--}`;
    document.querySelector('.scrollable-left').prepend(box);
  }
};
.scrollable-top {
  width: 200px;
  height: 250px;
  overflow-y: auto;
  border: solid 1px black;
}

.scrollable-left {
  display: flex;
  width: 250px;
  overflow-x: auto;
  border: solid 1px black;
}

.content-box {
  flex: 1 0 auto;
  height: 150px;
  width: 150px;
  border: solid 1px red;
  display: flex;
  justify-content: center;
  align-items: center;
}
<div class="scrollable-top">
  <div class="content-box">1</div>
  <div class="content-box">2</div>
  <div class="content-box">3</div>
</div>

<div class="scrollable-left">
  <div class="content-box">1</div>
  <div class="content-box">2</div>
  <div class="content-box">3</div>
</div>

推荐答案

使用scrollBy(150, 0)将水平容器向右滚动150:

let topCounter = 0;
document.querySelector('.scrollable-top').scrollTo({ top: 100 });
document.querySelector('.scrollable-top').onscroll = (event) => {
  if (event.target.scrollTop < 100) {
    let box = document.createElement('div');
    box.className = 'content-box';
    box.textContent = `${topCounter--}`;
    document.querySelector('.scrollable-top').prepend(box);
  }
};

let leftCounter = 0;
document.querySelector('.scrollable-left').scrollTo({ left: 100 });
document.querySelector('.scrollable-left').onscroll = (event) => {
  if (event.target.scrollLeft < 100) {
    let box = document.createElement('div');
    box.className = 'content-box';
    box.textContent = `${leftCounter--}`;
    document.querySelector('.scrollable-left').prepend(box);
    
    // solution ------------------
    event.target.scrollBy(150, 0);
  }
};
.scrollable-top {
  width: 200px;
  height: 250px;
  overflow-y: auto;
  border: solid 1px black;
  display: inline-block;    
  float:left;
}

.scrollable-left {
  display: flex;
  width: 250px;
  overflow-x: auto;
  border: solid 1px black;
  float:right;
}

.content-box {
  flex: 1 0 auto;
  height: 150px;
  width: 150px;
  border: solid 1px red;
  display: flex;
  justify-content: center;
  align-items: center;
}
<div class="scrollable-top">
  <div class="content-box">1</div>
  <div class="content-box">2</div>
  <div class="content-box">3</div>
</div>

<div class="scrollable-left">
  <div class="content-box">1</div>
  <div class="content-box">2</div>
  <div class="content-box">3</div>
</div>


根据specs条,以下是此类锚定背后的意图:

滚动框可见区域上方DOM元素的更改可能会导致页面在用户使用内容 timeshift 动.

由于没有水平加载页面,我认为他们没有为水平滚动条实现这一点.此外,除了上述用例之外,实现这种行为是没有意义的.

Note:狩猎doesn't implement overflow-anchor行为.所以,你的垂直滚动代码在Safari中失败了

Javascript相关问答推荐

通过使用100%间隔时间来代表我们还剩多少时间来倒计时

我应该在redux reducer中调用其他reducer函数吗?

Rehype将hashtag呈现为URL

JS—删除对象数组中对象的子对象

保持物品顺序的可变大小物品分配到平衡组的算法

使用原型判断对象是否为类的实例

检索相加到点的子项

使用带有HostBinding的Angular 信号来更新样式?

创建以键值对为有效负载的Redux Reducer时,基于键的类型检测

让chart.js饼图中的一个切片变厚?

将基元传递给THEN处理程序

删除元素属性或样式属性的首选方法

JavaScript将字符串数字转换为整数

如何设置时间选取器的起始值,仅当它获得焦点时?

在使用JavaScript以HTML格式显示Google Drive中的图像时遇到问题

通过ng-绑定-html使用插入的HTML中的函数

如何在函数组件中保留对计时器的引用

使用JavaScript或PHP从div ID值创建锚标记和链接

如何让noWrap在嵌套在Alert/AlertTitle组件中的排版组件中工作?

Oracle APEX-如何调用Java脚本函数