在浏览器调整大小(视口宽度)时动态添加类

Posted

技术标签:

【中文标题】在浏览器调整大小(视口宽度)时动态添加类【英文标题】:Dynamically add class on browser resize (viewport width) 【发布时间】:2015-02-25 00:16:41 【问题描述】:

我有一个名为 jobfilter 的元素,我想根据视口宽度添加一个类,即。当我将浏览器大小调整为

现在,借助此链接:$(window).width() not the same as media query,我设法让它工作了一半。 使用这个:

  function checkPosition() 
    if (window.matchMedia('(max-width: 767px)').matches) 
        //...
     else 
        //...
    

这是我的 JSFiddle:http://jsfiddle.net/ck55Lf01/10/。

如果您调整浏览器大小并刷新页面,jobfilter 会隐藏,但我希望这种情况动态发生,而不是在页面刷新时发生,谢谢您的帮助!

【问题讨论】:

为什么不使用没有 Jquery 的 css mediaQueries?它会更容易工作 【参考方案1】:

你必须监听 resize 事件。

$( window ).resize(function() 
   checkPosition();
);

【讨论】:

【参考方案2】:

这是我用来在调整大小时动态检查窗口宽度的函数,我将它包装在一个文档就绪函数中,该函数将 $ 作为参数传递,以防止与使用 $ 的其他 javascript 库可能发生的任何冲突。例如,如果您要在 wordpress 主题或插件中使用您的函数。

Jsfiddle 示例:http://jsfiddle.net/larryjoelane/ck55Lf01/24/

Javascript:

/*
document ready function used to prevent conflict with other javascript libraries
that use the $ parameter
*/
jQuery(document).ready(function($)

     //get the window width
     var winWidth =  $(window).width();

      //set the maxWidth
     var maxWidth = 1000;

          //if the window width is less than the maxWidth pixels on document loading
          if(winWidth < maxWidth)//begin if then

            //add the class hidden to .jobFilter         
            $(".jobfilter").addClass("hidden");

         //end if then



$(window).resize(function()//begin resize event


    //get the window width
     var winWidth =  $(window).width();

      //set the maxWidth
     var maxWidth = 1000;    


         //if the window width is less than maxWidth pixels
         if(winWidth < maxWidth)//begin if then

            //add the class hidden to .jobFilter         
            $(".jobfilter").addClass("hidden");

         
         else

            //remove the class hidden                 
            $(".jobfilter").removeClass("hidden");


     //end if then else


     );//end window resize event

);//end document ready function

【讨论】:

【参考方案3】:

使用 resize 事件检查窗口是否调整大小。使用此代码

$( window ).resize(function() 
function checkPosition() 
if (window.matchMedia('(max-width: 767px)').matches) 
    //...
 else 
    //...




希望对你有帮助

【讨论】:

【参考方案4】:
$(document).ready(function()
   DOaction(); // run function after document ready
    $(window).on('resize',DOaction); // on resize window run function
);
// function to add and remove hidden class
function DOaction()
    if($(window).width() <= 1000)
        $(".jobfilter").addClass('hidden');
    else
        $(".jobfilter").removeClass('hidden');
    

Jsfiddle

【讨论】:

【参考方案5】:

2021 年 8 月更新

matchMedia 有一个事件监听器仍然是一个鲜为人知的事实。每当它发生变化时,它都会触发一个“变化”事件。您可以使用它来根据它是否匹配来切换一个类,并监听该匹配的变化,而无需将任何东西绑定到(可能很重的)窗口调整大小事件。

function doSomething(matches) 

    if (matches) 
        // media query matches
     else 
        // media query does not match
    



const query = window.matchMedia("(max-width: 767px)");
query.addEventListener("change", ( matches ) => doSomething(matches));
doSomething(query.matches);

MDN 也提到了这一点。

原答案

鲜为人知的事实:matchMedia 有一个事件监听器:

function handleMedia(mql) 

    if (mql.matches) 
        // media query matches
     else 
        // media query does not match
    



var mql = window.matchMedia('(max-width: 767px)').addListener(handleMedia);
handleMedia(mql);

每次浏览器匹配或不匹配媒体查询时,都会执行事件监听器。在您的情况下,我建议您也手动触发处理程序(如示例中所示),以确保在加载时设置正确的类。

这个例子取自MDN(虽然它隐藏得很好)。

【讨论】:

你是英雄,刚刚在MDN上看到这个,完全错过了听众!

以上是关于在浏览器调整大小(视口宽度)时动态添加类的主要内容,如果未能解决你的问题,请参考以下文章

根据内容大小动画和调整 div 动态高度

获取浏览器视口的宽度和高度,无论内容大小如何且不调整为 100%?

在使用 css 调整窗口大小时调整 div 的宽度和高度

使用视口动态调整 3x3 方格的大小

在窗口调整大小时动态调整画布大小

如果视口超过一定宽度,则停止图像元素下载图像