更换观察窗.使用CSS媒体查询来调整大小
Replace watching window.resize with a CSS media query?
我需要调用一个函数当一个窗口的大小低于400px的断点调整。处理这个问题的一个明显的解决方案是像这样观察window.resize()
事件:
窗口。调整解决方案
脚本:
$(window).resize(function(){
if($(window).width() < 400)
console.log("trigger");
});
窗口。调整小提琴
然而,它会随着大小调整的发生而不断触发,这可能会导致对该函数的数百次调用,并且会在不必要的时候触发,比如将大小从300px调整到200px;
在试图找到避免这种情况的方法时,我想出了一个使用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观察窗口调整到400px,然后应用一个任意过渡到一个不可见的元素。完成之后,将触发transitionend
事件并调用侦听器。这只在屏幕低于400px时发生一次,在屏幕高于400px时发生一次。
当然这个解决方案也有缺陷:
- IE8/IE9不支持transitionend
- 你必须为你想要观看的每个调整大小事件创建一个不必要的元素
- 代码本质上更令人困惑,因为它是一个"黑客"技术。
但是除了这些缺点之外,我想知道如果你想避免连续的调用,这种方法是否会更有效/更好地使用。或者,媒体查询的底层实现是否比resize事件做了更多的工作?
我认为你的主要问题是将代码分割到很多地方。是的,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
将工作,但它似乎是如此繁琐,以保持同步
相关文章:
- 内部分区字体大小获胜'调整浏览器窗口大小时不会随媒体查询而更改
- 调整窗口大小时,可拖动的对象会出现在容器外部
- ExtJS——在展开/折叠时调整面板高度
- j查询utc offSets的时差
- 如何有效地将游戏数据存储在URL查询字符串中
- 媒体查询和调整现成的网站
- 基于媒体查询的angular js动画无法调整窗口大小
- AJAX查询处于活动状态时禁用窗口大小调整
- j查询调整大小时移动元素
- 使用显示的响应式导航栏:无仍然显示,即使它旨在显示何时使用媒体查询调整屏幕大小
- 媒体查询和 JavaScript 窗口调整不同的宽度
- j查询窗口大小调整和媒体查询
- XSS 攻击漏洞 - 使用 JavaScript 或 jQuery 调整查询
- j查询自动调整选项卡的高度
- 有没有一种方法可以将每个文本区域自动调整为其大小's从数据库查询返回的数据
- 在窗口上设置产品滑块宽度,同时调整CSS媒体查询的大小
- 调整浏览器大小时,Modernizr Media查询不起作用
- 更换观察窗.使用CSS媒体查询来调整大小
- Fire脚本一次与JQuery窗口大小调整和媒体查询
- 使用媒体查询调整图像大小