ScrollTo无法与滚动捕捉和100vh容器一起使用

时间:2020-01-29 13:58:30

标签: javascript html css scroll-snap js-scrollto

当我有一个.sections容器,里面装有几个.section元素,并且设置了滚动快照时,如果我将该部分的固定高度设为100vh,它将可用。没有高度,滚动快照将不起作用。没问题,除非没有固定的高度,scrollTo可以正常工作,而当我向该部分添加高度时,scrollTo不再有效。

这里是一个例子。您可以在height: 100vh; CSS中的.section行中注释掉,看到单击任意位置将向下滚动到第3部分,但是打开高度后它将不会滚动。

我已经尝试console.log滚动到的位置并且它是正确的,但是滚动实际上并没有发生。关于为什么这不符合我的意愿的任何想法?

注意:我在最新的Chrome浏览器中看到了这种现象。我尚未测试其他浏览器。

// Click on document to scroll to section 3
document.body.onclick = function() {
    console.log('SCROLLING...');
    const el = document.getElementById('s3');
    const pos = el.getBoundingClientRect();
    window.scrollTo(0, pos.top); 
}
* {
    box-sizing: border-box;
}

html,
body {
    margin: 0;
    padding: 0;
}
.sections {
    overflow-y: scroll;
    scroll-snap-type: y mandatory;
    /**
     * Adding the below line breaks scrollto, removing 
     * it breaks scroll-snap....
     */
    height: 100vh; 
}
.section {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
    overflow: hidden;
    position: relative;
    border: 5px solid deeppink;
    font-size: 30px;
    font-weight: bold;

    scroll-snap-align: center;
}
<html>
    <body>
        <div class="sections">
            <div class="section" id="s1">SECTION 1</div>
            <div class="section" id="s2">SECTION 2</div>
            <div class="section" id="s3">SECTION 3</div>
            <div class="section" id="s4">SECTION 4</div>
            <div class="section" id="s5">SECTION 5</div>
        </div>
    </body>
</html>

1 个答案:

答案 0 :(得分:0)

感谢@Temani Afif的评论。他们正确地指出,我无法使用主体进行滚动,我需要使用.sections容器进行滚动。

这是一个可行的示例:

// Click on document to scroll to section 3
document.body.onclick = function() {
    console.log('SCROLLING...');
    const el = document.getElementById('s3');
    const pos = el.getBoundingClientRect();
    const sections = document.querySelector('.sections');
    sections.scrollTo(0, pos.top); 
}
* {
    box-sizing: border-box;
}

html,
body {
    margin: 0;
    padding: 0;
}
.sections {
    overflow-y: scroll;
    scroll-snap-type: y mandatory;
    height: 100vh; 
}
.section {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
    overflow: hidden;
    position: relative;
    border: 5px solid deeppink;
    font-size: 30px;
    font-weight: bold;

    scroll-snap-align: center;
}
<html>
    <body>
        <div class="sections">
            <div class="section" id="s1">SECTION 1</div>
            <div class="section" id="s2">SECTION 2</div>
            <div class="section" id="s3">SECTION 3</div>
            <div class="section" id="s4">SECTION 4</div>
            <div class="section" id="s5">SECTION 5</div>
        </div>
    </body>
</html>