javascript - 将 window.resize 替换为 CSS 媒体查询?

标签 javascript jquery css media-queries window-resize

当窗口调整到 400px 断点以下时,我需要调用一个函数。处理这个问题的明显解决方案是像这样观察 window.resize() 事件:

Window.Resize解决方案

脚本:

$(window).resize(function(){
    if($(window).width() < 400)
       console.log("trigger");
});

Window.resize Fiddle

然而,随着调整大小的发生,这会持续触发,这可能会导致对该函数进行数百次调用,并且会在不必要的时候触发,例如从 300 像素调整到 200 像素;

在尝试找到避免这种情况的方法时,我想出了一个使用 CSS 媒体查询的解决方案:

CSS 媒体查询解决方案

脚本:

$(".foo").on('transitionend', function () {
   console.log("trigger")
});

CSS:

.foo
{
    width: 0;
    height: 0;
    color: white;
    transition: 0.1s;
}
@media screen and (max-width: 400px) {
    .foo {
        color: gray;
    }
}

CSS Media Query Fiddle

这里的想法是,CSS 监 window 口大小调整为 400px,然后将任意过渡应用到不可见元素。完成后,将触发 transitionend 事件,监听器将调用我的函数。这只会在屏幕低于 400px 时发生一次,而当它回到 400px 以上时会发生一次。

现在这个解决方案当然有缺陷:

  • IE8/IE9不支持transitionend
  • 您必须为每个要观看的调整大小事件创建一个不必要的元素
  • 代码本质上更容易混淆,因为它是一种“hacky”技术。

但除了那些失败之外,我想知道如果您想避免连续调用,这种方法是否会更有效/更好地使用。或者媒体查询的底层实现比调整大小事件做的工作更多。

最佳答案

我认为您的主要问题是将代码拆分到很多地方。是的,CSS 很好,但是现在您的代码依赖于两个地方!对此进行排序的最简单方法是将您的值简单地存储在 JS 中:

var isSmall = false;
$(window).resize(function(){
    if(
        (window.innerWidth < 400 && !isSmall) ||
        (window.innerWidth > 400 && isSmall)
    ){
        console.log('we have passed the treshold!');
        isSmall = !isSmall;
    }
}).resize();

我想使用 CSS transitionend 会起作用,但保持同步似乎很麻烦。

关于javascript - 将 window.resize 替换为 CSS 媒体查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32184438/

相关文章:

javascript - 从 ng-repeat 访问父 Controller

javascript - 如何使用发布请求打开新选项卡?

javascript - 更改嵌入推文的最大宽度

javascript - jquery向页面添加HTML代码

javascript - 无法获取从服务中填充的 $scope.data Angular

Javascript 函数无法根据包含的 jquery 版本工作。

jquery - 如何通过 View 中的 Json 访问 Controller 值并在 jquery 中循环?

javascript - Awesoplete - 获取期权值(value)

css - 背景颜色比文本延伸得更远,并位于 float 元素下方

html - Bootstrap 表单与搜索表单中的 h1 不对齐