2012-06-05 55 views
39

我正在研究iPad特定的网站。为了使双方的Retina显示屏的iPad和旧版本的iPad的在我的网站的工作,我想在像媒体查询设置变量LESS CSS:LESS CSS设置媒体查询中的变量?

@media all and (max-width: 768px) { 
    @ratio: 1; 
} 

@media all and (min-width: 769px) { 
    @ratio: 2; 
} 

所以,当你设置在像素东西,你可以做

width: 100px * @ratio; 

但我收到了一个编译错误,说没有定义@ratio。有没有可能有一个解决方法,使其工作?谢谢。

+0

尝试在媒体查询之前在“全局范围”中声明'@ ration',然后在其中进行修改。 – Bojangles

+0

@JamWaffles LESS中的所有变量都是常量 – Paulpro

+0

今天我有同样的问题,我发现了一个解决方案:http://stackoverflow.com/questions/15473328/break-out-of-scope –

回答

40

这将是很好,但这是不可能的,这样做。

LESS将您的媒体查询编译为实际媒体查询,因此在编译时没有指示哪个媒体查询与浏览器相关。

编译后,你只需要CSS不会少,所以你不能再有变量了。

你可以做到这一点,而不是,但它并不像优雅:

@base_width: 100px; 

@media all and (max-width: 768px) { 
    .something { 
     width: @base_width; 
    } 
} 

@media all and (min-width: 769px) { 
    .something { 
     width: @base_width * 2; 
    } 
} 
+0

感谢您的解释。所以看起来似乎没有办法实现一些关闭? – Sean

+1

@Sean这个项目可能是你感兴趣的:https://github.com/imulus/retinajs它看起来像你想用宽度来做到这一点,但如果你正在寻找在视网膜显示的背景图像中加倍的分辨率,该回购有一个名为retina.less的文件,它有一个mixin。 – Paulpro

+0

我明白了。这不完全是我想要的,因为我有很多较少的文件。也许我们必须使用%或em。 – Sean

1

这是一个小的hackish,但一个可能的解决方案是将所有单位设置字体大小的包装元素,并设置为em

HTML:

<div id="wrap"> 
    <div class="child1"></div> 
    <div class="child2"></div> 
</div> 

LESS:

#wrap 
    { 
    font-size: 100px; 
    width: 10em; // = 1000px; 
    @media all and (max-width: 768px) 
     { 
     font-size: 60px; 
     } 
    .child1 
     { 
     width: 5em; // 500px normally, 300px on small screens 
     } 
    .child1 
     { 
     width: 2.5em; // 250px normally, 150px on small screens 
     } 
    } 

这当然不起作用,如果你有元素包含文本和孩子。

+2

这是一种解决方法,而不是对问题的回答。 – Flimm

-2

用较少的我们可以为媒体查询定义变量。
首先是检测的iPad分辨率:

@iPad: ~"only screen and (min-width: 40.063em) and (max-width: 64em); 

这些EM相当于641px和1,024像素。


现在检测分辨率高:

@highResolution: ~"only screen and (-webkit-min-device-pixel-ratio: 1.5)", 
      ~"only screen and (min--moz-device-pixel-ratio: 1.5)", 
      ~"only screen and (-o-min-device-pixel-ratio: 3/2)", 
      ~"only screen and (min-device-pixel-ratio: 1.5)"; 



现在我们可以在媒体查询结合这2个变量是这样的:

@media @iPad, @highResolution{ .yourCssClass{} } 

这将是有效的只是在iPad上(或类似分辨率)与视网膜显示(或类似的像素密度)。

0

我发现接受的解决方案无法工作,因为没有定义,编译器会抱怨的混入。一种替代解决方案:

@base_width: 100px; 

.mixin { 
    width: @base_width; 

    @media all and (min-width: 769px) { 
     width: @base_width * 2; 
    } 
} 
3

我知道我迟到了,但我的答案有人会觉得这很有用。

您可以将您的样式到一个单独的文件

// styles.less 
.foo { 
    width: 100px * @ratio; 
} 

然后多次导入的文件改变变量值

// main.less 
@ratio: 1; // initial value 

@media all and (max-width: 768px) { 
    @ratio: 1; 
    @import (multiple) "styles"; 
} 

@media all and (min-width: 769px) { 
    @ratio: 2; 
    @import (multiple) "styles"; 
} 

需要注意的是(多)在这里很重要

编译代码将如下所示

// main.css 
@media all and (max-width: 768px) { 
    .foo { 
    width: 100px; 
    } 
} 
@media all and (min-width: 769px) { 
    .foo { 
    width: 200px; 
    } 
} 
+0

简单而精彩的解决方案! +1 – JTennessen

+0

如果您有一个使用此方法的大型样式束,它实际上会削弱chrome开发工具。 – Perfection