带有一些 LESS 魔法的花式媒体查询

Posted

技术标签:

【中文标题】带有一些 LESS 魔法的花式媒体查询【英文标题】:Fancy Media Queries with some LESS Magic 【发布时间】:2013-03-28 02:20:29 【问题描述】:

如果使用 less 在一些 css 类中包装不同分辨率的 css 样式会很好。

我想做这样的事情:

footer 
  width: 100%;


.tablet 
  footer 
    width: 768px;
  


.desktop 
  footer 
    width: 940px;
  

最后应该是这样的结果:

footer 
  width: 100%;


@media screen and (min-width: 768px) 
  footer 
    width: 768px;
  


@media screen and (min-width: 992px) 
  footer 
    width: 940px;
  

.tablet 可能看起来像这样:

@media screen and (min-width: 768px) 
  .tablet 

  

希望有人有一个好主意!

【问题讨论】:

Media Query grouping instead of multiple scattered media queries that match 的可能重复项 根据与 @zzzzBov 的 cmets 中的对话,也许我们需要更清楚您的问题是关于 what 您想要实现的目标以及 如何 i> 你想要实现它。 【参考方案1】:

这就是我在项目中使用的:

    @mobile:   ~"only screen and (min-width: 320px) and (max-width: 767px)";
    @tablet:    ~"only screen and (min-width: 768px) and (max-width: 991px)";
    @ipad:    ~"only screen and (min-width: 992px) and (max-width: 1024px)";

    @media @mobile 
      .banner
        width: auto;
      
    

    @media @tablet 
      .banner
        width: 720px;
      
    

  @media @ipad 
      .banner
        width: 920px;
      
    

【讨论】:

【参考方案2】:
@highdensity:  ~"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)";

@mobile:        ~"only screen and (max-width: 750px)";
@tab:       ~"only screen and (min-width: 751px) and (max-width: 900px)";
@regular:        ~"only screen and (min-width: 901px) and (max-width: 1280px)";
@extra-large:  ~"only screen and (min-width: 1281px)";

【讨论】:

【参考方案3】:

Nguyen 和 Yancey +1 - 再加上一个。

如果您想要显式定义宽度,您可以使用string interpolation 和断点变量来实现。这里以 bootstrap 为例 - 严格的规则是为了防止定义重叠。

@screen-xs-min:     480px;
@screen-sm-min:     768px;
@screen-md-min:     992px;
@screen-lg-min:     1200px;

@screen-xs-max:     (@screen-sm-min - 1);
@screen-sm-max:     (@screen-md-min - 1);
@screen-md-max:     (@screen-lg-min - 1);

@phone:             ~"only screen and (max-width: @screen-xs-min)";
@phone-strict:      ~"only screen and (min-width: @screen-xs-min) and (max-width: @screen-xs-max)";
@tablet:            ~"only screen and (min-width: @screen-sm-min)";
@tablet-strict:     ~"only screen and (min-width: @screen-sm-min) and (max-width: @screen-sm-max)";
@desktop:           ~"only screen and (min-width: @screen-md-min)";
@desktop-strict:    ~"only screen and (min-width: @screen-md-min) and (max-width: @screen-md-max)";
@large:             ~"only screen and (min-width: @screen-lg-min)";

footer
    width: 100%;
    @media @tablet 
        width: 768px;
    
    @media @desktop 
        width: 940px;
    

【讨论】:

这个“-strict”到底是什么,从你写的内容来看,我无法理解这个结构。你有什么资料可以指点我进一步阅读这个主题吗? 实际上,“严格查询”是为了方便起见,仅当您希望您的 CSS 专门应用于单个屏幕范围时才应使用。当首先使用移动设备时(例如:zellwk.com/blog/how-to-write-mobile-first-css),我会说,它们的使用可能有点设计味道,我通常会尽量避免使用它们。但根据具体情况,您可能希望某些(重)CSS 专门针对,例如 @tablet,并且您不想覆盖它,例如 @desktop 和/或 @large。在这些情况下,您可以使用严格查询(此处为 @tablet-strict)。【参考方案4】:

我们使用这样的设置:

@vp_desktop:    801px;
@vp_tablet:     800px;
@vp_mobile:     400px;

.OnDesktop(@rules)  @media screen and (min-width:@vp_desktop) @rules();  ;
.OnTablet(@rules)  @media screen and (max-width:@vp_tablet) @rules();  ;
.OnMobile(@rules)  @media screen and (max-width:@vp_mobile) @rules();  ;

