使用jquery检测响应式设计的变化

时间:2012-12-01 17:52:41

标签: jquery responsive-design

我需要在支持宽,正常和窄宽度的响应式设计中绕过一些javascript代码。我需要在“宽”模式下绕过代码。我可以这样写:

if ($('#page').width() < 1237) {
   ... do the animation stuff
}

有没有更好的方法可以避免硬编码像素宽度?

我在想,当窗口调整大小时我可以将一个类应用于body元素......类似于:

if (width >= 1237) {
    $('body').removeClass('layout-normal').removeClass('layout-ipad').addClass('layout-wide');
}
else if (width >= 980) {
    $('body').removeClass('layout-wide').removeClass('layout-ipad').addClass('layout-normal');
}
else {
    $('body').removeClass('layout-wide').removeClass('layout-normal').addClass('layout-ipad');
}

这样我就可以将硬编码的宽度与单个函数隔离开来,然后我就可以写了:

   if (!$('#page').hasClass('layout-wide') {
       ... do the animation stuff
    }

但有没有办法完全避免硬编码像素宽度?

3 个答案:

答案 0 :(得分:0)

  

但有没有办法完全避免硬编码像素宽度?

媒体查询是执行此操作的最佳方式

@media (max-width:767px) {
  .class{}
}

答案 1 :(得分:0)

这是我想出的...我的方法是将类应用于特定于每个支持的布局宽度的body元素。如果存在媒体查询,我只想应用这些类,所以首先我检查浏览器是否支持它们。以下是讨论该问题的主题:

I need an easy way to detect CSS3 media query support using jquery

不幸的是,在这个解决方案中,我需要硬编码我支持的宽度。如果有更好的方法,请随时发布。目前,这是一个快速结果的小权衡。

这是CSS:

/* Add to your main CSS file - used to test for media query support */
@media all and (min-width:1px) {
    .mediatest {position:absolute}
}

这是JavaScript:

var $globals = {
    mediaQuerySupport: false
};

function initMediaQueries () {
    // tests for media query support and if it exists, it applies classes to the body element on window resize
    $globals.mediaQuerySupport = false;

    /*
    test if the browser knows about media queries
    create a div, apply the test class, test to see if the computed style is absolute... then delete the div
    */
    var d = document.createElement('div');
    d.className = "mediatest"; // found in main css file
    document.body.appendChild(d);
    if( window.getComputedStyle && window.getComputedStyle(d).position == "absolute") {
        $globals.mediaQuerySupport = true;
    }
    document.body.removeChild(d);

    if ($globals.mediaQuerySupport) {
        // apply a class to the body element now and when window resizes
        setBodyLayout ();
        $(window).resize(function () {
            setBodyLayout();
        });
    }
} // initMediaQueries ()

function mediaQueriesEnabled () {
    return ($globals.mediaQuerySupport);
}

function setBodyLayout () {
    // hard-coded widths for the supported media query layouts - change to your needs
    var width = $(window).width();
    if (width >= 1237) {
        $('body').removeClass('layout-normal').removeClass('layout-ipad').addClass('layout-wide');
    }
    else if (width >= 980) {
        $('body').removeClass('layout-wide').removeClass('layout-ipad').addClass('layout-normal');
    }
    else { // if narrower than 980, its the most narrow width
        $('body').removeClass('layout-wide').removeClass('layout-normal').addClass('layout-ipad');
    }
}

答案 2 :(得分:0)