gpt4 book ai didi

javascript - 在不对脚本中的断点宽度进行硬编码的情况下使用 JavaScript 检测动态媒体查询?

转载 作者:太空狗 更新时间:2023-10-29 12:31:21 25 4
gpt4 key购买 nike

我一直在寻找一种轻量级、灵活的跨浏览器解决方案,用于在 JavaScript 中访问 CSS 媒体查询,不会在 JavaScript 代码中重复 CSS 断点 .

CSS 技巧发布了一个 CSS3 animations-based solution ,这似乎可以解决问题,但它建议使用 Enquire.js相反。

Enquire.js 似乎仍然需要在脚本中硬编码媒体查询大小,例如

enquire.register("screen and (max-width:45em)", { // do stuff }

问题

到目前为止,所有在 Javascript 中访问媒体查询的解决方案似乎都依赖于在脚本中硬编码的断点。如何以允许仅在 CSS 中定义断点而不依赖于 .on('resize') 的方式访问断点?

尝试的解决方案

我已经制作了我自己的适用于 IE9+ 的版本,使用一个隐藏元素,该元素使用 :content 属性在查询触发时添加我想要的任何内容(与 ZeroSixThree's solution 相同的起点) :

HTML

<body>
<p>Page content</p>
<span id="mobile-test"></span>
</body>

CSS

#mobile-test {
display:none;
content: 'mq-small';
}
@media screen only and (min-width: 25em) {
#mobile-test {
content: 'mq-medium';
}
}
@media screen only and (min-width: 40em) {
#mobile-test {
content: 'mq-large';
}
}

使用 jQuery 的 JavaScript

// Allow resizing to be assessed only after a delay, to avoid constant firing on resize. 
var resize;
window.onresize = function() {
clearTimeout(resize);
// Call 'onResize' function after a set delay
resize = setTimeout(detectMediaQuery, 100);
};

// Collect the value of the 'content' property as a string, stripping the quotation marks
function detectMediaQuery() {
return $('#mobile-test').css('content').replace(/"/g, '');
}

// Finally, use the function to detect the current media query, irrespective of it's breakpoint value
$(window).on('resize load', function() {
if (detectMediaQuery() === 'mq-small') {
// Do stuff for small screens etc
}
});

这样,媒体查询的断点就完全由 CSS 处理了。如果您更改断点,则无需更新脚本。如何做到这一点?

最佳答案

试试这个

const mq = window.matchMedia( "(min-width: 500px)" );

matches属性根据查询结果返回true或false,例如

if (mq.matches) {

// window width is at least 500px
} else {
// window width is less than 500px
}

您还可以添加一个事件监听器,它会在检测到更改时触发:

// media query event handler
if (matchMedia) {
const mq = window.matchMedia("(min-width: 500px)");
mq.addListener(WidthChange);
WidthChange(mq);
}

// media query change
function WidthChange(mq) {
if (mq.matches) {
// window width is at least 500px
} else {
// window width is less than 500px
}

}

关于javascript - 在不对脚本中的断点宽度进行硬编码的情况下使用 JavaScript 检测动态媒体查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44688393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com