css scrollTop和scrollLeft不适用于显示:无元素

zte4gxcn  于 2022-11-19  发布在  其他
关注(0)|答案(4)|浏览(168)

我试图在显示隐藏元素之前滚动它。下面是我正在使用的代码:
第一个
它的工作很好,如果它的显示,但如果它的display:hidden,它将简单地不工作。有没有无论如何,以避免这种情况,使它的工作?
JSF中间文件:http://jsfiddle.net/dpjzJ/

i2byvkas

i2byvkas1#

请使用visibility: hidden;或类似的类:

.hide {
   position: absolute !important;
   top: -9999px !important;
   left: -9999px !important;
}

或者(来自样板文件):

.visuallyhidden { 
  position: absolute; 
  overflow: hidden; 
  clip: rect(0 0 0 0); 
  height: 1px; width: 1px; 
  margin: -1px; padding: 0; border: 0; 
}

display: none;的内容在页面上没有位置,您可能已经知道了。
Check out this article on the subject.

pkwftd7m

pkwftd7m2#

如果您的目标只是将scrollLeft和scrollTop设置为0(因为这是我的目标),一个非常笨拙的解决方案是按照以下步骤操作:

  • 获取对要重置的元素的引用。
  • 获取对元素父级的引用。
  • 从父代中移除元素。
  • 将元素追加回父级。

scrollTop和scrollLeft现在将设置回0,即使它们不可见。

0h4hbjxa

0h4hbjxa3#

function resetScroll(element) {
    element.parentElement.replaceChild(element,element)
}

这会将scrollTop和scrollLeft都设置为0,即使不显示任何内容。
使用示例:

resetScroll(document.getElementById("my_scroll"))
lf5gs5x2

lf5gs5x24#

这并不理想,但我解决这个问题的方法是添加一个一次性的IntersectionObserver,它在元素第一次变为可见时触发。

function onVisible(element, callback) {
  new IntersectionObserver((entries, observer) => {
    entries.forEach(entry => {
      if(entry.intersectionRatio > 0) {
        callback(element);
        observer.disconnect();
      }
    });
  }).observe(element);
}

并像这样使用它:

let myElement = document.querySelector("#myElement");
// When the element first becomes visible, scroll it to 500px:
onVisible(myElement, el=>el.scrollTop=500);

示例:https://jsbin.com/gigumewemo/edit?html,output

相关问题