2012-04-25 80 views
9

我正在使用sass和指南针,我正在尝试为匹配给定模式的图像创建css类。 预期的/生成的CSS大多是这样的:获取sass /罗盘文件列表

.class1 { background-image: url(class1.png); } 
.class2 { background-image: url(class2.png); } 

虽然有可能在我的情况下使用指南针精灵功能(http://compass-style.org/help/tutorials/spriting/)不方便(因为它会生成新文件)作为图像它们本身就是精灵画面。

所以能够做到像

@each $clazz in listFiles("images/*") { 
    .#{$clazz} { 
    background-image: url('#{$clazz}.png'); 
    } 
} 

将是巨大的。 有没有或多或少简单的方法来做到这一点?

回答

21

您可以通过用您自己的自定义Ruby功能补充内置的SASS/Compass功能来实现此目的。 (见标题为在SASS参考here“添加自定义功能”一节。)只要定义一个Ruby的文件(比如说,“列表files.rb”)与您的自定义代码如下所示:

module Sass::Script::Functions 
    def listFiles(path) 
     return Sass::Script::List.new(
      Dir.glob(path.value).map! { |x| Sass::Script::String.new(x) }, 
      :comma 
     ) 
    end 
end 

然后,你可以包括你的指南针配置文件这个文件(比如,“config.rb”):

require File.join(File.dirname(__FILE__), 'list-files.rb') 

,并获得在你的SASS的样式表,就像你想:

@each $clazz in listFiles("images/*") { 
    .#{$clazz} { 
    background-image: url('#{$clazz}.png'); 
    } 
} 

然后,您可以使用compass compile -c config.rb进行编译,正常情况下。

+0

这使我的完整文件路径列表(即images/filename1.png)。有没有简单的方法来获得红宝石新手的基名? – morewry 2012-11-27 00:49:53

+5

@morewry当然,只要使用Ruby的[File.basename](http://www.ruby-doc.org/core/File.html#method-c-basename)方法:'Sass :: Script :: String.new (File.basename(X))'。 – hopper 2012-11-27 13:45:46

+2

你也可以使用'Sass :: Script :: String.new(File.basename(x,“。*”))'来得到没有扩展名的文件名。 – 2013-11-09 09:02:11