Twitter Bootstrap - 如何检测媒体查询何时开始

its*_*sme 21 javascript css jquery media-queries twitter-bootstrap

当bootstrap-responsive.css媒体查询付诸实施时,这是最快速,最简单的方法吗?

go in action =当您将窗口调整为移动宽度并将网站更改为响应式移动时

希望问题很清楚

fal*_*lla 27

我想出了一种使用窗口调整大小事件的方法,但是依赖于Twitter Bootstrap的媒体查询而没有对其断点进行硬编码:

<span id="mq-detector">
    <span class="visible-xs"></span>
    <span class="visible-sm"></span>
    <span class="visible-md"></span>
    <span class="visible-lg"></span>
</span>
Run Code Online (Sandbox Code Playgroud)
#mq-detector {
    visibility: hidden;
}
Run Code Online (Sandbox Code Playgroud)
var currMqIdx = undefined;
var mqDetector = $("#mq-detector");
var mqSelectors = [
    mqDetector.find(".visible-xs"),
    mqDetector.find(".visible-sm"),
    mqDetector.find(".visible-md"),
    mqDetector.find(".visible-lg")
];

var checkForResize = function() {
    for (var i = 0; i <= mqSelectors.length; i++) {
        if (mqSelectors[i].is(":visible")) {
            if (currMqIdx != i) {
                currMqIdx = i;
                console.log(mqSelectors[i].attr("class"));
            }
            break;
        }
    }
};

$(window).on('resize', checkForResize);

checkForResize();
Run Code Online (Sandbox Code Playgroud)

  • 整洁:)我用你的技巧将Bootstrap缩略图设置为相同的高度,见[这里](http://stackoverflow.com/questions/30205766/bootstrap-thumbnailscaption-with-same-height-per-row#30219581). (3认同)

Sti*_*ley 14

其他答案的一个问题是每次调整大小时都会触发更改事件.如果你的javascript做了重要的事情,这可能会非常昂贵.

当超过阈值时,下面的代码仅调用您的更新功能一次.

要进行测试,请抓住窗口大小句柄,然后快速拖动调整大小以查看浏览器是否会阻塞.

<script>
// Global state variable
var winSize = '';

window.onresize = function () {
    var newWinSize = 'xs'; // default value, check for actual size
    if ($(this).width() >= 1200) {
        newWinSize = 'lg';
    } else if ($(this).width() >= 992) {
        newWinSize = 'md';
    } else if ($(this).width() >= 768) {
        newWinSize = 'sm';
    }

    if( newWinSize != winSize ) {
        doSomethingOnSizeChange();
        winSize = newWinSize;
    }
};
</script>
Run Code Online (Sandbox Code Playgroud)


sof*_*var 13

使用jquery,你可以找到当前窗口的大小,然后相应地做你的东西.

$(window).resize(function() {
  if ($(this).width() >= 1280) {
    //do something
  }
  else if ($(this).width() < 1280 && $(this).width()>= 980) {
    //do something
  }
  ...
});
Run Code Online (Sandbox Code Playgroud)

CSS: : Twitter的Bootsrap的布局

/* Large desktop */
@media (min-width: 1200px) { ... }

/* Portrait tablet to landscape and desktop */
@media (min-width: 768px) and (max-width: 979px) { ... }

/* Landscape phone to portrait tablet */
@media (max-width: 767px) { ... }

/* Landscape phones and down */
@media (max-width: 480px) { ... }
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用.在Chrome和其他可能的浏览器上,Jquery为您提供HTML内容的宽度,而CSS中的最小宽度取决于浏览器窗口本身的宽度. (2认同)

Bjø*_*ldt 10

这对我来说与Bootstrap 3结合使用:

<div id="media-width-detection-element"></div>
<style type="text/css">
    #media-width-detection-element {
        display: none;
        width: 0px;
    }
    @media (min-width: 768px) {
        #media-width-detection-element {
            width: 768px;
        }
    }
    @media (min-width: 992px) {
        #media-width-detection-element {
            width: 992px;
        }
    }
    @media (min-width: 1200px) {
        #media-width-detection-element {
            width: 1200px;
        }
    }
</style>
<script type="text/javascript">
    //<![CDATA[
    function xs() {
        return $("#media-width-detection-element").css("width") === "0px";
    }
    function sm() {
        return $("#media-width-detection-element").css("width") === "768px";
    }
    function md() {
        return $("#media-width-detection-element").css("width") === "992px";
    }
    function lg() {
        return $("#media-width-detection-element").css("width") === "1200px";
    }
    //]]>
</script>
Run Code Online (Sandbox Code Playgroud)

隐藏的DIV更改宽度取决于使用的实际CSS最小宽度设置.然后我的javascript简单检查DIV的当前.

  • 代码工作正常:http://jsfiddle.net/JWTt5/ ...我会让OP决定这是否是正确的答案. (2认同)
  • 那是因为它在一个框架中.你需要一个高屏幕分辨率来让它说出除了'xs`以外的任何东西,或者你需要从框架中取出代码.要在调整大小时弹出它,只需将警报放在`$(window).resize(function(){/*PUT ALERT HERE*/})中; (2认同)

bkn*_*hts 5

优秀提示,@ falsarella!

对于那些喜欢这种不影响其实际标记的人,下面的工作如下:

$(function(){
...
var mqClasses = ["visible-xs", "visible-sm", "visible-md", "visible-lg"];
var mq = $("<span id='mqDetector' style='visibility:hidden'></span>").appendTo($("body"));
$.each(mqClasses, function(idx, val) {
    mq.append("<span class='" + val + "'></span>");
});
function checkMQ() {
    var visible = mq.find(":visible").get(0).className;
    return visible.slice(-2);
};

function checkResize(){
    switch(checkMQ){
      case 'xs' : ...; break;
      case 'sm' : ...; break;
     ...
    }
}
$(window).on('resize', checkResize);
checkResize(); //do it once when page loads.
Run Code Online (Sandbox Code Playgroud)