jQuery在窗口上调整大小


190

我有以下JQuery代码:

$(document).ready(function () {
    var $containerHeight = $(window).height();
    if ($containerHeight <= 818) {
        $('.footer').css({
            position: 'static',
            bottom: 'auto',
            left: 'auto'
        });
    }
    if ($containerHeight > 819) {
        $('.footer').css({
            position: 'absolute',
            bottom: '3px',
            left: '0px'
        });
    }
});

唯一的问题是,这仅在首次加载浏览器时有效,我是否containerHeight还希望在调整窗口大小时进行检查?

有任何想法吗?


46
$(window).resize(function(){...})
罗布W

Answers:


356

这是一个使用jQuery,javascript和css处理调整大小事件的示例。
(如果您只是通过调整大小来设置样式(媒体查询),最好的方法是CSS)
http://jsfiddle.net/CoryDanielson/LAF4G/

的CSS

.footer 
{
    /* default styles applied first */
}

@media screen and (min-height: 820px) /* height >= 820 px */
{
    .footer {
        position: absolute;
          bottom: 3px;
          left: 0px;
        /* more styles */
    }
}

javascript

window.onresize = function() {
    if (window.innerHeight >= 820) { /* ... */ }
    if (window.innerWidth <= 1280) {  /* ... */ }
}

jQuery的

$(window).on('resize', function(){
      var win = $(this); //this = window
      if (win.height() >= 820) { /* ... */ }
      if (win.width() >= 1280) { /* ... */ }
});

如何停止调整大小的代码执行如此频繁!

这是绑定到调整大小时会注意到的第一个问题。当用户手动调整浏览器的大小时,调整大小的代码称为LOT,可能会感觉很脏。

要限制你的大小调整代码是如何经常被称为,您可以使用防抖动油门从方法下划线lowdash库。

  • debounce将仅在LAST调整大小事件后的毫秒数内执行调整大小代码。当用户调整浏览器的大小之后,只想调用一次调整大小的代码时,这是理想的选择。这对于更新图形,图表和布局很有用,因为更新每个调整大小事件可能会很昂贵。
  • throttle只会每X毫秒执行一次调整大小的代码。它“限制”了代码的调用频率。调整大小事件不经常使用此方法,但值得注意。

如果没有下划线或破折号,则可以自己实现类似的解决方案: JavaScript / JQuery:$(window).resize调整大小完成后如何触发?


9
谢谢!以及防抖/油门信息;并链接到自滚动解决方案。
crashwap

58

将您的javascript移到一个函数中,然后将该函数绑定到窗口调整大小。

$(document).ready(function () {
    updateContainer();
    $(window).resize(function() {
        updateContainer();
    });
});
function updateContainer() {
    var $containerHeight = $(window).height();
    if ($containerHeight <= 818) {
        $('.footer').css({
            position: 'static',
            bottom: 'auto',
            left: 'auto'
        });
    }
    if ($containerHeight > 819) {
        $('.footer').css({
            position: 'absolute',
            bottom: '3px',
            left: '0px'
        });
    }
}

10

jQuery有一个resize事件处理程序,您可以将其附加到窗口.resize()。因此,如果您放置了该$(window).resize(function(){/* YOUR CODE HERE */})代码,则每次调整窗口大小时都将运行您的代码。

因此,您想要的是在第一页加载之后以及每当调整窗口大小时运行代码。因此,您应该将代码放入其自己的函数中,并在两个实例中都运行该函数。

// This function positions the footer based on window size
function positionFooter(){
    var $containerHeight = $(window).height();
    if ($containerHeight <= 818) {
        $('.footer').css({
            position: 'static',
            bottom: 'auto',
            left: 'auto'
        });
    }
    else {
        $('.footer').css({
            position: 'absolute',
            bottom: '3px',
            left: '0px'
        });
    } 
}

$(document).ready(function () {
    positionFooter();//run when page first loads
});

$(window).resize(function () {
    positionFooter();//run on every window resize
});

请参阅:跨浏览器窗口调整大小事件-JavaScript / jQuery


2
...或者您可以将文档准备处理程序重写为$(function() { $(window).resize(positionFooter).triggerHandler('resize'); });
WynandB,2014年

9

试试这个解决方案。仅在页面加载后触发,然后在窗口大小调整为预定义时触发resizeDelay

