目前,我使用 LESS 作为我的主要 CSS 预处理器。我有(而且我相信很多人都有这种需要)在@media
查询中定义变量,例如:
@media screen and (max-width: 479px) {
myVar: 10px;
}
@media screen and (min-width: 480px) and (max-width: 767px) {
myVar: 20px;
}
@media screen and (min-width: 768px) {
myVar: 30px;
}
.myElement {
padding: @myVar;
}
由于编译性质,这在 LESS 中不起作用(@myVar
仅在每个特定的范围内定义@media
,但不是全局定义)。即使我@myVar
在媒体查询之前全局定义,它也不会根据媒体查询进行更新,.myElement
无论如何都会获得该初始值。
所以,问题是,是否有可能在任何其他 CSS 预处理器中实现这一点,或者我们注定要.myElement
在每个媒体查询中覆盖?在这个最简单的例子中不是问题,但在实际项目中,这可以节省大量时间和复制/粘贴。
编辑: 不是解决方案,而是我的特定项目的解决方法:
- 将字体大小设置
<html>
为基本字体大小 myVar
LESS 变量被定义为rem
而不是px
作为基本字体大小的衍生物- 使用
@media
查询来调整不同媒体的基本字体大小。 - 可选对尚不支持的浏览器使用REM 单元 polyfill
rem
( http://caniuse.com/#search=rem )。这在 IE 8 及更低版本中不起作用,但不是因为缺乏对rem
-它不支持媒体查询的支持。因此,无论如何,IE8 及以下版本都会获得全尺寸的无媒体查询样式表。
代码片段:
@myVar: .77rem; // roughly 10px, 20px and 30px respectively
html { font-size: 13px }
@media screen and (min-width: 480px) and (max-width: 767px) {
html { font-size: 26px }
}
@media screen and (min-width: 768px) {
html { font-size: 39px }
}
.myElement {
padding: @myVar;
}
这是一个具有更广泛示例的JSBin,它将不同字体大小的元素与不同测量的块混合在一起。
轻松灵活地满足我的需求。希望对其他人有所帮助。