【问题标题】:Is there any js version for css media queries? - a use case scenario是否有用于 css 媒体查询的 js 版本? - 一个用例场景
【发布时间】:2014-07-29 16:35:10
【问题描述】:

当屏幕处于特定宽度时,我们希望隐藏一个按钮,而是允许包装 div 可点击。

这种情况应该只发生在以下情况:

@media only screen and (min-width:320px) {

虽然我们可以轻松地 display:none;display:block; 按钮,但当我们想要移除周围的包装 div(在更高的屏幕尺寸上)时,问题就来了,因为如果我们 display: none; 周围的 div,它们的所有内部内容也将被删除!

上面的媒体查询是否有任何 javascript 版本,可以是可靠的跨浏览器和跨操作系统,以便在某些屏幕条件下动态添加和删除元素?

【问题讨论】:

标签: javascript css media-queries


【解决方案1】:

是的,请检查:

https://developer.mozilla.org/en-US/docs/Web/API/Window.matchMedia

语法

mql = window.matchMedia(mediaQueryString)

其中 mediaQueryString 是一个字符串,表示要为其返回新 MediaQueryList 对象的媒体查询。

示例

if (window.matchMedia("(min-width: 400px)").matches) {
  /* the view port is at least 400 pixels wide */
} else {
  /* the view port is less than 400 pixels wide */
}

还有这样的 polyfill:

https://github.com/paulirish/matchMedia.js/

旧版 IE:

https://github.com/benschwarz/matchMedia.js/tree/IE7-8

如果你只关心一个简单的检查,这里是你如何用 jQuery 来做的,虽然用纯 Javascript 做它也很简单,因为你的旧 IE 要求,这更容易:

var timeout;

function onWindowResize() {
    var width = $(window).width();

    if (width <= 480) {
        console.log('small');
    } else if (width <= 767) {
        console.log('medium');
    } else if (width <= 1024) {
        console.log('large');
    } else {
        console.log('xlarge');
    }
}

$(window).resize(function() {
    clearTimeout(timeout);
    timeout = setTimeout(function() {
        onWindowResize();
    }, 50); // Only resize every 50ms - number up to you.
});

【讨论】:

  • @MEM 它应该适用于 IE9,事实上我很确定它可以。 IE8 甚至不支持 css 媒体查询,因此您永远无法获得适当的支持,但请检查此 github.com/paulirish/matchMedia.js/issues/13 并考虑不支持 IE8,它是一个古老的未使用浏览器
  • @DominicTobias - 确实 ie8 不支持媒体查询,但有一些脚本可以为 css 媒体查询执行此类工作,以便处理 ie8。我想知道 matchMedia 是否有同样的选择。 :)
  • @MEM 是的,检查我发布的那个问题,它有一个指向github.com/benschwarz/matchMedia.js/tree/IE7-8的链接
  • @DominicTobias 非常感谢您的澄清。我有最后一个问题:Jquery window.width 返回视口宽度。 (并且完全跨浏览器没有黑客)。您是否认为 matchMedia 更相关,因为它支持与媒体查询特别相关的其他内容? (例如方向?)。
  • @MEM 是的,这取决于您想要多少细节,如果您只是检查窗口宽度(无论如何您都在 IE8 中执行此操作),那么您可能只想进行简单的 window.width 检查,它会在调整窗口大小时重新检查 - 尽管您必须小心为每个调整大小事件执行逻辑,因为它在拖动浏览器宽度时每秒发生多次(“限制”逻辑,例如 underscorejs.org/#throttle
【解决方案2】:

不要使用JS直接改变元素的显示属性。改为修改与元素关联的类名。

然后您可以定义display: none 或在您的外部样式表中使用类选择器和媒体查询。

【讨论】:

  • @StevoPerisic - 这与我的回答有什么关系?
  • @Quentin:这看起来绝对简单而聪明。 :)
  • 对不起,我想对实际问题发表评论
  • 还是不明白。 :) 对不起。我们应该在更宽的屏幕上移除锚元素。考虑到这一点,您的解决方案将如何应用?
猜你喜欢
  • 1970-01-01
  • 2011-07-31
  • 2014-12-30
  • 2011-05-07
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多