How to detect responsive breakpoints of Twitter Bootstrap 3 using JavaScript?

Currently, Twitter Bootstrap 3 have the following responsive breakpoints: 768px, 992px and 1200px, representing small, medium and large devices respectively.

How can I detect these breakpoints using JavaScript?

I would like to listen with JavaScript for all related events triggered when the screen change. And to be able to detect if the screen is for small, medium or large devices.

Is there something already done? What are your suggestions?

139625 次浏览

如果你没有特殊的需求,你可以这样做:

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
}

编辑: 我不明白为什么你应该使用另一个 js 库,当你可以做到这一点,只是与 jQuery 已经包含在你的 Bootstrap 项目。

你看过 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
}
});

像@oozic 提到的那种手动实现应该没有问题。

下面是一些你可以看看的例子:

请注意,这些库的设计独立于引导程序、基础等。您可以配置自己的断点,并从中获得乐趣。

与使用 $(document) . width ()不同,您应该设置一个提供此信息的 CSS 规则。

我只是写了一篇文章来准确地得到它

您可能希望将其添加到引导程序项目中,以便可视地检查活动断点

    <script type='text/javascript'>


$(document).ready(function () {


var mode;


$('<div class="mode-informer label-info" style="z-index:1000;position: fixed;bottom:10px;left:10px">%mode%</div>').appendTo('body');




var checkMode = function () {


if ($(window).width() < 768) {
return 'xs';
}
else if ($(window).width() >= 768 && $(window).width() < 992) {
return 'sm';
}
else if ($(window).width() >= 992 && $(window).width() < 1200) {
return 'md';
}
else {
return 'lg';
}
};


var compareMode = function () {
if (mode !== checkMode()) {
mode = checkMode();


$('.mode-informer').text(mode).animate({
bottom: '100'
}, 100, function () {
$('.mode-informer').animate({bottom: 10}, 100)
});
}
};


$(window).on('resize', function () {
compareMode()
});


compareMode();


});


</script>

这是 翘臀

为什么不使用 jQuery 来检测引导容器类的当前 css 宽度呢?

也就是说。

if( parseInt($('#container').css('width')) > 1200 ){
// do something for desktop screens
}

你也可以使用 $(window) . resize ()来防止你的布局“弄脏了床”,如果有人调整了浏览器窗口的大小。

编辑: 这个库现在可以通过 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 允许您检查当前活动的断点:

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

回应使用这种方法更好。在每个窗口调整大小时,调整触发器的大小,只有在断点更改时才会触发交叉

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

基于 Maciej Gurban 的答案(这个答案太棒了... ... 如果你喜欢这个,请给他的答案投上一票)。如果正在构建要查询的服务,可以通过下面的设置返回当前活动的服务。这可以完全替代其他断点检测库(如果放入一些事件,比如 enquire.js)。注意,我已经为 DOM 元素添加了一个 ID 容器,以加快 DOM 遍历。

超文本标示语言

<div id="detect-breakpoints">
<div class="breakpoint device-xs visible-xs"></div>
<div class="breakpoint device-sm visible-sm"></div>
<div class="breakpoint device-md visible-md"></div>
<div class="breakpoint device-lg visible-lg"></div>
</div>

咖啡字条(AngularJS,但这是很容易转换)

# this simple service allows us to query for the currently active breakpoint of our responsive app
myModule = angular.module('module').factory 'BreakpointService', ($log) ->


# alias could be: xs, sm, md, lg or any over breakpoint grid prefix from Bootstrap 3
isBreakpoint: (alias) ->
return $('#detect-breakpoints .device-' + alias).is(':visible')


# returns xs, sm, md, or lg
getBreakpoint: ->
currentBreakpoint = undefined
$visibleElement = $('#detect-breakpoints .breakpoint:visible')
breakpointStringsArray = [['device-xs', 'xs'], ['device-sm', 'sm'], ['device-md', 'md'], ['device-lg', 'lg']]
# note: _. is the lodash library
_.each breakpointStringsArray, (breakpoint) ->
if $visibleElement.hasClass(breakpoint[0])
currentBreakpoint = breakpoint[1]
return currentBreakpoint

