【问题标题】:How can I programmatically position multiple backgrounds using Sass/Compass?如何使用 Sass/Compass 以编程方式定位多个背景?
【发布时间】:2012-07-28 09:59:18
【问题描述】:

我试图弄清楚如何在 Sass 中以编程方式定位多个背景,使用单个图像(精灵)和多个位置。

背景数量取决于分配给 $columns 的数量。我正在通过函数运行列数以确定左偏移量。顶部位置引用下一个精灵图像的位置。

想要的css:

.col-numbers {
background:
  url('numbers.png') 0 0 no-repeat,
  url('numbers.png') 94px -18px no-repeat,
  url('numbers.png') 188px -36px no-repeat,
  url('numbers.png') 282px -54px no-repeat,
  url('numbers.png') 376px -72px no-repeat;
}

我尝试了一个简单的循环,这当然是行不通的,因为它只是重复了背景属性,并没有产生预期的效果..

$columns: 12;

.col-numbers {
  @for $n from 1 through $columns {
    $left: (columns($n - 1, $columns) + gutters($columns));
    $top: (-$n + 1) * 18px;
    $background-pos: '#{$left} #{$top}';
    background: image-url('numbers.png') #{$background-pos} no-repeat;
  }
}

我想我可能必须创建一个函数来返回一个可以传回的值列表,但我不知道如何做到这一点。任何帮助,将不胜感激。

编辑:

感谢 hopper 的回答,我能够通过轻微的修改来达到预期的结果(由于我在原始帖子中的错误)。

  $output: ();

    @for $n from 1 through $columns {
      $left: (columns($n - 1, $columns) + gutters($columns));
      $top: (-$n + 1) * 18px;
      $output: join(
        $output,
        (image-url('numbers.png') #{$left} #{$top} no-repeat),
        comma
      );
    }

    background: $output;

【问题讨论】:

    标签: css ruby sass compass-sass


    【解决方案1】:

    您可以使用 SASS join function 将两个列表连接在一起,然后使用该主列表作为背景值。例如:

    $columns: 12;
    
    .col-numbers {
      $output: ();
    
      @for $n from 1 through $columns {
        $left: (columns($n - 1, $columns) + gutters($columns));
        $top: (-$n + 1) * 18px;
        $output: join(
          $output,
          (image-url('numbers.png'), $left $top no-repeat),
          comma
        );
      }
    
      background: $output;
    }
    

    有关更多信息,请查看SASS reference 的lists 部分。

    【讨论】:

    • 我在不应该有的地方有一个逗号,通过插入 $left 和 $top,并删除图像后的逗号,我能够得到想要的效果。谢谢,我学到了很多。
    • 只是为了澄清, $output: ();打算这样做..声明在范围之外使用的变量并将其标识为列表? ()
    • 完全正确! “()”表示 SASS 中的一个空列表,因此在第一次通过循环时,join() 会将背景与空列表合并。否则,SASS 会抱怨 $output 未初始化。
    • 感谢您的解释和代码示例,它真的帮助我理解了这里发生了什么。希望它也可以帮助其他人。我能够使用 2KB png sprite 在 Compass 网格背景上实现响应式数字,最多支持 61 列。非常适合调试。 skitch.com/krisbulman/ej55h/mozilla-firefox
    • 似乎在使用此方法时 compass 编译过程中存在错误,我在 Compass 问题队列中创建了一个示例项目和一个问题:github.com/chriseppstein/compass/issues/989(仅用于跟踪是否有人其他人正在阅读此主题)。
    猜你喜欢
    • 2013-08-15
    • 2011-08-16
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多