CSS教程:LESS和Sass共同点和区别

文章简介:LESS介绍及其与Sass的差异.

原文:LESS介绍及其与Sass的差异
译自:An Introduction To LESS, And Comparison To Sass
原作者:Jeremy Hixon
请尊重版权,转载请注明来源,多谢!



自从一个月前我偶然发现LESS之后我就开始坚定的使用它了。CSS本身对我来说从来不是问题,但是我很好奇使用变量来沿着一个调色盘为我的网站或模板创建一些东西的想法。拥有一个提供固定数量选项可选的色盘可以让我避免颜色太跳跃以至于从一个已定的风格中脱离。

事实证明,LESS——以及Sass——功能比这个要多太多。LESS和Sass在语法上有些共性,比如下面这些:

  • 混入(Mixins)——class中的class;
  • 参数混入——可以传递参数的class,就像函数一样;
  • 嵌套规则——Class中嵌套class,从而减少重复的代码;
  • 运算——CSS中用上数学;
  • 颜色功能——可以编辑颜色;
  • 名字空间(namespace)——分组样式,从而可以被调用;
  • 作用域——局部修改样式;
  • JavaScript 赋值——在CSS中使用JavaScript表达式赋值。

LESS和Sass的主要不同就是他们的实现方式,LESSS是基于JavaScript,所以,是在客户端处理的。

另一方面,Sass是基于Ruby的,然后是在服务器端处理的。很多开发者不会选择LESS因为JavaScript引擎需要额外的时间来处理代码然后输出修改过的CSS到浏览器。关于这个有很多种方式,我选择的是只在开发环节使用LESS。一旦我完成了开发,我就复制然后粘贴LESS输出的到一个压缩器,然后到一个单独的CSS文件来替代LESS文件。另一个选择是使用LESS.app来编译和压缩你的LESS文件。两个选择都将最小化你的样式输出,从而避免由于用户的浏览器不支持JavaScript而可能引起的任何问题。尽管这不大可能,但终归是有可能的。

LESS Is More

介绍

在你的项目中引入LESS很简单:

  1. 下载less.js;
  2. 创建一个文件来放你的样式,比如style.less;
  3. 添加以下代码到你的HTML的<head>中:
<link
			rel="stylesheet/less"
			type="text/css"
			href="styles.less">
<script
			src="less.js"
			type="text/javascript"></script>

请注意link的rel属性。你需要在属性值的最后面使用/less以使LESS起作用。然后在link后面引入scirpt也是必须的。如果你在用HTML5语法——为什么不用呢?——你可以省去type=”text/css”和type=”text/javascript”。

其实也有一个服务器端的LESS版本。在服务器上安装LESS的最简单的办法就是使用Node Package Manager (NPM,一看就知道是基于Node.js的)。

变量

如果你是个开发者,变量应该是你最好的朋友。如果你要重复的使用一个信息(本例中就是color),将它设置为一个变量就可以。这样,你就可以保证自己的一致性并可能减少滚动代码来查找颜色值、复制、粘贴等繁琐的工作了。你甚至可以加或者减一些你需要渲染的HEX值到这些颜色上面。看下例子:

1
2
3
@blue: #00c;
@light_blue: @blue + #333;
@dark_blue: @blue - #333;

如果我们将这些样式应用到3个div上面,我们就可以看到由加上和减掉的HEX值形成的渐变的效果:

从@light_blue到@blue到@dark_blue的渐变效果

关于变量在LESS和Sass中的唯一区别就是,LESS用@,Sass用$。同时还有一些作用域上的差别,我后面会提到。

混入(mixin)

偶尔,我们会创建一些会在样式表中重复使用的样式规则。没有人会阻止你在一个HTML的元素中使用多个class,但是你可以用LESS,在样式表中完成。为了描述这一点,我写了一点儿例子:

1
2
3
4
5
6
7
8
9
10
11
.border
					{
	border-top:
					1px
					dotted
					#333;
}
article.post
					{
	background:
					#eee;
	.border;
}
ul.menu
					{
	background:
					#ccc;
	.border;
}

