Css 显示后滚动返回默认值:Chrome/IE中无

Css 显示后滚动返回默认值:Chrome/IE中无,css,scroll,browser,standards,behavior,Css,Scroll,Browser,Standards,Behavior,下面是一个例子: 在div容器中向下滚动。然后单击窗口中的任意位置以隐藏元素。然后再次单击以显示该元素。你会注意到在Chrome/IE中,滚动条被重置,但在Firefox中,滚动条仍然保持着你离开滚动条的方式 Chrome/IE或Firefox的标准行为是什么?我应该向Chrome问题追踪者报告吗 提前谢谢你在这方面的帮助,新年快乐,再次感谢,干杯,诸如此类=D我不知道哪一个是正确的,但这是可行的: var offset = 0; $(document).click(function(){

下面是一个例子:

在div容器中向下滚动。然后单击窗口中的任意位置以隐藏元素。然后再次单击以显示该元素。你会注意到在Chrome/IE中,滚动条被重置,但在Firefox中,滚动条仍然保持着你离开滚动条的方式

Chrome/IE或Firefox的标准行为是什么?我应该向Chrome问题追踪者报告吗


提前谢谢你在这方面的帮助,新年快乐,再次感谢,干杯,诸如此类=D

我不知道哪一个是正确的,但这是可行的:

var offset = 0;
$(document).click(function(){
    if($('div:visible').length) {
        offset = $('div').scrollTop();   
    }
    $('div').toggle().scrollTop(offset);
});

我希望有人有更好的解决方案=/

这只是浏览器在显示改变时如何呈现div的一个怪癖

基本上,当显示属性更改时,浏览器会重新流式显示文本

这导致了同样的怪癖

$(document).click(function(){
    $('div').style.display = "block";
});

如果您希望在所有浏览器中滚动保持不变,最简单的方法是使用可见性而不是显示

尽管我不确定这两种浏览器(Chrome或Firefox)中的哪一种遵循了这一标准,但我还是会指责Chrome没有“记住”滚动位置是错误的。换句话说,我支持Firefox的行为,但我不确定哪一个是正确的(标准化的)


在有人指出标准文档中哪一个是正确的之前,我将继续指责Chrome。如果尚未报告,我将向Chrome问题跟踪者报告此错误:P

您可以保存当前的

元素。在
显示之前,滚动顶部
到一些
bufferVar
。当
display:block
时,重置
元素。滚动顶部
返回
bufferVar

但由于一些我不太清楚的原因,这种方法不会立即起作用。使用类似的方法使其工作:

setTimeout(() => { element.scrollTop = bufferVar; }, 100);

我知道是显示属性导致了这种情况。但我想知道的是哪种行为是正确的行为。我希望向那些行为不正确的浏览器报告这一点。重点不是要找到解决这个问题的方法,而是要向浏览器制造商指出这一点。我知道我可以使用可见性而不是显示,如果位置是绝对的,则可以使用-99999 px top。但在这种情况下,如果所有浏览器都像Firefox一样运行,那就太好了。所以我要向Chrome报告这个bug,如果Firefox的行为不是标准行为,那么至少我会稍微改变一下。我更新了你的小提琴,用iFrame进行测试。到目前为止,只有Firefox在隐藏iframe元素后不保留滚动位置。我很奇怪为什么没有
setTimeout()
,它就不能工作,但是有
setTimeout(()=>{element.scrollTop=bufferVar;},0)
它可以。我发现Chrome在
显示:无
显示:flex。我用这个答案解决了这个问题。超时使它明显地跳转和跳回,但它似乎在没有超时的情况下工作(Chrome v85),就像这样,
let oldcoll=window.scrollY;页面[j].style.display=“无”;页面[j+1].style.display=“flex”;滚动到(0,旧滚动)