javascript - jquery 偏移顶部错误值,但在页面调整大小时正确

标签 javascript jquery offset sticky window-resize

我想实现一个像本页左侧导航一样的粘性菜单:http://getbootstrap.com/2.3.2/scaffolding.html .

我的菜单是一个 nav 元素,带有 position:relative(我也试过 static),它会 fixed 当它到达视口(viewport)顶部时。

这是我的功能:

$(document).ready(function() {
    function stickyNav() {
        var elementPosition = $('nav').offset();
        console.log(elementPosition);

        $(window).scroll(function(){
            if($(window).scrollTop() > elementPosition.top){
                $('nav').addClass("sticky");
            } else {
                $('nav').removeClass("sticky");
            }
        });
    }
    stickyNav();
}); //document ready

console.log(elementPosition); 在页面加载时返回大约 1200px 的偏移顶部,这是错误的。但是,如果我调整页面大小,该值会更改为大约 650 像素,这是正确的顶部偏移量,并且该函数会执行它应该执行的操作。

我环顾四周,发现 offsetp top 在隐藏元素上时可能是错误的,或者它有边距问题,但实际上我这里没有任何复杂的结构,只有一个可见的 nav 元素。

如果能帮助解决这个问题,我们将不胜感激!谢谢!!

最佳答案

jQuery(document).ready 处理程序在 DOM 准备就绪时发生。不是在页面完全呈现时。

https://api.jquery.com/ready/

When using scripts that rely on the value of CSS style properties, it's important to reference external stylesheets or embed style elements before referencing the scripts.

In cases where code relies on loaded assets (for example, if the dimensions of an image are required), the code should be placed in a handler for the load event instead.

因此,如果您使用的样式表是在有问题的脚本之后加载的,或者页面布局取决于图像大小或其他内容,则 ready 事件将在页面未处于最终渲染状态。

您可以通过以下方式解决此问题:

  1. 确保在脚本之前包含所有样式表
  2. 确保 CSS 更健壮,并且不太依赖于内容大小(例如图像)
  3. 或者,您可以在窗口 load 事件上执行此操作。

编辑:

如果你想让你的脚本依赖于多个异步事件(比如 loadCSS 库),使用这个:

var docReady = jQuery.Deferred();
var stylesheet = loadCSS( "path/to/mystylesheet.css" );
var cssReady = jQuery.Deferred();
onloadCSS( stylesheet, function() {
    cssReady.resolve();
});
jQuery(document).ready(function($) {
    docReady.resolve($);
});
jQuery.when(docReady, cssReady).then(function($) {
    //define stickyNav

    stickyNav();
});

关于javascript - jquery 偏移顶部错误值,但在页面调整大小时正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38173081/

相关文章:

javascript - 显示 div 标签内输入的 webstorage 值

jquery - CSS border-image 负偏移(无 HTML 版本)

javascript - 使用 Office JS 将文本拖放到 Excel 中的单元格

javascript - Babel 不转译箭头函数 (Webpack)

javascript - 单击停止连续的 jQuery each() 函数并添加事件类

javascript - 如何使用 JavaScript 获取图像尺寸(高度和宽度)

javascript - 您可以使用 .keypress() 中的键码区分左 CTRL 键和右 CTRL 键吗?

javascript - 代码仅适用于 jsfiddle

embedded - 通过将端口的偏移量添加到基地址来访问端口组合。这将如何运作?

c - read() 调用后 Printf 打印垃圾。偏移量始终打印为 0