这可以给到你与你在两个元素中分别添加.bordered class同样的效果——而且仅仅在样式表中就完成了。而且它工作的很好:

文字和无序列表都被用上了边框样式

在Sass中,你要在样式规则前面添加@mixin声明,规定它是个嵌套。然后,通过@include来调用它:

1
2
3
4
5
6
7
8
9
10
11
@mixin border {
	border-top:
					1px
					dotted
					#333;
}
article.post
					{
	background:
					#eee;
	@include border;
}
ul.menu
					{
	background:
					#ccc;
	@include border;
}

参数混入

就像在CSS中有函数功能一样,这些对于那些在现在的CSS工作中多余的工作非常有用。最好和最有用的例子就是我们正在经历的从CSS2到CSS3过渡过程中的很多浏览器私有前缀。Nettuts+有一篇Jeffrey Way写的很赞的视频和文章,内容是包含着由有用的参数组成的文件,他们涵盖了大部分使用各个浏览器私有前缀的CSS3属性。例如,在他们的格式中,一个简单的处理圆角的mixin是这样的:

1
2
3
4
5
.border-radius(
					@radius: 3px ) {
-webkit-border-radius:
					@radius;
-moz-border-radius:
					@radius;
border-radius:
					@radius;
}

在这个例子中,.border-radius有个默认的3px的圆角,但是你可以使用你需要的任何值。.border-radius(10px)将会生成半径为10px的圆角。

Sass中的语法很像LESS,只是使用$声明变量,然后使用前面提到的@mixin和@include来调用。

选择器继承

这个东西LESS并没有提供。通过这个功能,你可以将一个选择器附加到已经预先定义的选择器上,而无需再使用逗号将两者分开的写法了:

1
2
3
4
5
6
7
8
9
10
11
.menu
					{
	border:
					1px
					solid
					#ddd;
}
.footer
					{
	@extend .menu;
}

/* 上面的写法规则和下面的效果是一样的: */
.menu,
					.footer
					{
	border:
					1px
					solid
					#ddd;
}

嵌套规则

在css中嵌套class和ID是避免你的样式干扰或者被别的样式干扰的唯一方法了。但是这可能会很凌乱。使用一个类似于#site-body .post .post-header h2 的选择器毫无吸引力而且会占用大量不必要的空格。使用LESS,你可以嵌套id、class以及标签。对于前面提到的例子,你可以这样写:

1
2
3
4
5
6
7
8
9
10
11
#site-body
					{ …
	.post
					{ …
		.post-header
					{ …
			h2 { … }
			a { …
				&:visited { … }
				&:hover { … }
			}
		}
	}
}

上面的代码最终和上面的例子(那一长串的选择器)的效果一样,但是要更容易阅读和理解的多,而且它占用很少的空间。你也可以通过&来引用元素样式到他们的伪元素上,该功能类似于JavaScript中的this。

运算

这可能是你所期望的:使用数字或者变量在你的样式表中实现数学运算!

1
2
3
4
5
@base_margin: 10px;
@double_margin: @base_margin * 2;
@full_page: 960px;
@half_page: @full_page / 2;
@quarter_page: (@full_page / 2) / 2;

声明下,我也意识到我可以除以4来获得@quarter_page变量,但是这里我只是想要演示下圆括号组成“运算顺序”在这里也是可以用的。在使用简写的规则中,小括号也是必须的,比如 border: (@width / 2) solid #000。

Sass在数字上比LESS更专业。它已经可以换算单位了。Sass可以处理无法识别的度量单位并将其输出。这个特性很明显是一个对未来的尝试——证明W3C作出的一些改变。

1
2
3
4
5
/* Sass */
2in
					+
					3cm
					+ 2pc =
					3.514in

/* LESS */
2in
					+
					3cm
					+ 2pc = Error

Color函数

在文章开头,我提到了LESS如何帮我在编码过程中处理围绕着一个调色板。对此贡献最大的一部分就是颜色函数。加入你用一个标准的蓝色贯穿到你的样式中,然后你想要在表单中用这个蓝色来做一个渐变的按钮。你可以打开Photoshop或者其它的编辑器来获取一个比蓝色较浅的或者较暗的HEX色值来作为渐变色。或者,你可以只是使用LESS中的颜色函数。

