使用 Compass 生成雪碧图-阿里云开发者社区

开发者社区> 开发与运维> 正文

使用 Compass 生成雪碧图

简介: 使用 Compass 创建一个项目 要在一个新项目中使用 Compass,可以打开命令行工具并输入如下指令 1 compass create my-project 如果 my-project 目录不存在,上述命令会创建一个叫做 my-project 的目录,并在其中添加以下文件: 如果你没有为compass create命令传递一个目录参数,它将使用你当前所在的目录。

使用 Compass 创建一个项目


要在一个新项目中使用 Compass,可以打开命令行工具并输入如下指令

1
compass create my-project


如果 my-project 目录不存在,上述命令会创建一个叫做 my-project 的目录,并在其中添加以下文件:

wKioL1hjJpGTu5VpAAAkZMXTHik172.png


如果你没有为compass create命令传递一个目录参数,它将使用你当前所在的目录。


在config.rb文件中,你可以对Compass的一些配置进行修改,例如资源位置和压缩程度。sass目录包含了一些初始的样式表,你可以对它们进行编辑、重命名,或者完全抛弃,但是这个文件夹是你存放Sass样式表的地方。最后,stylesheets目录用于存放编译后的CSS文件。


config.rb文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
require 'compass/import-once/activate'
# Require any additional compass plugins here.
 
# Set this to the root of your project when deployed:
#配置服务器路径
http_path = "/"
#配置css sass images javascripts路径
css_dir = "stylesheets"
sass_dir = "sass"
images_dir = "images"
javascripts_dir = "javascripts"
 
# You can select your preferred output style here (can be overridden via the command line):
#根据个人偏好选择输出样式 :nested嵌套  :compact紧密 :compressed压缩
# output_style = :expanded or :nested or :compact or :compressed
 
# To enable relative paths to assets via compass helper functions. Uncomment:
#相对路径
# relative_assets = true
 
# To disable debugging comments that display the original location of your selectors. Uncomment:
# line_comments = false
 
 
# If you prefer the indented syntax, you might want to regenerate this
# project again passing --syntax sass, or you can uncomment this:
# preferred_syntax = :sass
# and then run:
# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass



在设置项目时配置选项


使用compass create命令时,你可以使用一些选项来配置你的项目:

--bare (不包含默认样式表进行安装);

--syntax sass (在默认样式表中使用缩进语法);

--sass-dir "cool" (使用'cool'目录存放Sass文件);

--css-dir "style" (使用'style'目录存放CSS文件);

--images-dir "img" (使用'img'目录存放图片);

--fonts-dir "type" (使用'type'目录存放字体文件);

--javascripts-dir "js" (使用'js'目录存放JavaScript文件)。



例如:

1
compass create my-project --bare --sass-dir "cool" --css-dir "style"



开始制作雪碧图


首先获取一些 icon 图标,获取一些免费图标集 https://github.com/Keyamoon/IcoMoon-Free


文件夹目录结构:(images目录下有一个 icons 子目录存放一些 .png图片)

wKioL1hjKqfxZqa0AABAhpv2YDU449.png


1、创建一个雪碧图


打开 screen.scss 并加入如下代码:

1
2
3
4
5
// 加载compass sprites模块
@import "compass/utilities/sprites";
 
//告诉Compass根据images/icons/目录下的所有PNG图片生成一张雪碧图
@import "icons/*.png";


命令行工具通过如下指令来执行编译

1
compass watch


最终在 images 文件夹下生成了一个竖向排布的 icons-sac817bc43c.png

wKiom1hjLPbDKLLPAAApEQfhqSk806.png



2、自定义雪碧图


变量命名表

1
2
$<map>-<property>: setting;
$<map>-<sprite>-<property>: setting;


在上面的示例中,雪碧图文件夹的名称是 icons,所以改变间距的变量被命名为 $icons-spacing。而为了设置icons/attachment.png 间距变量, 你应该赋值给$icons-attachment-spacing。


记住, 这些变量必须在导入雪碧图之前被定义, 否则不会生效。请找到configuring-automatic-sprites文件夹下精灵配置的示例代码。


2-1、配置雪碧图间距

Compass 允许你通过配置雪碧图间距变量改变雪碧图的间距

1
2
$<map>-spacing: 0px;
$<map>-<sprite>-spacing: 0px;


默认值是0px,这意味着每个 图标 被拼入雪碧图时不带任何间距。设置这个变量或单独给 每个 图标 赋值,会使得每个 图标 在拼合时在周围增加若干像素的透明间


修改screen.scss,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 加载compass sprites模块
@import "compass/utilities/sprites";
 
// 配置所有sprite间距为100px,默认为0px  此句要放在前面才生效
$icons-spacing:100px;
 
//配置所有sprite的位置,默认为0px
$icons-position:100px;
 
//智能布局的把每张图像放在最合适的地方
//$icons-layout:smart;
 
//水平排列
$icons-layout:horizontal;
//纵向排列
//$icons-layout:vertical;
 
