[javascript] JavaScript를 사용하여 Twitter Bootstrap 3의 반응 형 중단 점을 감지하는 방법은 무엇입니까?

현재 Twitter Bootstrap 3에는 768px, 992px 및 1200px의 반응 형 중단 점이 있으며 각각 중소형 및 대형 장치를 나타냅니다.

JavaScript를 사용하여 이러한 중단 점을 어떻게 감지 할 수 있습니까?

화면이 변경 될 때 트리거되는 모든 관련 이벤트에 대해 JavaScript로 듣고 싶습니다. 화면이 소형, 중형 또는 대형 장치 용인지 감지 할 수 있습니다.

이미 무슨 일이 있습니까? 당신의 제안은 무엇입니까?



답변

편집 :이 라이브러리는 이제 Bower 및 NPM을 통해 사용할 수 있습니다. 자세한 내용은 github repo를 참조하십시오.

업데이트 된 답변 :

면책 조항 : 나는 저자입니다.

최신 버전 (Responsive Bootstrap Toolkit 2.5.0)을 사용하여 수행 할 수있는 몇 가지 작업은 다음과 같습니다.

// Wrap everything in an IIFE
(function($, viewport){

    // Executes only in XS breakpoint
    if( viewport.is('xs') ) {
        // ...
    }

    // Executes in SM, MD and LG breakpoints
    if( viewport.is('>=sm') ) {
        // ...
    }

    // Executes in XS and SM breakpoints
    if( viewport.is('<md') ) {
        // ...
    }

    // Execute only after document has fully loaded
    $(document).ready(function() {
        if( viewport.is('xs') ) {
            // ...
        }
    });

    // Execute code each time window size changes
    $(window).resize(
        viewport.changed(function() {
            if( viewport.is('xs') ) {
                // ...
            }
        })
    ); 

})(jQuery, ResponsiveBootstrapToolkit);

버전 2.3.0부터는 <div>아래 언급 된 네 가지 요소 가 필요하지 않습니다 .


원래 답변 :

나는 당신이 그것을 위해 거대한 스크립트 나 라이브러리가 필요하다고 생각하지 않습니다. 상당히 간단한 작업입니다.

바로 다음 요소를 삽입하십시오 </body>.

<div class="device-xs visible-xs"></div>
<div class="device-sm visible-sm"></div>
<div class="device-md visible-md"></div>
<div class="device-lg visible-lg"></div>

이 4 개의 div를 통해 현재 활성 중단 점을 확인할 수 있습니다. JS를 쉽게 감지하려면 다음 기능을 사용하십시오.

function isBreakpoint( alias ) {
    return $('.device-' + alias).is(':visible');
}

이제 가장 작은 중단 점에서만 특정 작업을 수행하려면 다음을 사용할 수 있습니다.

if( isBreakpoint('xs') ) {
    $('.someClass').css('property', 'value');
}

DOM 준비 후 변경 사항을 감지하는 것도 매우 간단합니다. 다음과 같은 경량 창 크기 조정 리스너 만 있으면됩니다.

var waitForFinalEvent = function () {
      var b = {};
      return function (c, d, a) {
        a || (a = "I am a banana!");
        b[a] && clearTimeout(b[a]);
        b[a] = setTimeout(c, d)
      }
    }();

var fullDateString = new Date();

일단 장비를 갖추면 변경 사항을 청취하고 다음과 같이 중단 점 특정 기능을 실행할 수 있습니다.

$(window).resize(function () {
    waitForFinalEvent(function(){

        if( isBreakpoint('xs') ) {
            $('.someClass').css('property', 'value');
        }

    }, 300, fullDateString.getTime())
});


답변

특정 요구 사항이 없으면 다음과 같이하십시오.

if ($(window).width() < 768) {
    // do something for small screens
}
else if ($(window).width() >= 768 &&  $(window).width() <= 992) {
    // do something for medium screens
}
else if ($(window).width() > 992 &&  $(window).width() <= 1200) {
    // do something for big screens
}
else  {
    // do something for huge screens
}

편집 : Bootstrap 프로젝트에 이미 포함 된 jQuery 로이 작업을 수행 할 수있을 때 왜 다른 js 라이브러리를 사용 해야하는지 모르겠습니다.


답변

Response.js를 살펴 보셨습니까? 이런 종류의 것을 위해 설계되었습니다. Response.band와 Response.resize를 결합하십시오.

http://responsejs.com/

