【发布时间】:2012-12-17 19:47:30
【问题描述】:
目前,我使用 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>上的字体大小设置为基本字体大小 -
myVarLESS 变量在rem而不是px中定义为基本字体大小的派生词 - 使用
@media查询来调整不同媒体的基本字体大小。 -
可选 将REM unit polyfill 用于尚不支持
rem(http://caniuse.com/#search=rem) 的浏览器。这在 IE 8 及更低版本中不起作用,但不是因为缺乏对rem- it doesn't support media queries 的支持。因此,无论如何,IE8 及以下版本都会获得全尺寸无媒体查询样式表。
代码sn-p:
@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,其中包含更广泛的示例,它将不同字体大小的元素与不同的测量块混合在一起。
简单灵活,满足我的需求。希望对其他人有所帮助。
【问题讨论】:
-
我认为这在任何 CSS 编译器中都是不可能的。编译器必须为您生成
@media ... { .myElement { padding: ... } }。尽管这很有可能,但这将无法控制您。为什么不直接在@media ... { ... }查询中包含.myElement {...}或使用在其中导入的 mixins(以减少重复)? -
@try-catch-finally,重复的问题在于维护。如果我有相当多的媒体查询甚至更多元素,取决于媒体查询相关变量,这将是一场维护噩梦。
-
如果这是您对媒体查询所做的事情的一个示例,那么您就是导致维护噩梦的人。根据浏览器的宽度,您的填充有不同的 px 值?请改用百分比。
-
@cimmanon,我很欣赏你的意见,但你认为我并没有真正使用 'myVar' 和 '。 myElement' 在真实的代码中,你呢?我认为这不是很聪明。如果我举一个真实的例子,这个问题将是不可读的。感谢您的宝贵时间。
-
@spliter 变量和类的名称无关紧要。我只能根据您提供的内容来判断,我的观点仍然成立:您是造成维护噩梦的人。如果你把事情简单化太多,你最终会得到过于简单的解决方案。
标签: css less media-queries sass