【问题标题】:jQuery function triggered on window resize but not on page loadjQuery 函数在窗口调整大小时触发但不是在页面加载时触发
【发布时间】:2012-08-13 04:23:08
【问题描述】:

我发现这个 jQuery 代码允许在水平和垂直方向上都没有固定尺寸的 div 居中。它适用于窗口的高度和宽度。因此,当我调整窗口大小时,div 仍然在窗口中居中。

我的问题是,现在,除非我先调整窗口大小,否则它不起作用。因此,如果我只是加载页面,除非我手动调整窗口大小,否则 div 不会居中。

当然,这并不理想。所以我试图找到解决方法。但是我的 jQuery 技能非常有限,我现在卡住了。

这是我正在处理的页面:http://dev.manifold.ws/test2/(尝试调整窗口大小以查看我所描述的内容)

这是我正在使用的 jQuery:

$(document).ready(function(){

$(window).resize(function(){

    $('.img-holder').css({
        position:'absolute',
        left: ($(window).width() - $('.img-holder').outerWidth())/2,
        top: ($(window).height() - $('.img-holder').outerHeight())/2
    });

});
// This is suppose to initially run the function but it doesn't seem to work
$(window).resize();

});

有人知道如何解决这个问题吗? 谢谢!

-汤姆

【问题讨论】:

标签: jquery resize onload centering fluid-layout


【解决方案1】:
$(document).ready(function(){
    doResize();
    $(window).on('resize', doResize);
});

function doResize() {
    $('.img-holder').css({
        position:'absolute',
        left: ($(window).width() - $('.img-holder').outerWidth())/2,
        top: ($(window).height() - $('.img-holder').outerHeight())/2
    });
}

FIDDLE

【讨论】:

  • 嗨,adeno,感谢您的建议。不幸的是,它仍然不起作用。看着你的小提琴,我注意到唯一与我的代码不同的是你为 .img-holder 分配了固定的宽度和高度。当我也为类分配固定尺寸时,它实际上确实有效。但我不能这样做,因为它会在我调整窗口大小时阻止图像调整大小。这就是为什么我首先使用 jQuery 将图像居中的原因。知道我怎样才能让它工作吗?谢谢!
  • 你做错了什么或者我不知道你在做什么?如果您将图像大小设置为 100%,它应该缩放到父元素,并且 .img-holder 元素需要有一个大小,如果您要获得宽度和高度来在您的 javascript 中进行调整大小计算,否则它将大多数情况下只返回“auto”。
【解决方案2】:

试试这个:

function adoptToSize() {
    $('.img-holder').css({
        position:'absolute',
        left: ($(window).width() - $('.img-holder').outerWidth())/2,
        top: ($(window).height() - $('.img-holder').outerHeight())/2
    });
}

$(document).ready(adoptToSize);
$(window).resize(adoptToSize);

【讨论】:

  • @ComputerArts Well adeneo 甚至更快 :)
  • 嗨,Ridcully,感谢您的建议。当我为 img-holder 类分配固定尺寸时,您的代码有效。但是当我不这样做时,我仍然遇到同样的问题。我不想为 img-holder 分配固定尺寸的原因是因为我在 img 上使用了 max-width:100% ,以便它们会针对较小的窗口调整大小。知道如何在不为 img-holder div 分配尺寸的情况下使 jQuery 工作吗?谢谢!
  • @thom_p:我认为 Kobi 是对的,您应该在 load 事件上而不是在 ready 事件上第一次调用 adaptToSize(),因为(正如 jquery 自豪地声明的那样)ready 事件被触发加载页面的 HTML 后,在加载所有图像和其他内容之前。此时(图像未加载)图像的大小尚不清楚,因此计算将无法正常工作。在触发 load 事件时,应该加载所有内容,因此图像的大小应该可用。
【解决方案3】:

为什么不

$(document).ready(function() { 
    resize();
});

$(window).resize(function(){
    resize();    
});

function resize() {
    $('.img-holder').css({
        position:'absolute',
        left: ($(window).width() - $('.img-holder').outerWidth())/2,
        top: ($(window).height() - $('.img-holder').outerHeight())/2
    });
}

【讨论】:

    【解决方案4】:

    试试这个。你不能像这样调用回调函数。

    $(document).ready(function(){

    $(window).resize(function(){

    $('.img-holder').css({
        position:'absolute',
        left: ($(window).width() - $('.img-holder').outerWidth())/2,
        top: ($(window).height() - $('.img-holder').outerHeight())/2
    });
    

    });

    $('.img-holder').css({
        position:'absolute',
        left: ($(window).width() - $('.img-holder').outerWidth())/2,
        top: ($(window).height() - $('.img-holder').outerHeight())/2
    });
    

    });

    【讨论】:

      【解决方案5】:

      尝试类似:

      +function($, window){
        var resizeWin = function(){
            $('.img-holder').css({
                position:'absolute',
                left: ($(window).width() - $('.img-holder').outerWidth())/2,
                top: ($(window).height() - $('.img-holder').outerHeight())/2
            });
        }
      
        $(function(){ resizeWin() });
        $(window).bind('resize',resizeWin);
      }(jQuery, window, undefined);
      

      【讨论】:

        【解决方案6】:

        请记住,$(document).ready 发生在 DOM 准备好之后,但在所有内容加载之前

        您的<img /> 可能在您首次触发调整大小功能时尚未加载...
        尝试使用文档的load 事件或图像的加载事件。

        然而,这里最好的解决方案是给图像一个固定的大小:

        <img src="img/test.jpg" style="width:800px;height:519px;" />
        

        或:

        .img-holder img {width:800px;height:519px;}
        

        【讨论】:

        • 好的,CSS 并没有走得太远。我很确定您可以使用 display:table-cell 来垂直对齐内容,但我认为您需要更多元素。
        • 嗨,Kobi,你是对的,当我为图像或 div 提供固定大小时,它就可以工作。但是,我依靠 jQuery 将图像居中的原因是因为我在 img 上使用了 max-width:100% ,这样当窗口变小时它们会调整大小。但是,如果我为 img 或 div 分配固定尺寸,则当窗口较小时,它不再调整大小。知道如何使 jQuery 工作而不必为图像或 div 提供固定大小吗?谢谢!
        • @thom_p - 你好 - 尝试使用 load 事件:$(document).on('load 而不是 $(document).ready(
        【解决方案7】:

        同时绑定 load 和 resize 事件,如下所示:

        $(window).on('load resize', function () {
        // your code
        });
        

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 2014-04-03
          • 2016-10-31
          • 2021-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多