Created by Shuai Liang and Steven and Sherry
类似于Ant中的Build.xml ,Grunt使用Gruntfile.js配置任务
执行文件清理任务
执行bower install任务
JS文件压缩插件
CSS压缩插件
文件合并
编译Sass
监控文件修改,配合connect-livereload实现修改文件即可刷新浏览器
监控文件修改,配合connect-livereload实现修改文件即可刷新浏览器
代码规范检测
1. 建议将大部分mockup整体review一遍。 这样可以对整个项目做一个简单了解。对一些模块以及功能也会有一定了解,虽然,前期一般只能看到一部分mockup,但是这也为后面 一些文件目录结构的划分有一定的帮助。
为什么源文件要划分不同文件? --- 最主要的原因就是:
大型项目必然涉及多人、多团队共同配合开发,这时候就需要保证Sass 文件的可读性、可扩展性以及可维护性。
例如:
CSS预处理器的特点之一是可以把你的代码分割成很多个文件,而且不会影响性能。这都要归功于Sass的@import
命令,只要在你的开发环境下,你调用不管多少文件,最终将编译出一个CSS样式文件。
多个文件中开发,最终合并输出一个文件。——@Bruce Lee
开始将你的CSS文件分割成多个文件和文件夹。正如我的一位导师说的“任何事物都有其正确的地方,每个地方都有其正确的事”。那么,这也是我喜欢做的事。
以下转载由大漠根据Hugo Giraudel的《Architecture for a Sass Project》所译的译文,英文出处:http://www.sitepoint.com/architecture-sass-project
你在创建CSS的架构的时候也应该如此:你不只是把所有的Sass文件放在一个文件夹下,你会将他们分类。
下面的示例屏示的是我将如何组织我的Sass文件:
正如你所看到的,在根目录底下只有一个main.scss
文件,其他.scss
文件都根据不同的分类放在对应的文件夹中,只是这些.scss
文件前面都有一个下划线(_
),用来告诉Sass,这些.scss
文件只是局部,不通过@import
是不应该被编译出.css
文件。事实上,它们是导入和合并文件的基本文件而以。
推荐范例:
sass files contents/ |– layout/ | |– _grid.scss # Grid system | |– _header.scss # Header | |– _footer.scss # Footer | |– _sidebar.scss # Sidebar | |– _forms.scss # Forms | ... # Etc… | |– pages/ | |– _home.scss # Home specific styles | |– _contact.scss # Contact specific styles | ... # Etc… | |– themes/ | |– _theme.scss # Default theme | |– _admin.scss # Admin theme | ... # Etc… | |– vendors/ | |– _bootstrap.scss # Bootstrap | |– _jquery-ui.scss # jQuery UI | ... # Etc…
推荐范例:
|– layout/ | |– _grid.scss # Grid system | |– _header.scss # Header | |– _footer.scss # Footer | |– _sidebar.scss # Sidebar | |– _forms.scss # Forms | ... # Etc… | |– pages/ | |– _home.scss # Home specific styles | |– _contact.scss # Contact specific styles | ... # Etc… | |– themes/ | |– _theme.scss # Default theme | |– _admin.scss # Admin theme | ... # Etc… | |– vendors/ | |– _bootstrap.scss # Bootstrap | |– _jquery-ui.scss # jQuery UI | ... # Etc… | | `– main.scss # primary Sass file
接下来,我们依次来看结构中的每一个文件目录。
base/
文件夹包含了一些有关于你的项目中一些模板相关。在这里,你可以看到reset
样式(或者Normalize.css,或者其他),也有一些关于文本排版方面的,当然根据不同的项目会有一些其他的文件。
_reset.scss
或_normalize.scss
_typography.scss
helpers/
文件夹(有的地方也称其为utils/
)主要包含了项目中关于Sass的工具和帮助之类。在里面放置了我们需要使用的_function.scss
,和_mixin.scss
。在这里还包含了一个_variables.scss
文件(有的地方也称其为_config.scss
),这里包含项目中所有的全局变量(比如排版本上的,配色方案等等)。
_variables.scss
_mixin.scss
_function.scss
_placeholders.scss
(也有称为_helpers.scss
)
layout/
文件夹(也可命名为partials/
)中放主要用于布局方面的文件,比如说"header",“footer”等。他也会包括_grid.scss
文件,用来创建网格系统。
_grid.scss
_header.scss
_footer.scss
_sidebar.scss
_forms.scss
导航文件(_navigation.scss
)文件放在这里也有意义,既可以放components/
文件夹中。也可放在layout/
文件夹中,当然最后还是由你自己来决定。
对于一些小组件,都放在了components/
文件夹(通常也称为modules/
),layout/
是一个宏观的(定义全局的线框),components/
是一个微观的。它里面放了一些特定的组件,比如说slider
,loading
,widget
或者其他的小组件。通常components/
目录下的都是一些小组件文件。
_media.scss
_carousel.scss
_thumbnails.scss
如果你需要针对一些页面写特定的样式,我想将他们放在page/
文件夹中是非常酷的,并且以页面的名称来命名。例如,你的首页需要制作一个特定的样式,那么你就可以在page/
文件夹中创建一个名叫_home.scss
文件。
_home.scss
_contact.scss
根据你自己的布署,你可以根据自己的需求调用这些文件,避免与其他样式文件合并在一起。这真的主取决于你自己。
如果你像我一样要为一个大型的网站制作多个主题,那么有一个theme/
文件夹是非常有意义的。你可以把主题相关的文件放在这个文件夹中。这绝对跟具体的项目有关,你只要觉得跟主题相关的,有必要引入。
_theme.scss
_admin.scss
最后一个但并非不重要,创建vendors/
文件夹,主要用来包含来自外部的库和框架的CSS文件。比如Bootstrap,jQueryUI,FancyCarouselSliderjQueryPowered等等。把这些文件放在同一个文件夹中,你可以说,嘿,这些代码不是我的,不是我写的,跟我无关。
例如:
bootstrap.scss
jquery-ui.scss
select2.scss
对照mockup,提取公共部分(如颜色、列表、按钮等等)设置成变量
有些mockup designer 会提供带标注,有的没有,或者有些标注遗漏,这时候,你可以选择问designer 要,或者 自己动手丰衣足食!
目前,网络上很多标注工具,如像素大厨,ps
个人习惯用ps: 如下图:
编译前:
$white:#fff;color: $white;
font-size: $font12;
}编译后:
.menu {color: white;
font-size: 12px;
}嵌套极大程度上降低了选择器名称和属性的重复书写。
选择器嵌套
属性嵌套
选择器嵌套
.header{
.logo{
display: block;
border: none;
}
ul li{
line-break: normal;
}
}
属性嵌套
h3{
font:{
size:26px;
weight:normal;
family:arial
}
}
sass中的混合器一般用来解决大段代码重复的问题。比如我们经常使用的单行文本溢出显示省略号,可以使用@mixin来定义一个简单的混合器:
编译前:
@mixin ellipsis {
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
然后在需要用到的地方我们可以通过@include来使用这个混合器:
.text {
@include ellipsis;
}
编译后:
.text {
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
混合器不仅可以实现代码的重复利用,还可以传递参数,根据需要生成不同的css。这在跨浏览器的css3兼容方面尤为好用。例如:
编译前:
@mixin radius($value) {
-moz-border-radius: $value;
-webkit-border-radius: $value;
border-radius: $value;
}
使用时,我们只需传入相应的参数值即可。
.test {
@include radius(3px);
}
编译后:
.test {
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
}
另外我们还可以给参数提供默认值,如:
编译前:
@mixin link-colors($normal: #333, $hover: $normal, $visited: $normal) {
color: $normal;
&:hover {
color: $hover;
}
&:visited {
color: $visited;
}
}
调用时,可以传参,也可以不传:
.text {
@include link-colors;
}
.error {
@include link-colors(red);
}
a {
@include link-colors(blue, green, yellow);
}
编译后:
// 鉴于篇幅问题,已将生成的代码改成单行
.text { color: #333;}
.text:hover { color: #333;}
.text:visited { color: #333;}
.error { color: red;}
.error:hover { color: red;}
.error:visited { color: red;}
a { color: blue;}
a:hover { color: green;}
a:visited {color: yellow;}
SASS通过@extend实现继承
编译前:
.pclass{
border: 4px solid #ff9aa9;
}
.subclass{
@extend .pclass;
border-width: 2px;
}
编译后:
.pclass, .subclass {
border: 4px solid #ff9aa9;
}
.subclass {
border-width: 2px;
}
这种继承虽然方便,但是也有一定的弊端。比如我们仅仅想继承.pclass类中的样式,而实际并不需要.pclass的这个类。换句话说就是我们的html中并没有class="pclass"这样的代码,这样的话生成的css中的.pclass其实就是多余的。 对于这种情况,sass3.2.0及以后的版本也给我们提供了解决方案:占位选择器%。
占位选择器的优势在于:声明之后,如果不调用,则不会产生类似.pclass的多余css代码。占位选择器通过%标识来定义,也是通过@extend来调用。
编译前:
%pclass{
border: 4px solid #ff9aa9;
}
.subclass{
@extend %pclass;
border-width: 2px;
}
编译后:
.subclass {
border: 4px solid #ff9aa9;
border-width: 2px;
}
sass中的@if语句和js中的if很相似。可以单独使用,也可以配合@else使用。
编译前:
$lte7: true; // 是否支持ie7以下版本
$theme: yellow;
.clearfix {
@if $lte7 {
zoom: 1;
}
&:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
}
body {
@if $theme == red {
background: rgba(255, 0, 0, 0.5);
} @else if $theme == yellow {
background: rgba(255, 255, 0, 0.5);
} @else if $theme == black {
background: rgba(0, 0, 0, 0.5);
}
}
编译后:
.clearfix {
zoom: 1;
}
.clearfix:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
body {
background: rgba(255, 255, 0, 0.5);
}
建议自己 对自己的代码做一个code review以及一些修整,这样,sass 代码看起来会更干净、整洁!
1.各种样式的频繁修改,如字体、对齐方式、颜色、尺寸等
2.项目中后期样式的调整。
由于css写得耦合度太高,即使是微小的样式调整,也要花费大量时间,而且经常改好一个地方,另一个地方又错了。
例如,我要让某页面的按钮从左对齐改成右对齐。
这里用了很多后代选择器来控制样式。于是我找到这个页面顶级对象的id:facility-management。
然后到scss文件中搜了一下. . .
我当时的心理活动:
好吧,我承认这些大部分是我自己写的。
3.项目初期
导致跨组维护代码比较困难
4.项目前期,前后端互相推诿
例如,有个功能要计算1+1的结果并显示在页面上. . .
前面已经提过,这里仅粗略再提一下
已包含的组件
例如我们的按钮标准:
已有的指令:
编写模块化CSS,可参考OOCSS.
没有实行,现在的css已经积重难返,每次改样式都很痛苦。
OOCSS中的部分建议
前面已经提过,在此不在敖述
可以管控规范是否有效执行。
项目中前期靠前端leader执行,后来由于进度压力而被忽略。
若能坚持执行,项目质量会有所提高,改bug时间会有所减少。
在项目前期发挥作用
没有绝对正确的规则,及早确定职责,是为了减少推诿发生.
例如样式、表现内容的格式化交给前端,获取数据、复杂业务逻辑交给后端
项目进行过程中不断改进规则
团队磨合后,可丢弃规则
在编码前,建议要顶住压力先把业务需求理清,避免后期的反复修改