窗口上的jQuery调整大小

时间:2012-03-22 19:04:37

标签: jquery html css

我有以下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吗?

有什么想法吗?

9 个答案:

答案 0 :(得分:313)

以下是使用jQuery,javascript和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) { /* ... */ }
});

如何阻止我的调整大小代码经常执行!?

这是绑定到resize时您会注意到的第一个问题。当用户手动调整浏览器大小时,调整大小代码会被称为LOT,并且感觉非常笨拙。

要限制调整调整代码的频率,您可以使用debounce&amp;中的throttleunderscore方法。 lowdash个库。

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

如果您没有下划线或低位,您可以自己实施类似的解决方案: JavaScript/JQuery: $(window).resize how to fire AFTER the resize is completed?

答案 1 :(得分:54)

将您的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'
        });
    }
}

答案 2 :(得分:9)

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
});

请参阅:Cross-browser window resize event - JavaScript / jQuery

答案 3 :(得分:8)

试试这个解决方案。仅在页面加载后触发,然后在窗口调整大小时以预定义的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;
    });
});

答案 4 :(得分:4)

为您的匿名函数命名,然后:

$(window).on("resize", doResize);

http://api.jquery.com/category/events/

答案 5 :(得分: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();
            });

答案 6 :(得分:3)

function myResizeFunction() {
  ...
}

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

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

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

此技术为您的目标元素添加了一个特定的类,因此您可以通过CSS控制样式(并避免内联样式)。

它还确保仅在触发实际阈值点时添加或删除类,而不是在每次调整大小时。它仅在一个阈值点触发:当高度从&lt; = 818变为&gt;时819或反之亦然,而不是每个区域内多次。它不关心 width 的任何变化。

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;
}

答案 7 :(得分:2)

使用此:

window.onresize = function(event) {
    ...
}

答案 8 :(得分:1)

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