JAVASCRIPT (AngularJS)

var myModule;


myModule = angular.module('modules').factory('BreakpointService', function($log) {
return {
isBreakpoint: function(alias) {
return $('#detect-breakpoints .device-' + alias).is(':visible');
},
getBreakpoint: function() {
var $visibleElement, breakpointStringsArray, currentBreakpoint;
currentBreakpoint = void 0;
$visibleElement = $('#detect-breakpoints .breakpoint:visible');
breakpointStringsArray = [['device-xs', 'xs'], ['device-sm', 'sm'], ['device-md', 'md'], ['device-lg', 'lg']];
_.each(breakpointStringsArray, function(breakpoint) {
if ($visibleElement.hasClass(breakpoint[0])) {
currentBreakpoint = breakpoint[1];
}
});
return currentBreakpoint;
}
};
});

可以使用窗口大小和断点的硬编码。使用角度:

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

我已经开发了一个原生 jQuery 方法来检测 Bootstrap 屏幕大小,如下所示:

// Screen size ID will be stored in this variable (global var for JS)
var CurrentBootstrapScreenSize = 'unknown';


$(document).ready(function () {


// <div> objects for all screen sizes required for screen size detection.
// These <div> is hidden for users eyes.
var currentScreenSizeDetectorObjects = $('<div>').css({
'position':'absolute',
'top':'-200px'
}).addClass('current-screen-size').append([
$('<div>').addClass('device-xs visible-xs').html('&nbsp;'),
$('<div>').addClass('device-sm visible-sm').html('&nbsp;'),
$('<div>').addClass('device-md visible-md').html('&nbsp;'),
$('<div>').addClass('device-lg visible-lg').html('&nbsp;')
]);


// Attach <div> objects to <body>
$('body').prepend(currentScreenSizeDetectorObjects);


// Core method for detector
function currentScreenSizeDetectorMethod() {
$(currentScreenSizeDetectorObjects).find('div').each(function() {
var className = $(this).attr('class');
if($(this).is(':visible')) {
if(String(className).match(/device-xs/)) CurrentBootstrapScreenSize = 'xs';
else if(String(className).match(/device-sm/)) CurrentBootstrapScreenSize = 'sm';
else if(String(className).match(/device-md/)) CurrentBootstrapScreenSize = 'md';
else if(String(className).match(/device-lg/)) CurrentBootstrapScreenSize = 'lg';
else CurrentBootstrapScreenSize = 'unknown';
};
})
console.log('Current Bootstrap screen size is: '+CurrentBootstrapScreenSize);
$('.CurrentBootstrapScreenSize').first().html('Bootstrap current screen size: <b>' + CurrentBootstrapScreenSize + '</b>' );
}


// Bind screen size and orientation change
$(window).bind("resize orientationchange", function() {
// Execute screen detection
currentScreenSizeDetectorMethod();
});


// Execute screen detection on page initialize
currentScreenSizeDetectorMethod();


});

https://jsfiddle.net/pstepniewski/7dz6ubus/

JSFillde 作为全屏示例: https://jsfiddle.net/pstepniewski/7dz6ubus/embedded/result/

我没有足够的声誉点来评论,但是对于那些在尝试使用 Maciej GUrban 的 ResponsiveToolKit 时遇到“不被认可”问题的人来说,我也得到了这个错误,直到我注意到 Maciej 实际上在他的 CodePen 页面底部引用了这个工具包

我试过了,突然起作用了!因此,使用 ResponsiveToolkit,但是把你的链接放在页面的底部:

我不知道这有什么区别,但确实有区别。

不要在每一页多次插入下面的内容..。

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