$(document).ready(function()
{   
   var resizeDelay = 200;
   var doResize = true;
   var resizer = function () {
      if (doResize) {

        //your code that needs to be executed goes here

        doResize = false;
      }
    };
    var resizerInterval = setInterval(resizer, resizeDelay);
    resizer();

    $(window).resize(function() {
      doResize = true;
    });
});

对我有用,谢谢。但是,您能否解释一下为什么实际上触发了“ var resizer = function()”?以我的理解,您仅在$(window).resize事件中设置了变量doResize,但未调用函数本身。
亚历山大

有一个函数调用:resizer();设置时间间隔后。并且由于将doResize设置为true,因此在文档准备就绪时会被触发。
体外

是的,对我来说,可以使用document.ready执行该函数是可以理解的。但是我不明白为什么函数在调整大小后也会执行,因为据我了解,仅设置了变量。对我来说,只有在调整了document.ready的大小之后,再次触发该函数,才能再次启动该函数(但这不是这种情况吗?)。
亚历山大

有间隔设置,可重复检查每个resizeDelay是否将doResize变量设置为true。并且doResize也设置为trueon $(window).resize()。因此,您需要调整窗口大小,然后设置doResizetrue并在下一次检查resizer()功能期间调用该窗口。
体外


3

也可以使用

        function getWindowSize()
            {
                var fontSize = parseInt($("body").css("fontSize"), 10);
                var h = ($(window).height() / fontSize).toFixed(4);
                var w = ($(window).width() / fontSize).toFixed(4);              
                var size = {
                      "height": h
                     ,"width": w
                };
                return size;
            }
        function startResizeObserver()
            {
                //---------------------
                var colFunc = {
                     "f10" : function(){ alert(10); }
                    ,"f50" : function(){ alert(50); }
                    ,"f100" : function(){ alert(100); }
                    ,"f500" : function(){ alert(500); }
                    ,"f1000" : function(){ alert(1000);}
                };
                //---------------------
                $(window).resize(function() {
                    var sz = getWindowSize();
                    if(sz.width > 10){colFunc['f10']();}
                    if(sz.width > 50){colFunc['f50']();}
                    if(sz.width > 100){colFunc['f100']();}
                    if(sz.width > 500){colFunc['f500']();}
                    if(sz.width > 1000){colFunc['f1000']();}
                });
            }
        $(document).ready(function() 
            {
                startResizeObserver();
            });

1
请解释一下代码的功能。您实际上并没有提供太多答案。
谷物盗窃

3
function myResizeFunction() {
  ...
}

$(function() {
  $(window).resize(myResizeFunction).trigger('resize');
});

这将导致您的大小调整处理程序在窗口调整大小和文档准备就绪时触发。当然,如果要.trigger('resize')在页面加载时运行,可以将调整大小处理程序附加到文档就绪处理程序之外。

更新:如果您不想使用任何其他第三方库,这是另一个选择。

该技术将特定的类添加到目标元素,因此您具有仅通过CSS控制样式的优点(并避免了内联样式)。

它还确保仅在触发实际阈值点时才添加或删除类,而不是在每次调整大小时都添加或删除该类。它将仅在一个阈值点触发:当高度从<= 818更改为> 819或反之时,并且在每个区域内没有多次。它与宽度的任何变化无关。

function myResizeFunction() {
  var $window = $(this),
      height = Math.ceil($window.height()),
      previousHeight = $window.data('previousHeight');

  if (height !== previousHeight) {
    if (height < 819)
      previousHeight >= 819 && $('.footer').removeClass('hgte819');
    else if (!previousHeight || previousHeight < 819)
      $('.footer').addClass('hgte819');

    $window.data('previousHeight', height);
  }
}

$(function() {
  $(window).on('resize.optionalNamespace', myResizeFunction).triggerHandler('resize.optionalNamespace');
});

例如,您可能具有以下一些CSS规则:

.footer {
  bottom: auto;
  left: auto;
  position: static;
}

.footer.hgte819 {
  bottom: 3px;
  left: 0;
  position: absolute;
}


1

调整浏览器大小时,可以resize使用绑定.resize()并运行代码。您还需要elseif语句中添加一个条件,以便您的css值可以切换旧值和新值,而不仅仅是设置新值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.