//单独为arrow图标设置12像素的透明间距。
$icons-arrow-spacing: 12px;
 
//告诉Compass根据images/icons/目录下的所有PNG图片生成一张雪碧图
@import "icons/*.png";


wKioL1hjMxuw1ndjAAAjW3E5Znc227.pngwKioL1hjMzfijek-AAAjW3E5Znc197.png


自动删除了之前的图片,并生成一个新的 icons-s1a799c6c79.png

wKiom1hjM3DCWjYFAAAQ8j5v1Hs514.png



2-2、配置图标的重复性

在一些情况下,雪碧图中水平方向的重复 图标 会有大用处。为此,你可以设置雪碧的重复性变量:

1
2
$<map>-repeat: no-repeat/repeat-x;
$<map>-<sprite>-repeat: no-repeat/repeat-x;


如:箭头图标横向平铺整个图,重复的箭头图标横跨整个精 灵地图和最宽的compass的logo对齐。

1
$icons-arrow-repeat: repeat-x;



2-3、配置图标的位置

有时候,移动一个 图标的位置是非常有帮助的,Compass允许你通过设置位置变量来横向 移动图片

1
2
$<map>-position0px;
$<map>-<sprite>-position0px;


这个变量调整了雪碧图中图标的横向位置。其默认值为0px,意味着每个图标都是左对齐 的。这个值可以是百分比,也可以是像素值。


1
2
$icons-position4px;
$icons-clubs-position100%;


在这个例子里,雪碧图中的每个图标都被右移了4个像素,并且梅花移动到了最 右边

wKioL1hjOYCwX_qYAAATck0YIe8156.png



2-4、设置图标的布局

Compass有以下几种图标的布局可供选择:

1
$<map>-layout: vertical/horizontal/diagonal/smart;


默认的布局是vertical,从整体上影响雪碧图布局,告知Compass如何排布所有的图标。

大多数情况下,你可能需要将布局设置为smart,这种布局会让Compass产生最小的空白区域。


位置和重复性的设置只会应用到横向或纵向布局的雪碧图中。对于采用智能布局或对角线 布局的雪碧图,位置和重复性的设置是无效的



2-5、清除过期的雪碧图


当添加、删除或改变图片后,会生成新的雪碧图。Compass会自动为你移除旧的雪碧图, 或者你也可以把它们保留下来

1
$<map>-clean-up: true/false;


默认情况下,当生成新的雪碧图时,Compass会自动把旧的移除。这会避免你的硬盘被不 再使用的文件填满,同时也确保你不会困惑自己的样式表到底在使用哪个文件。如果你喜欢手动 移除旧的雪碧图,你也可以将其设置为false



3、生成雪碧图的CSS


Compass 有两个很顺手的混合器,可以自动生成雪碧图的CSS

1
2
@include all-<map>-sprites;
@include <map>-sprite($name);


这里的<map>是一个占位符,它会被替换为包含雪碧图标的文件夹的名称,这里是 icons,all-sprites 混合器会为整个雪碧图撰写所有必要的CSS。

第二个混合器将会输出一个独立命名图标的CSS,这两个混合器都会随着图标的导入而创建,因此,它们只能在导入之后使用


3-1、all-sprites混合器

1
2
3
@import "compass/utilities/sprites";
@import "icons/*.png";
@include all-icons-sprites;


这个all-icons-sprites混合器将会为雪碧图中的每个图标撰写必要的CSS

1
2
3
4
5
6
7
8
9
.icons-sprite,
.icons-arrow,
.icons-attachment,
.icons-box-add, ... {
backgroundurl('/images/icons-s0cad3f8f97.png'no-repeat;
}
.icons-arrow { background-position0 0; }
.icons-attachment { background-position-16px -96px; }
.icons-box-add { background-position0 -64px; }



现在让我们看看这个混合器都生成了什么:

(1) 它为设置所有来自images/icons/的图标样式创建了一个基础类icons-sprite;

(2) 它为其图标目录下的每一个文件名创建了类;

(3) 它为所有的图标都增加了背景图片;

(4) 它为所有的图标都增加了背景位置。

默认情况下,Compass不会设置这些元素的宽和高。Compass可以自动生成图标的尺寸,但我们不一定总需要它




3-1、single-sprites混合器

这个图标会针对单个的图标输出CSS

1
2
3
4
5
@import "compass/utilities/sprites";
@import "icons/*.png";
.add-button {
@include icons-sprite(box-add);
}


输出的CSS 如下:

1
2
3
4
5
.icons-sprite,
.add-button {
backgroundurl('/images/icons-s0cad3f8f97.png'no-repeat;
}
.add-button { background-position0 -358px; }


有了single-sprite混合器,就没有必要生成一个类名了,因为样式已经包含在了选择器里。当Compass添加background-image和background-position样式时,会直接使用这些选择器,在这个例子里是.add-button。

相比简单方便的all-sprites混合器,这个方式生成更少的CSS,也让你对输出有更多的控制





本文转自   frwupeng517   51CTO博客,原文链接:http://blog.51cto.com/dapengtalk/1886854


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章