2

哦哈!

我正在尝试为我网站上的菜单添加一点效果。这是我要创建的事件:
1- 用户加载页面:菜单距离页面顶部 36 像素;
2-用户开始向下滚动阅读内容;
3-当用户滚动了 36px 时,菜单移动到页面的最顶部并停留在那里;
4-用户继续向下滚动,菜单仍然固定在最顶部;
5-用户向上滚动直到到达顶部不到 36px,菜单回到他的第一个位置,距离顶部 36px。

这很有趣,我刚刚注意到 Stack Overflow 正在使用一些代码来完成与我在编写新问题时页面右侧的“类似问题”框完全相同的操作。如果你想有一个概述,只需开始创建一个新问题并观看它。我试图找出他们正在使用什么,但失败了。

为了达到我的效果,我使用了与该scrollTop()属性关联的 jQuery 属性scroll()。这是代码:

$(document).scroll(function() {
        if ($(document).scrollTop() >= 36) {
        $('#menu').css({'top': '0px'});
        } else {
        $('#menu').css({'top': '36px'});
        }
        });

这适用于document,这意味着页面的整个正文。

现在的问题是我想在article具有该overflow-y :scroll属性的元素中使用它。当我谈论<article>元素时,我指的是 HTML5 文档中使用的元素(例如<nav>, <aside>, <section>, <footer>...)。

结果,JQ 没有在 中找到任何滚动,document这是真的,因为现在,整个页面中唯一的滚动在article元素内部。身体从不移动,这是故意的。

所以我尝试了这个:

$('article').scroll(function() {
        if ($('article').scrollTop() >= 36) {
        $('#menu').css({'top': '0px'});
        } else {
        $('#menu').css({'top': '36px'});
        }
        });

还有这个:

$(document).scroll(function() {
        if ($(document).scrollTop() >= 36) {
        $('#menu').css({'top': '0px'});
        } else {
        $('#menu').css({'top': '36px'});
        }
        });

甚至这样:

$('#insidecontent').scroll(function() {
        if ($('#insidecontent').scrollTop() >= 36) {
        $('#menu').css({'top': '0px'});
        } else {
        $('#menu').css({'top': '36px'});
        }
        });

#insidecontent是元素后面的名称,div稍后article您将在 Jsfiddle.net 为您提供的代码中看到。

这是行不通的。不是因为article元素,我正在使用另一个 jQuery 代码来动态调整高度,这也article没有任何问题。我试过没有它。


http://jsfiddle.net/fKkML/1/ 在这里
可以找到带有第一个版本$(document)(它正在工作,只需在“结果”框中滚动即可。overflow-y: scroll



http://jsfiddle.net/BCuez/7/
这里是overflow-y: scroll打开 和的版本$('article'),这是不工作的。

注意:在第二个链接中,溢出由 Jsfiddle.net 以相同的方式处理,似乎这是滚动的整个身体。但正如你所看到的,效果还是被搞砸了。您可以通过创建文件在本地计算机上尝试此代码,您会看到。

注意 2:我必须在这些演示中添加一个margin-top: 70pxto article,但在真实和整个代码中不需要它。

Note3:我是 HTML5/CSS3 的“专业”用户,但不是jQuery,这是我第一次在 Web 的帮助下编写自己的 JQ 代码。我是这个主题的菜鸟,所以如果你能详细说明你的答案以帮助我正确理解它,我真的很感谢你。

在发布此内容之前,我已在此处搜索答案。例如,我发现这个主题与我的有点相关,但不是真的。我没有找到任何真正可以帮助我或与我真正相同的东西。



非常感谢您给我的帮助。我对获得相同结果的其他方法持开放态度,但这种方法似乎非常接近工作。

4

1 回答 1

5

我解决了这个问题。

第一个问题是height因为auto我有另一个动态改变其大小的 JS 代码。height需要定义(px、em、%)。

第二个问题是一开始就失踪window.onload=function(){了。JSFiddle 自己添加了它,我只需要在 chrome 中使用 F12 检查代码。我将它添加到我自己的代码中,它正在工作。

这是您自己可以在自己的代码中使用的最终代码:

jQuery:

window.onload=function(){
    $('article').scroll(function () {
        if ($('article').scrollTop() >= 36) {
            $('#menu').css({
                'top': '0px'
            });
        } else {
            $('#menu').css({
                'top': '36px'
            });
        }
    });
    }

CSS:

article {
    width: 100%;
    height: 500px;
    overflow-y: scroll;
    position: relative;
    z-index: 0;
}

HTML:

<body>
        <ul id="menu">
            <li>    <a href="#">
                                Elem1
                            </a>

            </li>
            <li>    <a href="#">
                                Elem2
                            </a>

            </li>
            <li>    <a href="#">
                                Elem3
                            </a>

            </li>
            <li>    <a href="#">
                                Elem4
                            </a>

            </li>
            <li>    <a href="#">
                                Elem5
                            </a>

            </li>
        </ul>
        <article>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. In eleifend neque in sodales iaculis. Suspendisse porta sodales turpis, ut bibendum justo sagittis at. Vivamus ut laoreet tellus. Integer rutrum vel quam in imperdiet. Cras mattis lacus sem, eu suscipit urna adipiscing et. Etiam convallis, tortor ac gravida luctus, nibh tellus porttitor lorem, vel tempus massa purus sed orci. Donec condimentum dolor velit, convallis auctor velit dapibus sed. Integer commodo ullamcorper libero, in pharetra tortor auctor nec. Donec tristique turpis quis felis posuere feugiat. Fusce molestie elementum gravida. Nulla nec quam et metus gravida ornare eget ac elit. Morbi sit amet massa ornare, euismod dolor fringilla, porttitor felis. Sed mattis orci ante, nec sodales enim varius non. Proin velit justo, ultrices vel mollis id, ultrices a nibh. Aenean lacinia ullamcorper leo, sed adipiscing libero vestibulum nec. Phasellus est erat, tincidunt vel mi non, condimentum vestibulum lacus. Quisque placerat id mauris a hendrerit. Phasellus venenatis eros vel leo blandit, non blandit velit imperdiet. Praesent id erat in risus tristique iaculis a eget orci. Quisque pellentesque hendrerit ante vitae tincidunt. Vivamus placerat nisi purus, a tincidunt ligula elementum ut. Integer in arcu elit. Phasellus facilisis orci sit amet sapien egestas imperdiet. Ut quis risus sodales, rutrum libero rhoncus, tincidunt ipsum. Praesent suscipit eros id lacinia bibendum. Donec erat sem, fringilla et pulvinar nec, aliquet euismod mi.
        </article>
    </body>
  • article是设置的全部内容overflow-y: scroll

  • #menu是滚动时改变位置的DIV。

  • >= 36第 3 行是用户在 DIV 更改其位置之前需要滚动的像素数。

  • 0px第5行是滚动等于或大于36px时DIV的位置。

  • 36px第9行是滚动小于36px时DIV的位置。

您可以在 jQuery 代码中添加所需的每个 CSS 规则。例如,我添加了一行来隐藏同一事件中的一些内容。您还可以添加animate()事件。

祝你好运!

于 2013-07-09T17:17:29.703 回答