1
2
3
4
5
6
7
8
9
10
11
12
@blue: #369;
.submit
					{
	padding:
					5px
					10px;
	border:
					1px
					solid
					@blue;
	background: -moz-linear-gradient(top, lighten(@blue, 10%), @blue 100%); /*Moz*/
	background: -webkit-gradient(linear,
					center
					top,
					center
					bottom, from(lighten(@blue, 10%)), color-stop(100%, @blue)); /*Webkit*/
	background: -o-linear-gradient(top, lighten(@blue, 10%) 0%, @blue 100%); /*Opera*/
	background: -ms-linear-gradient(top, lighten(@blue, 10%) 0%, @blue 100%); /*IE 10+*/
	background: linear-gradient(top, lighten(@blue, 10%) 0%, @blue 100%); /*W3C*/
	color:
					#fff;
	text-shadow:
					0
					-1px
					1px rgba(0,0,0,0.4);
}

lighten函数很明显就是用百分比值来减轻颜色,在这个例子中,它将减轻这个基础的蓝色的10%。这种方法可以让我们变化的元素或者其它任何元素的颜色值——只是简单的改变基础颜色而已。这对于主题(模板)来说非常有用。而且,如果你使用参数功能,像上面提到的,你还可以更简单的应用到一些浏览器私有前缀的声明中,比如:.linear-gradient(lighten(@blue), @blue, 100%);。

嗯,最终的效果的确很赞:

很赞的渐变的、基于变量的”Submit”按钮

还有很多其它的色彩函数,比如变暗或者调整颜色的饱和度,甚至你可以旋转色盘来使用其它颜色。我建议亲自尝试下你能想出的(用法)。

Sass貌似有更多的选项——但我并不需要这么多。我个人最常用的还是lighten和darken。如果你想了解更多,可以看一下这篇很详细的介绍。

条件语句与控制

这是一个的确很赞的东东,也是另一个LESS不支持的功能。使用 Sass,你可以使用if { } else { } 条件语句,以及for { }循环。它甚至支持 and、 or和 not,以及 <、 >、 <=、 >= 和 == 等操作符。

1
2
3
4
5
6
7
8
9
10
11
12
13
/* Sample Sass "if" statement */
@if lightness($color) > 30% {
	background-color:
					#000;
}
					@else {
	background-color:
					#fff;
}

/* Sample Sass "for" loop */
@for $i from 1px to 10px {
	.border-#{i}
					{
	border: $i solid
					blue;
	}
}

名字空间(Namespaces)

名字空间可以用于组织我们的CSS到另一个档次,我们可以将一些公用的样式分组,然后在用的时候直接使用。例如,如果我们创建了一个名为default的样式分组,我们就可以在用到的时候直接从该组中调用。

1
2
3
4
5
6
7
8
#defaults
					{
	.nav_list
					()
					{
		list-style:
					none;
		margin:
					0;
					padding:
					0;
	}
	.button
					()
					{ … }
	.quote
					()
					{ … }
}

然后,在我们的代码中,如果我们正好在一个nav元素中使用了ul元素,我们就会想到我们需要default样式。那么我们就可以简单的调用它,它也会被直接应用。

1
2
3
nav ul {
	#defaults > .nav_list;
}

作用域

作用域是编程中的标配,LESS中也是。如果你在你样式表的root级声明一个变量,它在整个文档中都是可以用的。然而,如果你在一个选择器,比如id或者class中,重新定义了这个变量,那么,它就只能在这个选择器中可用了——当然是重新定义后的新值。

1
2
3
4
5
6
7
8
@color: #00c; /* 蓝色 */
#header
					{
	@color: #c00; /* red */
	border:
					1px
					solid
					@color; /* 红色边框 */
}
#footer
					{
	border:
					1px
					solid
					@color; /* 蓝色边框 */
}

因为我们在#header中重新定义了color变量,变量的值将会是不同的而且只会在该选择器中有效。它之前或者之后的所有地方,如果没有被重新定义,都会保持那个原始的值。