Response.resize(function() {
    if ( Response.band(1200) )
    {
       // 1200+
    }
    else if ( Response.band(992) )
    {
        // 992+
    }
    else if ( Response.band(768) )
    {
        // 768+
    }
    else
    {
        // 0->768
    }
});


답변

창 크기를 사용하고 중단 점을 하드 코딩 할 수 있습니다. 각도 사용 :

angular
    .module('components.responsiveDetection', [])
    .factory('ResponsiveDetection', function ($window) {
        return {
            getBreakpoint: function () {
                var w = $window.innerWidth;
                if (w < 768) {
                    return 'xs';
                } else if (w < 992) {
                    return 'sm';
                } else if (w < 1200) {
                    return 'md';
                } else {
                    return 'lg';
                }
            }
        };
    });


답변

JavaScript를 사용하여 Twitter Bootstrap 4.1.x의 반응 형 중단 점 감지

부트 스트랩 v.4.0.0 (최신 버전의 부트 스트랩 전 4.1.x는 ) 업데이트 도입 그리드 옵션을 탐지에 대한 기존의 개념은 직접 (참조 적용되지 않을 수 있으므로, 마이그레이션 지침 ) :

  • 보다 세밀한 제어를 위해 sm아래 768px에 새 그리드 계층을 추가했습니다 . 우리는 지금이 xs, sm, md, lg, 그리고 xl;
  • xs 그리드 클래스는 수정이 필요하지 않도록 수정되었습니다.

업데이트 된 그리드 클래스 이름과 새로운 그리드 계층을 존중하는 작은 유틸리티 함수를 작성했습니다.

/**
 * Detect the current active responsive breakpoint in Bootstrap
 * @returns {string}
 * @author farside {@link https://stackoverflow.com/users/4354249/farside}
 */
function getResponsiveBreakpoint() {
    var envs = {xs:"d-none", sm:"d-sm-none", md:"d-md-none", lg:"d-lg-none", xl:"d-xl-none"};
    var env = "";

    var $el = $("<div>");
    $el.appendTo($("body"));

    for (var i = Object.keys(envs).length - 1; i >= 0; i--) {
        env = Object.keys(envs)[i];
        $el.addClass(envs[env]);
        if ($el.is(":hidden")) {
            break; // env detected
        }
    }
    $el.remove();
    return env;
};

JavaScript를 사용하여 부트 스트랩 v4- 베타의 반응 중단 점 감지

부트 스트랩 V4 알파부트 스트랩 V4 – 베타 그리드 중단 점에 대한 다른 접근 방식을 가지고, 그래서 여기에 동일한을 달성하는 기존의 방법이있다 :

/**
 * Detect and return the current active responsive breakpoint in Bootstrap
 * @returns {string}
 * @author farside {@link https://stackoverflow.com/users/4354249/farside}
 */
function getResponsiveBreakpoint() {
    var envs = ["xs", "sm", "md", "lg"];
    var env = "";

    var $el = $("<div>");
    $el.appendTo($("body"));

    for (var i = envs.length - 1; i >= 0; i--) {
        env = envs[i];
        $el.addClass("d-" + env + "-none");;
        if ($el.is(":hidden")) {
            break; // env detected
        }
    }
    $el.remove();
    return env;
}

모든 프로젝트에 쉽게 통합 할 수 있기 때문에 유용하다고 생각합니다. 부트 스트랩 자체의 기본 응답 디스플레이 클래스 를 사용 합니다.


답변

여기 내 자신의 간단한 해결책 :

jQuery :

function getBootstrapBreakpoint(){
    var w = $(document).innerWidth();
    return (w < 768) ? 'xs' : ((w < 992) ? 'sm' : ((w < 1200) ? 'md' : 'lg'));
}

바닐라 JS :

function getBootstrapBreakpoint(){
    var w = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
    return (w < 768) ? 'xs' : ((w < 992) ? 'sm' : ((w < 1200) ? 'md' : 'lg'));
}


답변

Response.js 와 함께이 방법을 사용하는 것이 좋습니다. 중단 점을 변경 한 경우에만 크로스 오버가 트리거되는 모든 창 크기 조정에 대한 Response.resize 트리거

Response.create({
    prop : "width",
    breakpoints : [1200, 992, 768, 480, 320, 0]
});

Response.crossover('width', function() {
    if (Response.band(1200)) {
        // 1200+

    } else if (Response.band(992)) {
        // 992+

    } else if (Response.band(768)) {
        // 768+

    } else if (Response.band(480)) {
        //480+

    } else {
        // 0->320

    }
});

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