【问题标题】:Syncing CSS and JS media queries cross-browser跨浏览器同步 CSS 和 JS 媒体查询
【发布时间】:2013-04-13 01:29:31
【问题描述】:

在进行响应式设计时,我会使用 CSS3 媒体查询,包括使用 respond.js 的旧浏览器。有时我还需要使用 JavaScript/jQuery 来操作页面上的某些元素。但是,当使用 $(window).width() 时,由于浏览器 chrome 和/或垂直滚动​​条的存在,该值通常与 CSS 媒体查询中使用的值不同,这意味着 CSS 媒体查询将在与 JS 媒体查询不同的断点。

我知道 Modernizr 通过使用 Modernizr.mq 缓解了这个问题,但这只适用于一开始就支持 CSS 媒体查询的浏览器,通常意味着它不适用于 IE8 及更低版本。如果您使用 polyfill 为这些旧浏览器添加媒体查询支持(例如,respond.js),那么 Modernizr.mq 由于两者之间的冲突/覆盖而不再工作。

我所做的是利用页面上的隐藏输入元素,并在每个媒体查询中为其赋予 CSS 宽度样式。然后我有一个在页面上自动运行(和调整大小)的函数,它获取该宽度值并执行以下操作:

        if (width == "320px" ) {
            //Functions
        }

        //481px to 600px
        else if (width == "481px" ) {
            //Functions
        }

        //601px to 768px
        else if (width == "601px" ) {
            //Functions
        }

        //769px to 960px
        else if (width == "769px" ) {
            //Functions
        }

        //769 to 1024px
        else if (width == "961px" ) {
            //Functions
        }

        //1024px+
        else {
            //Functions
        }

这基本上迫使 JS 完全脱离 CSS 媒体查询,同步两者。这可以变得更加具体,而不是像我所拥有的那样通用,而是根据特定元素和随该元素更改的特定样式触发,这取决于各个项目的需求。

那么我的问题是,有没有更简单的方法可以做到这一点?我花了相当多的时间研究和试验这个,它似乎是迄今为止考虑到旧浏览器的最佳选择。

【问题讨论】:

    标签: javascript css cross-browser media-queries


    【解决方案1】:

    PPK 在他的博客上列出了一种配对 CSS 和 JS 的好方法,这有点支持您的方法:

    @media all and (max-width: 900px) {
    // styles
    }
    
    if (document.documentElement.clientWidth < 900) {
       // scripts
    }
    

    他的完整帖子是here

    还有enquire.js 插件。

    【讨论】:

    • 我实际上已经阅读了该帖子,并感谢您的回复。 Screen.width 返回一个一致的值,因为它显然会评估屏幕宽度而不是窗口宽度,这意味着如果您调整浏览器窗口的大小,您将不会看到任何响应更改。虽然这本质上不是问题,但它确实使测试变得更加困难,因为您必须在特定宽度的实际设备上进行测试。
    • 另外,使用 Enquire,您需要使用 polyfill 来添加 mediaMatch 支持。但是,为了让 IE8 及以下版本完全识别媒体查询,您还必须使用 polyfill 来支持媒体查询……这两个 polyfill 不能一起工作。这意味着如果我希望我的 JS/CSS 同步,我的查询必须全部在 JS 中或全部在 CSS 中。如果这是有道理的......大声笑
    • 如果 oldIE 是一个问题,也许是 RespondJS?
    猜你喜欢
    • 2013-04-24
    • 2013-08-10
    • 2012-05-29
    • 2013-03-15
    • 2014-10-01
    • 2016-06-01
    • 2017-10-05
    • 1970-01-01
    • 2016-10-14
    相关资源
    最近更新 更多