Twitter Bootstrap - как определить, когда запускаются медиа-запросы
который является самым быстрым и легким способом запуска, когда загружаются медиа-запросы bootstrap-responsive.css?
перейти в действие = при изменении размера окна на ширину мобильного устройства и изменении сайта на гибкий мобильный
Надеюсь, что вопрос очевиден.
Ответы
Ответ 1
С помощью jquery вы можете найти размер текущего окна, а затем, соответственно, сделать свой материал.
$(window).resize(function() {
if ($(this).width() >= 1280) {
//do something
}
else if ($(this).width() < 1280 && $(this).width()>= 980) {
//do something
}
...
});
CSS:: Twitter-Bootsrap-layouts
/* 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) { ... }
Ответ 2
Я придумал подход, который использует событие изменения размера окна, но полагаясь на запросы 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>
#mq-detector {
visibility: hidden;
}
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();
Ответ 3
Одна проблема с другими ответами - это событие изменения запускается КАЖДОЕ изменение размера. Это может быть очень дорого, если ваш 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>
Ответ 4
Это работает для меня в сочетании с 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>
Скрытая ширина изменения DIV в зависимости от используемых параметров минимальной ширины CSS. Тогда мой javascript просто проверит текущий с DIV.
Ответ 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.
Ответ 6
На основе решения @falsarella часть js может быть упрощена до:
var currMqIdx = undefined;
var checkForResize = function() {
currMqIdx = $('#mq-detector span').index($('#mq-detector span:visible'));
};
$(window).on('resize', checkForResize);
checkForResize();
currMqIdx
будет значением int от 0 до 3. Чем больше currMqIdx
, тем шире носитель.
Ответ 7
этот код добавляет тег body ld, md, sd или xd класс
$(function(){
var device_width_detect = '';
function device_detec(){
if ($(this).width() >= 1280) {
device_width_detect = 'ld';
}else if ($(this).width() < 1280 && $(this).width()>= 992) {
device_width_detect = 'md';
}else if ($(this).width() < 992 && $(this).width()>= 768) {
device_width_detect = 'sd';
}else if ($(this).width() < 768) {
device_width_detect = 'xd';
}
$('body').removeClass( "ld md sd xd" ).addClass( device_width_detect );
}
device_detec();
$(window).on('resize', device_detec);
});
Ответ 8
Я подготовил суперлегкую библиотеку для обработки событий, когда меняются ширина окна и точка останова Bootstrap - responsive-breakpoint-tester
var viewport = new ResponsiveTester();
$('body').on('in.screen.xs', function(event, devices) {
// Code executed when viewport is was changed to xs
});
$('body').on('out.screen.xs', function(event, devices) {
// Code executed when viewport is no longer xs
});
Также включены другие функции, такие как текущая проверка точки останова:
if (viewport.is('xs')) {
// Executed only on xs breakpoint
}
if (viewport.is('!=xs')) {
// Executed on all breakpoints that are not equal xs (sm, md, lg)
}
if (viewport.is('<md')) {
// Executed on breakpoints that are smaller than md (xs, sm)
}
if (viewport.is('<=md')) {
// Executed on breakpoints that are smaller or equal to md (xs, sm, md)
}
if (viewport.is('>md')) {
// Executed on breakpoints that are larger than md (lg)
}
Поддерживаются настройки Bootstrap 4 и Foundation, дополнительная информация о Репозиторий GitHub
Ответ 9
Вы можете использовать matchMedia
и библиотеку-оболочку enquire.js
, которая регистрирует медиа-запросы и испускает события, когда они сопоставлены/несовместимы.
Использование
Позвольте использовать эти загрузочные запросы Bootstrap CSS в качестве примера, взятого из документов.
/* Extra small devices (phones, less than 768px) */
/* No media query since this is the default in Bootstrap */
/* Small devices (tablets, 768px and up) */
@media (min-width: @screen-sm-min) { ... }
/* Medium devices (desktops, 992px and up) */
@media (min-width: @screen-md-min) { ... }
/* Large devices (large desktops, 1200px and up) */
@media (min-width: @screen-lg-min) { ... }
Чтобы узнать, когда применяется каждое из этих правил, используйте enquire.js
для регистрации запросов к мультимедиа и предоставления соответствующих функций match
и unmatch
, как показано ниже:
let rules = [
'(max-width: 768px)', // extra small devices, default
'(min-width: 768px)', // small devices
'(min-width: 992px)', // medium devices
'(min-width: 1200px)' // large devices
];
for (let rule of rules) {
enquire.register(rule, {
match: function() {
console.log(rule + ' matched');
},
unmatch: function() {
console.log(rule + ' unmatched');
}
});
}
enquire.js
использует matchMedia
, который поддерживает только современные браузеры, например IE9. Итак, polyfill потребуется для устаревших браузеров, чтобы эта работа работала.
Ответ 10
Simpler
$(window).on('resize', function () {
if ($('<div class="visible-lg">').css('display')=='block') {
// Do something for lg
}
// ...
});
Ответ 11
Я использовал это, чтобы привязать навигатор к https://ducttapedanyol.com в бутстрапе на больших экранах:
if ($(this).width() >= 979) { // Detect screen size
$(document).ready(function () {
var menu = $('.menu');
var origOffsetY = menu.offset().top;
function scroll() {
if ($(window).scrollTop() >= origOffsetY) {
$('.menu').addClass('sticky');
$('.fix').addClass('fix-tall');
} else {
$('.menu').removeClass('sticky');
$('.fix').removeClass('fix-tall');
}
}
document.onscroll = scroll;
});
}
Ответ 12
Я переработал коды в эту ссылку на Bootsrap 4, а не на альфа или бета-версию. Коды, как показано ниже;
/* **********************************************************
Detect bootrap 4 media query type
https://getbootstrap.com/docs/4.0/utilities/display/
********************************************************** */
$("body").append("<div style='visibilty:hidden' class='viewport-check'><span class='d-block d-sm-none'>xs</span><span class='d-none d-sm-block d-md-none'>sm</span><span class='d-none d-md-block d-lg-none'>md</span><span class='d-none d-lg-block d-xl-none'>lg</span><span class='d-none d-xl-block'>xl</span></div>");
var Bootstrap4MediaQuery = "";
//> Checks if the span is set to display block via CSS
function FnDetectMediaQuery(_QsTarget) {
var _QsTarget = $(_QsTarget).css('display') == 'block';
return _QsTarget;
}
if(FnDetectMediaQuery('.viewport-check .d-block') == true)
{
Bootstrap4MediaQuery = "xs";
}
else if(FnDetectMediaQuery('.viewport-check .d-sm-block') == true)
{
Bootstrap4MediaQuery = "sm";
}
else if(FnDetectMediaQuery('.viewport-check .d-md-block') == true)
{
Bootstrap4MediaQuery = "md";
}
else if(FnDetectMediaQuery('.viewport-check .d-lg-block') == true)
{
Bootstrap4MediaQuery = "lg";
}
else if(FnDetectMediaQuery('.viewport-check .d-xl-block') == true)
{
Bootstrap4MediaQuery = "xl";
}
else
{
Bootstrap4MediaQuery = "";
}
console.log("Bootstrap4MediaQuery: " + Bootstrap4MediaQuery);