您只需要设置变量,其余的由 mixin 处理,因此它很容易维护,但仍然很灵活:

div 
  display: inline-block;
  .OnTablet(
    display: block;
  );

值得一提的是,虽然这种技术非常简单,但如果使用不当,您的 CSS 输出将充满媒体查询。我尝试将媒体查询限制为每个断点、每个文件 1 个。文件在哪里是 header.less 或 search.less。

注意除非您使用 javascript 编译器,否则此方法可能无法编译。

【讨论】:

【参考方案5】:

我正在使用这些 mixins 和变量

.max(@max; @rules)@media only screen and (max-width: (@max - 1))@rules();
.min(@min; @rules)@media only screen and (min-width: @min)@rules();
.bw(@min; @max; @rules)@media only screen and (min-width: @min) and (max-width: (@max - 1))@rules();

@pad: 480px;
@tab: 800px;
@desktop: 992px;
@hd: 1200px;

所以这个

footer
    width: 100%;
    .bw(@tab,@desktop,
        width: 768px;
    );
    .min(@desktop,
        width: 940px;
    );

变成

footer 
  width: 100%;

@media only screen and (min-width: 800px) and (max-width: 991px) 
  footer 
    width: 768px;
  

@media only screen and (min-width: 992px) 
  footer 
    width: 940px;
  

【讨论】:

【参考方案6】:

你也可以像这样组合媒体查询

@media @desktop, @tablet, @ipad 

//common styles... 


【讨论】:

【参考方案7】:

我完全同意 Hai Nguyen 的回答(已被接受),但您可以通过执行以下操作进一步清理它:

@desktop:   ~"only screen and (min-width: 960px) and (max-width: 1199px)";
@tablet:    ~"only screen and (min-width: 720px) and (max-width: 959px)";

footer
  width: 100%;
  @media @tablet 
    width: 768px;
  
  @media @desktop 
    width: 940px;
  

它本质上是一样的,但可以让您将媒体查询嵌套在原始选择器中。它将特定元素的所有 CSS 保存在一起,并使您的样式更加模块化(与拆分断点方法相比)。

【讨论】:

读完后,我发现这个 Grunt 任务在嵌套 MQ 编译后对 MQ 进行分组:github.com/buildingblocks/grunt-combine-media-queries 消除膨胀。 这很好,很干净。请问,为什么“only...”前面的~? 在 LESS 中,字符串 "" 字面量之前的波浪号 ~ 按原样输出字符串,因为它可能是纯 LESS 中的语法错误。 如果您尝试在“文字字符串”内部进行操作怎么办?假设我想使用一个变量来包含屏幕分辨率,例如:我可以做类似的事情:~"only screen and (min-width: @mySize - 20px)"。我知道它不起作用,但是这样做的正确方法是什么?【参考方案8】:

这是我在项目中所做的:

@desktop:   ~"only screen and (min-width: 960px) and (max-width: 1199px)";
@tablet:    ~"only screen and (min-width: 720px) and (max-width: 959px)";

@media @desktop 
  footer 
    width: 940px;
  


@media @tablet 
  footer 
    width: 768px;
  

这允许您只定义一次媒体查询,并且可以在您的 less 文件中使用它。也更容易阅读。 :)

【讨论】:

这太棒了,谢谢@Hai! Visual Studio 中的一个小问题是,在 .less 文件中使用 @media 时会生成此警告消息:“样式规则中出现意外的 '@' 块”。不过,这似乎不是问题。 为什么我不能将@media 拉到第 1+2 行定义的变量中? ➪ 遗憾的是,纯 @tablet ... 无法解析,而 @media @tablet ...(如果带入字符串,当然会导致两倍的 @media

以上是关于带有一些 LESS 魔法的花式媒体查询的主要内容,如果未能解决你的问题,请参考以下文章

0082 rem适配方案:less+rem+媒体查询flexible.js+rem

Web移动前端开发-——rem+less+媒体查询,rem+flexble.js+媒体查询

LESS、媒体查询和性能

LESS:您可以将 CSS 选择器与媒体查询分组吗?

使用 css 变量(没有 SASS/LESS)设置媒体查询的最小/最大宽度?

媒体查询分组而不是匹配的多个分散的媒体查询