作用域在Sass中稍有不同。在上面的代码中,当@color变量变为红色后,代码中,此处之后的该变量的值,将会被重写(成为红色)。

注释

这一部分比较基础。LESS中允许两种注释写法。标准的CSS注释,/* comment */,是有效的,而且能够通过处理并正确输出。当行注释,// comment,同样可以用但是不能够通过处理也不能被输出,然后,结果是,“无声的”。

导入

导入也相当符合标准。标准的 @import: ‘classes.less’; 处理的很好。然而,如果你想要导入其它的LESS文件,那么文件的扩展名是可选的,所以 @import ‘classes’; 也是可行的。如果你想要导入一些无需LESS处理的内容,你可以使用 .css 扩展 (比如, @import: ‘reset.css’;)。

字符串插入

字符串也是可以用于变量中的,然后通过@{name}来调用。

1
2
@base_url : "http://www.qianduan.net";
background-image:
					url("@{base_url}/images/background.png");

转义(Escaping)

可能偶尔会需要引入一个CSS中非法或者LESS无法识别的值。通常是一些IE的hack。要避免抛出异常并破坏LESS,你将需要避开它们。

1
2
3
4
5
6
7
8
.class
					{
	filter: ~"progid:DXImageTransform.Microsoft.Alpha(opacity=20)";
}

/*实际上将会输出下面的代码: */
.class
					{
	filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20);
}

JavaScript 赋值

这是LESS中我最中意的部分:在样式表中使用Javascript——相当精彩。你可以使用表达式,也可以参考环境方向来使用反单引号。

1
2
3
4
5
6
7
8
@string: `"howdy".toUpperCase()`; /* @string 变成 "HOWDY" */

/* 你也可以使用前面提到的插值: */
@string: "howdy";
@var: ~`"@{string}".topUpperCase()`; /* 变为 "HOWDY" */

/* 获取文档的信息 */
@height = `document.body.clientHeight`;

输出格式

然而LESS并没有输出设置,而Sass提供4中输出选项:nested, compact, compressed 和 expanded。

结语

这两个方法有很多共同点。对写代码的设计师来说它们都是很玄的工具,它们也可以帮助开发者更有效和快速的工作。如果你是Ruby或HAML的粉丝,那么Sass会是你的好助手。对我来说,一个PHP和JavaScript极客,我倾向于LESS,因为它便于引入和能够使用JavaScript的表达式以及文档属性。我怀疑我甚至接近真正理解在样式表中编程的可能行了,但是我仍坚持尝试。如果你在工作中有用到它们中的一个,或者两个都用,我很乐意听到关于它的更多内容,并看到你的成果。当然,技巧、诀窍、更正一直是很欢迎的。。

译注:翻译的有些仓促,如果有错误或者不妥的地方,欢迎指出。mixin这个单词,这里直译为“混入”了,不过感觉也不太合适,查了好久也没有见到非常合适的翻译,这里求达人指点。另外,不知道什么原因,lesscss.org貌似在贵国无法访问,大家可以直接访问LESS在git上的仓库,http://github.com/cloudhead/less.js,该项目的wiki也有和官方网站一样的文档,需要的话可以详细阅读下。——神飞

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索变量
, 样式
, less
, sass
, sublime3 less
, 一个
或者
,以便于您获取更多的相关知识。

时间: 2024-11-02 03:34:02

CSS教程:LESS和Sass共同点和区别的相关文章

经典实用CSS教程详细讲解

css|教程 CSS(Cascading Stylesheets,层叠样式表)是一种制作网页的新技术,现在已经为大多数的浏览器所支持,成为网页设计必不可少的工具之一.使用CSS能够简化网页的格式代码,加快下载显示的速度,也减少了需要上传的代码数量,大大减少了重复劳动的工作量.尤其是当你面对的是有数百个网页的站点时,CSS简直象是神对我们的恩赐! 前言 CSS(Cascading Stylesheets,层叠样式表)是一种制作网页的新技术,现在已经为大多数的浏览器所支持,成为网页设计必不可少的工具

css中单位px和em的区别