只要使用 JavaScript 动态地将它插入到每个页面中(注意,我已经更新了它,使它能够与 Bootstrap 3和 .visible-*-block一起工作:

// Make it easy to detect screen sizes
var bootstrapSizes = ["xs", "sm", "md", "lg"];
for (var i = 0; i < bootstrapSizes.length; i++) {
$("<div />", {
class: 'device-' + bootstrapSizes[i] + ' visible-' + bootstrapSizes[i] + '-block'
}).appendTo("body");
}

下面是另一种检测当前视口 没有的方法,它将视口大小数字放入 javascript 中。

请参见 css 和 javascript 代码片段: https://gist.github.com/steveh80/288a9a8bd4c3de16d799

在将这些代码片段添加到 css 和 javascript 文件之后,您可以像下面这样检测当前视图:

viewport.is('xs') // returns boolean

如果您想检测一个视口范围,请像这样使用它

viewport.isEqualOrGreaterThan('sm') // returns true for sm, md and lg

对于任何使用 淘汰赛的人,我想要一些 敲除.js 可观察性质,它会告诉我什么时候命中断点。我选择使用 Modizr 对 CSS 样式媒体查询的支持,以使数字与引导程序定义相匹配,并获得现代化的兼容性好处。我的淘汰视图模型如下:

var viewModel = function() {
// depends on jquery, Modernizr
var self = this;
self.widthXsOrLess = ko.observable();
self.widthSmOrLess = ko.observable();
self.widthMdOrLess = ko.observable();
var setWindowSizeVars = function() {
self.widthXsOrLess(!Modernizr.mq('(min-width: 768px)'));
self.widthSmOrLess(!Modernizr.mq('(min-width: 992px)'));
self.widthMdOrLess(!Modernizr.mq('(min-width: 1200px)'));
};
$(window).resize(setWindowSizeVars);
setWindowSizeVars();
};

使用 JavaScript 检测 Bootstrap 4.1.x 的响应断点

Bootstrap v.4.0.0引导程序(和最新版本的 引导程序4.1. x)引入了更新的 网格选项,所以旧的检测概念可能不会直接应用(见 迁移说明) :

  • 增加了一个新的 sm网格层下面的 768px更细粒度的控制。我们现在有 xssmmdlgxl;
  • 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 检测 Bootstrap v4-beta 的响应断点

引导程序 v4-alphaBootstrap v4-beta在网格断点上采用了不同的方法,所以这里是实现相同的遗留方法:

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

我认为这将是有用的,因为它很容易集成到任何项目。它使用 Bootstrap 本身的本机 响应式显示类别

这里有一个很好的方法来检测它(也许很有趣,但是很有效) ,你可以使用必要的元素,这样代码就清晰了:

Css:

@media (max-width: 768px) {
#someElement
{
background: pink
}
}

在 jQuery 的文档中:

if($('#someElement').css('background') == 'pink')
{
doWhatYouNeed();
}

当然 css 属性是任何。

Bootstrap 针对 .container类的 CSS 如下所示:

.container {
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
}
@media (min-width: 768px) {
.container {
width: 750px;
}
}
@media (min-width: 992px) {
.container {
width: 970px;
}
}
@media (min-width: 1200px) {
.container {
width: 1170px;
}
}

因此,这意味着我们可以安全地依靠 jQuery('.container').css('width')来检测断点,而不会出现依赖 jQuery(window).width()的缺点。

我们可以写一个这样的函数:

function detectBreakpoint() {
// Let's ensure we have at least 1 container in our pages.
if (jQuery('.container').length == 0) {
jQuery('body').append('<div class="container"></div>');
}


var cssWidth = jQuery('.container').css('width');


if (cssWidth === '1170px') return 'lg';
else if (cssWidth === '970px') return 'md';
else if (cssWidth === '750px') return 'sm';


return 'xs';
}

然后像这样测试

jQuery(document).ready(function() {
jQuery(window).resize(function() {
jQuery('p').html('current breakpoint is: ' + detectBreakpoint());
});


detectBreakpoint();
});

使用 CSS :beforecontent属性打印 <span id="breakpoint-js">中的断点状态,这样 JavaScript 只需要读取这些数据就可以将其作为变量在函数中使用。

(运行代码片段查看示例)

注意: 我添加了几行 CSS 来使用 ABC0作为浏览器上角的红色标志。在把你的东西公开之前,一定要把它切换回 display:none;

// initialize it with jquery when DOM is ready
$(document).on('ready', function() {
getBootstrapBreakpoint();
});


// get bootstrap grid breakpoints
var theBreakpoint = 'xs'; // bootstrap336 default = mobile first
function getBootstrapBreakpoint(){
theBreakpoint = window.getComputedStyle(document.querySelector('#breakpoint-js'),':before').getPropertyValue('content').replace(/['"]+/g, '');
console.log('bootstrap grid breakpoint = ' + theBreakpoint);
}
#breakpoint-js {
/* display: none; //comment this while developping. Switch back to display:NONE before commit */
/* optional red flag layout */
position: fixed;
z-index: 999;
top: 0;
left: 0;
color: white;
padding: 5px 10px;
background-color: red;
opacity: .7;
/* end of optional red flag layout */
}
#breakpoint-js:before {
content: 'xs'; /* default = mobile first */
}
@media screen and (min-width: 768px) {
#breakpoint-js:before {
content: 'sm';
}
}
@media screen and (min-width: 992px) {
#breakpoint-js:before {
content: 'md';
}
}
@media screen and (min-width: 1200px) {
#breakpoint-js:before {
content: 'lg';
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">


<div class="container">
<span id="breakpoint-js"></span>
<div class="page-header">
<h1>Bootstrap grid examples</h1>
<p class="lead">Basic grid layouts to get you familiar with building within the Bootstrap grid system.</p>
</div>
</div>

这是我自己的简单解决方案:

JQuery:

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

香草:

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

由于 bootstrap 4很快就要发布了,我想我可以共享一个支持它的函数(xl 现在是一个东西) ,并执行最小化的 jQuery 来完成这项工作。

/**
* Get the Bootstrap device size
* @returns {string|boolean} xs|sm|md|lg|xl on success, otherwise false if Bootstrap is not working or installed
*/
function findBootstrapEnvironment() {
var environments = ['xs', 'sm', 'md', 'lg', 'xl'];
var $el = $('<span />');
$el.appendTo($('body'));
for (var i = environments.length - 1; i >= 0; i--) {
var env = environments[i];
$el.addClass('hidden-'+env);
if ($el.is(':hidden')) {
$el.remove();
return env;
}
}
$el.remove();
return false;
}

鞋带4

setResponsiveDivs();


function setResponsiveDivs() {
var data = [
{id: 'visible-xs', class: 'd-block d-sm-none'},
{id: 'visible-sm', class: 'd-none d-sm-block d-md-none'},
{id: 'visible-md', class: 'd-none d-md-block d-lg-none'},
{id: 'visible-lg', class: 'd-none d-lg-block d-xl-none'},
{id: 'visible-xl', class: 'd-none d-xl-block'}
];


for (var i = 0; i < data.length; i++) {
var el = document.createElement("div");
el.setAttribute('id', data[i].id);
el.setAttribute('class', data[i].class);
document.getElementsByTagName('body')[0].appendChild(el);
}
}


function isVisible(type) {
return window.getComputedStyle(document.getElementById('visible-' + type), null).getPropertyValue('display') === 'block';
}


// then, at some point
window.onresize = function() {
console.log(isVisible('xs') === true ? 'xs' : '');
console.log(isVisible('sm') === true ? 'sm' : '');
console.log(isVisible('md') === true ? 'md' : '');
console.log(isVisible('lg') === true ? 'lg' : '');
console.log(isVisible('xl') === true ? 'xl' : '');
};

或者缩小版

function setResponsiveDivs(){for(var e=[{id:"visible-xs","class":"d-block d-sm-none"},{id:"visible-sm","class":"d-none d-sm-block d-md-none"},{id:"visible-md","class":"d-none d-md-block d-lg-none"},{id:"visible-lg","class":"d-none d-lg-block d-xl-none"},{id:"visible-xl","class":"d-none d-xl-block"}],s=0;s<e.length;s++){var l=document.createElement("div");l.setAttribute("id",e[s].id),l.setAttribute("class",e[s]["class"]),document.getElementsByTagName("body")[0].appendChild(l)}}function isVisible(e){return"block"===window.getComputedStyle(document.getElementById("visible-"+e),null).getPropertyValue("display")}setResponsiveDivs();

如果使用 击倒,那么可以使用以下自定义绑定将当前视口断点(xs、 sm、 md 或 lg)绑定到模型中的可观察断点。封印..。

  • 用 id 为 detect-viewport的 div 包装4 divsvisible-??类,并将其添加到主体(如果它还不存在的话)(因此您可以重用这个绑定,而无需复制这些 div)
  • 通过查询哪个 div 是可见的,将当前视图断点设置为绑定的可观察断点
  • 在调整窗口大小时更新当前视口断点

ko.bindingHandlers['viewport'] = {
init: function(element, valueAccessor) {
if (!document.getElementById('detect-viewport')) {
let detectViewportWrapper = document.createElement('div');
detectViewportWrapper.id = 'detect-viewport';
            

["xs", "sm", "md", "lg"].forEach(function(breakpoint) {
let breakpointDiv = document.createElement('div');
breakpointDiv.className = 'visible-' + breakpoint;
detectViewportWrapper.appendChild(breakpointDiv);
});


document.body.appendChild(detectViewportWrapper);
}


let setCurrentBreakpoint = function() {
valueAccessor()($('#detect-viewport div:visible')[0].className.substring('visible-'.length));
}
      

$(window).resize(setCurrentBreakpoint);
setCurrentBreakpoint();
}
};


ko.applyBindings({
currentViewPort: ko.observable()
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>


<div data-bind="viewport: currentViewPort"></div>
<div>
Current viewport breakpoint: <strong data-bind="text: currentViewPort"></strong>
</div>
<div>
(Click the <em>full page</em> link of this snippet to test the binding with different window sizes)
</div>

对于任何对此感兴趣的人,我使用 TypeScript 和 Observables 编写了一个基于 CSS 断点的断点检测。如果你删除了这些类型,把它变成 ES6并不是很困难。在我的例子中,我使用 Sass,但它也很容易删除这一点。

这是我的 JSFiddle: https://jsfiddle.net/StefanJelner/dorj184g/

HTML:

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.7/Rx.min.js"></script>
<div id="result"></div>

SCSS:

body::before {
content: 'xs';
display: none;


@media screen and (min-width: 480px) {
content: 's';
}


@media screen and (min-width: 768px) {
content: 'm';
}


@media screen and (min-width: 1024px) {
content: 'l';
}


@media screen and (min-width: 1280px) {
content: 'xl';
}
}

字体脚本:

import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Observable } from 'rxjs/Observable';


class BreakpointChangeService {
private breakpointChange$: BehaviorSubject<string>;


constructor(): BehaviorSubject<string> {
// initialize BehaviorSubject with the current content of the ::before pseudo element
this.breakpointChange$ = new Rx.BehaviorSubject(this.getBreakpoint());


// observe the window resize event, throttle it and combine it with the BehaviorSubject
Rx.Observable
.fromEvent(window, 'resize')
.throttleTime(0, Rx.Scheduler.animationFrame)
.withLatestFrom(this.breakpointChange$)
.subscribe(this.update.bind(this))
;


return this.breakpointChange$;
}


// method to get the content of the ::before pseudo element
private getBreakpoint(): string {
// see https://www.lullabot.com/articles/importing-css-breakpoints-into-javascript
return window.getComputedStyle(document.body, ':before').getPropertyValue('content').replace(/[\"\']/g, '');
}


private update(_, recent): void {
var current = this.getBreakpoint();
if(recent !== current) { this.breakpointChange$.next(current); }
}
}


// if the breakpoint changes, react on it
var $result = document.getElementById('result');
new BreakpointChangeService().subscribe(breakpoint => {
$result.innerHTML = Date.now()+': '+breakpoint;
});

我希望这能帮到别人。

Bootstrap4和 jQuery,简化的解决方案

<div class="device-sm d-sm-none"></div>
<div class="device-md d-md-none"></div>
<div class="device-lg d-lg-none"></div>
<div class="device-xl d-xl-none"></div>
<script>
var size = $('.device-xl').is(':hidden') ? 'xl' : ($('.device-lg').is(':hidden') ? 'lg'
: ($('.device-md').is(':hidden') ? 'md': ($('.device-sm').is(':hidden') ? 'sm' : 'xs')));
alert(size);
</script>

我对给出的答案并不真正满意,这些答案对我来说似乎过于复杂,所以我写了自己的解决方案。但是,目前这依赖于下划线/loash 来工作。

Https://github.com/leshrimp/gridsizeevents

你可以这样使用它:

GridSizeEvents.addListener(function (newSize, oldSize) {
// Will output eg. "xs -> sm"
console.log(oldSize + ' -> ' + newSize);
});

这对于 Bootstrap 3来说是不成立的,因为断点被硬编码为768px、992px 和1200px。对于其他版本,您可以很容易地调整代码。

这在内部使用 Match Media (),因此应该能够保证产生与 Bootstrap 同步的结果。

也许它可以帮助你们中的一些人,但是有一个插件可以帮助你检测当前的引导 V4断点: https://www.npmjs.com/package/bs-breakpoints

易于使用(可以使用或不使用 jQuery) :

$(document).ready(function() {
bsBreakpoints.init()
console.warn(bsBreakpoint.getCurrentBreakpoint())


$(window).on('new.bs.breakpoint', function (event) {
console.warn(event.breakpoint)
})
})

它已经有一段时间,因为 OP,但是这里是我的解决方案,使用 Bootstrap 3。在我的用例中,我只针对行,但是同样的方法也可以应用到容器等等。

只要改变。排到任何你想要的。

jQuery(document).ready(function ($) {


var alterClass = function () {


var ww = document.body.clientWidth;


if (ww < 768) {


$('.row').addClass('is-xs').removeClass('is-sm').removeClass('is-lg').removeClass('is-md');


} else if (ww >= 768 && ww < 992) {


$('.row').addClass('is-sm').removeClass('is-xs').removeClass('is-lg').removeClass('is-md');


} else if (ww >= 992 && ww < 1200) {


$('.row').addClass('is-md').removeClass('is-xs').removeClass('is-lg').removeClass('is-sm');


} else if (ww >= 1200) {


$('.row').addClass('is-lg').removeClass('is-md').removeClass('is-sm').removeClass('is-xs');


};
};


// Make Changes when the window is resized
$(window).resize(function () {
alterClass();
});


// Fire when the page first loads
alterClass();
});

以下是我的解决方案(Bootstrap 4) :

<div class="alert alert-warning row">
<div class="col">
Bootstrap breakpoint is
</div>
<div class="col">
<div class="d-block d-sm-none">
XS
</div>
<div class="d-none d-sm-block d-md-none">
SM
</div>
<div class="d-none d-md-block d-lg-none">
MD
</div>
<div class="d-none d-lg-block d-xl-none">
MD
</div>
<div class="d-none d-xl-block">
MD
</div>
</div>
</div>

这里有一个如何使用 CSS 变量的想法。 对于使用 CSS 的 Bootstrap 3(或 Bootstrap 4) :

:root {
--current-breakpoint: xs;
}
@media (min-width: 576px){
:root {
--current-breakpoint: sm;
}
}
@media (min-width: 768px){
:root {
--current-breakpoint: md;
}
}
@media (min-width: 992px){
:root {
--current-breakpoint: lg;
}
}
@media (min-width: 1200px){
:root {
--current-breakpoint: xl;
}
}

引导程序4和 SCSS 可能看起来像这样:

:root{
@include media-breakpoint-up(xs) {
--current-breakpoint:xs;
}
@include media-breakpoint-up(sm) {
--current-breakpoint:sm;
}
@include media-breakpoint-up(md) {
--current-breakpoint:md;
}
@include media-breakpoint-up(lg)  {
--current-breakpoint:lg;
}
@include media-breakpoint-up(xl)  {
--current-breakpoint:xl;
}
}

JS 代码可以是:

window.onresize=()=>{
console.log(getComputedStyle(document.documentElement).getPropertyValue('--current-breakpoint'));
}