javascript - 我可以使用 .scrollTop 监听 div 中的滚动吗(无 jQuery)

标签 javascript html css

编辑:已解决

这是工作代码(检查 perspective 支持,如果它存在创建 CSS 视差并监听 div 内的滚动效果,否则它默认监听 window.scroll):

html,body {height: 100%; width: 100%;}
#nav {
    display:block;
    background:#d9ffff;
    position:fixed;
    z-index:10000;  
    width:100%;
    height:100px;
    padding-top:0px;
    transition: all 0.6s;
}
.prllx_group {
    position: relative;
    height: 100vh;
}
div {height:400px}
#one {background:#d9d9ff}
#two {background:#d9ffd9}
#three {background:#ffd9d9} 

@supports (perspective: 1px) {  

    body, html {
        overflow: hidden;
        height: 100%;
        width: 100%;
    }
    body {
        -webkit-transform: translateZ(0px);
        transform: translateZ(0px);
    }

    .prllx {
        position:relative;
        height: 45em;
        height: 100vh;
        overflow-x: hidden;
        overflow-y: auto;
        -webkit-perspective: 300px;
        perspective: 300px;
        perspective-origin-x: 100%;
    }
    .prllx_group {
        position:relative;
        -webkit-transform-style: preserve-3d;
        transform-style: preserve-3d;
    }
 }

HTML:

<nav id="nav">
    <ul class="menu">
        <li><a href="#one">ONE</a></li>
        <li><a href="#two">TWO</a></li>
        <li><a href="#three">THREE</a></li>
    </ul>
</nav>

<div id="parallax" class="prllx">

    <div></div>
    <div id="one" class="prllx_group">...</div>
    <div id="two" class="prllx_group">...</div>
    <div id="three" class="prllx_group">...</div>
    <div></div>
 </div>

JS:

    var container = window;
    var scrolledDiv = document.body;
    var hello = 1;

    if( typeof CSS !== "undefined" &&
    typeof CSS.supports !== "undefined" &&
    !CSS.supports("-webkit-overflow-scrolling", "touch") &&
    CSS.supports("perspective", "1px")) {
        var container = document.getElementById('parallax');
        var scrolledDiv = document.getElementById('parallax');
    };

    container.onscroll = function isTheTop() {
    var headerElement = document.getElementById('nav');
    var headerHeight = headerElement.offsetHeight;
    if (scrolledDiv.scrollTop > 80 || document.documentElement.scrollTop > headerHeight) {
        headerElement.style.background='rgba(29,29,29,0.9)'; 
        headerElement.style.paddingTop='0';
        headerElement.style.boxShadow='0 0 0.6em #1d1d1d';

    } else {
        headerElement.style.background='rgba(0,0,0,0)'; 
        headerElement.style.paddingTop='20px';
        headerElement.style.boxShadow='0';
    }
};

我还确保脚本在 HTML 代码之后运行,在页面末尾或延迟运行,然后才能正常工作。

谢谢!


原问题:

我无法让以下脚本监听 div 内的滚动,而不是窗口滚动。如果我尝试使用 CSS 视差效果(即所有内容都在 div 内,它相对于 body 保持静止,并且所有内容都在 div< 内滚动.)

这是我的 CSS

与上面相同的 CSS

这是我的 HTML:

与上面相同的 HTML

这里是 JS(如果我覆盖 @supports,它会起作用——例如,使用 !——所以它默认为未增强的内容):

function isTheTop() {
    var headerElement = document.getElementById('nav');
    var headerHeight = headerElement.offsetHeight;
    if (document.body.scrollTop > 80 || document.documentElement.scrollTop > headerHeight) {
        headerElement.style.background='rgba(29,29,29,0.9)'; 
        headerElement.style.paddingTop='0';
        headerElement.style.boxShadow='0 0 0.6em #1d1d1d';

    } else {
        headerElement.style.background='rgba(0,0,0,0)'; 
        headerElement.style.paddingTop='20px';
        headerElement.style.boxShadow='0';
    }
};
window.onscroll = function() {isTheTop()};

我尝试监听 parallax.onscroll(而不是 window.onscroll),但效果不佳。

最佳答案

如这里所述 https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onscroll 如果您不想在文档正在滚动时触发 onscroll 事件处理程序,但只是这个元素,您应该能够执行此操作:

var scrolledDiv = document.getElementById("myScrollingDiv");
scrolledDiv.onscroll = function(){.....};

或者,如果上述方法不起作用(我现在没有时间重新创建您的案例并立即对其进行测试),您可以这样做:

window.onscroll = function() {isTheTop()};

function isTheTop() {
    if(scrolledDiv.scrollTop > 80) // rest of your code...
}

关于javascript - 我可以使用 .scrollTop 监听 div 中的滚动吗(无 jQuery),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35845719/

相关文章:

css - CSS样式对html元素的差异化应用

javascript - 保护 HTTP API - 无用户密码提示并避免暴露私钥

html - 如何从边框到边框填充整个日历标题?

html - 如何在 Android 上显示时减小网页的字体大小?

javascript - Angular - 检测点击背景 div 但不检测 div

javascript - 单击按钮后如何更改颜色按钮

javascript - 带有参数的代码生成未按预期工作

javascript - 如何在 Rdio Web 播放 API 示例中启动服务器?

javascript - 二维查找表——如何在 javascript 中存储标题

Jquery $ ('.article.active' ).next Issue