px像素(pixel)相对长度单位是相对于显示器屏幕分辨率而言的(引自css教程2.0手册). em相对长度单位是相对于当前对象内文本的字体尺寸而言的,如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸(引自css2.0手册). 任意浏览器的默认字体高都是16px.所有未经调整的浏览器都符合: 1em=16px.那么12px=0.75em.10px=0.625em.为了简化font-size的换算,需要在css中的body选择器中声明font-size=62.5%,这就使em值

CSS3教程收集分享:具有动画过渡效果的CSS教程

文章简介:CSS3教程收集分享:具有动画过渡效果的CSS教程. 今天我们分享出了18个优秀的具有动画过渡效果的CSS3详细教程.CSS3让一切变得更加容易和高效,它改变了很多旧的WEB开发技术,在目前网络高速发展的当下,更好的为网页设计师来做后期的维护提供的便利.随着这一过渡效果的使用,让更多的设计变得高效起来.让网页也变得更具艺术过渡的 气质.下面这18个例子可以让你得到更多的灵感.也会让你的交互创意灵感变得更加有意思起来. 创建一个下拉菜单,使用CSS3转换 (演示 下载) 动画Popove

CSS教程—元素的定位

css|教程 1. position:static|无定位position:static是所有元素定位的默认值, 一般不用注明,除非有需要取消继承的别的定位example: 以下是引用片段:>#div-1 {  position:static; }2. position:relative|相对定位使用position:relative,就需要top,bottom,left,right4个属性来配合,确定元素的位置.如果要让div-1层向下移动20px,左移40px:example: 以下是引用片

强烈推荐:非常不错的样式表CSS教程

css|教程|样式表 强烈推荐:非常不错的样式表CSS教程(目录如下) 强烈推荐:非常不错的样式表CSS教程(1) 强烈推荐:非常不错的样式表CSS教程(2) 强烈推荐:非常不错的样式表CSS教程(3) 强烈推荐:非常不错的样式表CSS教程(4) 强烈推荐教程:css教程–十步学会用css建站(全) 教程连接地址:http://jorux.com/archives/10steps-built-web-with-css

强烈推荐:非常不错的样式表CSS教程(4)

css|教程|样式表 ●Specificity 本节讲述的是用来判断样式优先权的是"specificity"."specificity"和选择符selector中元素的数目以及元素的属性有关,"specificity"高的优先应用. 怎样计算选择符的"specificity"值呢?涉及到三项内容: 1.选择符中ID标识符属性的数目A 注意:一个匹配ID的属性选择符不能算作一个ID,它仅能当作一个属性选择符.例如"id

强烈推荐:非常不错的样式表CSS教程(3)

css|教程|样式表 ■继 承 和 层 叠 CSS规则影响元素的显示形态,但是如果没有样式匹配或者存在多种样式规则同时匹配该元素时,元素显示的形态到底是遵循哪个规则呢?本节论述的内容涉及到样式的继承和层叠方面的知识. ●继 承 有些样式通过默认的样式设置而"继承",也就是说,子元素继承父元素的样式规则,包括color.font和text-align等等. 例如: p { color: red } ... <p>Sample paragraph with <b>b

强烈推荐:非常不错的样式表CSS教程(2)

css|教程|样式表 元素的属性(Attribute)也可以用于selector.下面的列表中例举了几种模式: Attribute Selector Patterns 模式 说明 E[attr] Attribute selector属性选择器.匹配任何含有该属性的E元素,不必考虑它的值的大小 E[attr="value"] Attribute selector,属性选择器.匹配任何具有该属性的元素E,条件是属性的值必须与设定的值相等. E[attr~="value"

强烈推荐:非常不错的样式表CSS教程(1)

css|教程|样式表 本文是一篇关于CSS的应用概述,并提供了一些示例来演示CSS是如何工作的,以便于你更加有效的学习CSS. 本文并不是参考或者兼容性指南一类的文章(尽管其中有一些非常好的参考和兼容性注解的链接).如果你已经习惯了使用CSS,并想学到更多样式表的知识,我们保证你会在本文中能够找到一些非常有用的信息:). ●CSS不能做什么? 层叠样式表通常被理解为实现"内容"和"风格"分开的手段.其实这种说法并不完全正确,因为根据你对"风格"和