ホームページ >ウェブフロントエンド >htmlチュートリアル >SassとCompassとの出会い - Sass編
バックエンドからフロントエンドに切り替える Web 開発者にとって、最大の悩みは CSS を書くことです。CSS を知っている人なら誰でも Web ページのスタイルを開発できることを知っていますが、プログラミングには使用できません。将来のメンテナンスを容易にしたい場合は、CSS のかなりの部分を 1 文ずつ変更するか、書き直すことしかできません。フロントエンド業界へのバックエンド人材の流入により、CSS は新たな命を吹き込まれ、「CSS プリプロセッサ」である CSS にプログラミング要素が追加され始めました。その基本的な考え方は、特殊なプログラミング言語を使用して Web ページのスタイルをデザインし、それを通常の CSS ファイルにコンパイルすることです。以下では、公式ドキュメントとRuan Yifeng先生の使い方ガイドを組み合わせて、Sassの主な使い方を体系的にまとめています。
Sass は Ruby 言語で書かれています。Sass をインストールする前に、最初に Ruby をインストールする必要があります。Ruby をインストールした後、コマンドライン (cmd のウィンドウ) で次のコマンドを直接入力できます。 リーリー
2.Sassの利用リーリー
接尾辞 .scss が付いたファイルのエンコード スタイルは、次のように通常の CSS スタイルに偏っています:リーリー
Sass は両方のスタイルを並行して正式に更新するため、どちらのスタイルを好むかは個人の好みによって異なります。私は .scss ファイル接尾辞を好むため、以下の例は .scss ファイル スタイルに基づいています。以下のコマンドで.scssファイルから変換されたCSSを画面に表示できます(ファイル名はtestとします)
リーリー
.scss ファイルを CSS ファイルに直接変換したい場合は、その後に .css ファイル名を付ける必要がありますリーリー
Sass には 4 つのコンパイル スタイル オプションがありますリーリー
次のコマンドでコンパイルスタイルを切り替えることができますリーリー
Sass に特定のファイルまたはディレクトリを監視させることもでき、ソース ファイルが変更されると、コンパイルされたバージョンが自動的に生成されますリーリー
webStrom を使用して開発する学生がいる場合は、ファイル ウォッチャーを追加できますが、ディレクトリ全体を監視するほど良い方法ではないと感じます。注意すべき点の 1 つは、異なるバッチ プロセスが異なるサフィックス名のファイルに対応することです。つまり、sass.bat は .sass ファイルに対応し、scss.bat は .scss ファイルに対応します3.Sassの基本的な使い方
CSS がファイルを @import すると、そのファイルはすぐにはインポートされず、それを参照する CSS のみがインポートされます。ファイルがダウンロードされて解析されると、ブラウザはダウンロードする必要のある別の CSS があることを認識し、それをダウンロードした後、解析やレンダー ツリーの構築などの一連の操作を開始します。 CSSは並行してダウンロードできません。ただし、Sass をインポートする (@import) 場合、@import の scss ファイルはコンパイル中に 1 つの CSS ファイルのみにマージされます。ただし、@import 'reset.css' などの CSS ファイルを Sass ファイルにインポートした場合、その効果は通常の CSS インポートされたスタイル ファイルと同じになります。インポートされた CSS ファイルはコンパイルされたファイルにマージされませんが、存在します。 @import モードで。
すべての Sass インポート ファイルは接尾辞 .scss を無視できます。一般的に、基本的なファイル名の付け方はmixin.scss のように で始まります。この種のファイルはインポート時に下線を引く必要はありませんが、 @import "mixin" と記述することができます。
インポートされた Sass ファイル a.scss:リーリー
インポートする必要がある Sass ファイル b.scss は次のとおりです:リーリー
翻訳された b.css スタイル:リーリー
上記のコードからわかるように、b.scss がコンパイルされた後、reset.css はインポートされ続けますが、a.scss は統合されます。3.2 注意事項
リーリー
ダブルスラッシュの単一行コメント 単一行コメントは、スラッシュ (//) を使用する JavaScript 言語のコメントと同じですが、単一行コメントは CSS に入力されません。リーリー
3.3 変数3.3.1 通常の変数
リーリー
3.3.2 デフォルト変数リーリー
Sass のデフォルト変数は通常、デフォルト値を設定し、必要に応じて上書きするために使用されます。上書き方法も非常に簡単で、デフォルト変数の前に変数を再宣言するだけです。 リーリーコンパイルされた行の高さがデフォルトの 1.5 ではなく、2 になっていることがわかります。デフォルト変数の値は、コンポーネント開発を行うときに非常に役立ちます。
3.3.3 特殊変数
3.3.4 多値変数
list数据可通过空格,逗号或小括号分隔多个值,可用nth($var,$index)取值。关于list数据操作还有很多其他函数如length($list),join($list1,$list2,[$separator]),append($list,$value,[$separator])等,具体可参考sass Functions(搜索List Functions即可) 定义
<code>//一维数据 $px: 5px 10px 20px 30px; //二维数据,相当于js中的二维数组 $px: 5px 10px, 20px 30px; $px: (5px 10px) (20px 30px); </code>
使用
<code>//sass style //------------------------------- $linkColor: #08c #333 !default;//第一个值为默认值,第二个鼠标滑过值 a{ color:nth($linkColor,1); &:hover{ color:nth($linkColor,2); } } //css style //------------------------------- a{ color:#08c; } a:hover{ color:#333; } </code>
map数据以key和value成对出现,其中value又可以是list。格式为:$map: (key1: value1, key2: value2, key3: value3);。可通过map-get($map,$key)取值。关于map数据还有很多其他函数如map-merge($map1,$map2),map-keys($map),map-values($map)等,具体可参考sass Functions(搜索Map Functions即可) 定义
<code>$heading: (h1: 2em, h2: 1.5em, h3: 1.2em); </code>
使用
<code>//sass style //------------------------------- $headings: (h1: 2em, h2: 1.5em, h3: 1.2em); @each $header, $size in $headings { #{$header} { font-size: $size; } } //css style //------------------------------- h1 { font-size: 2em; } h2 { font-size: 1.5em; } h3 { font-size: 1.2em; } </code>
sass的嵌套包括两种:一种是选择器的嵌套;另一种是属性的嵌套。我们一般说起或用到的都是选择器的嵌套。
所谓选择器嵌套指的是在一个选择器中嵌套另一个选择器来实现继承,从而增强了sass文件的结构性和可读性。 在选择器嵌套中,可以使用&表示父元素选择器
<code>//sass style //------------------------------- #top_nav{ line-height: 40px; text-transform: capitalize; background-color:#333; li{ float:left; } a{ display: block; padding: 0 10px; color: #fff; &:hover{ color:#ddd; } } } //css style //------------------------------- #top_nav{ line-height: 40px; text-transform: capitalize; background-color:#333; } #top_nav li{ float:left; } #top_nav a{ display: block; padding: 0 10px; color: #fff; } #top_nav a:hover{ color:#ddd; } </code>
所谓属性嵌套指的是有些属性拥有同一个开始单词,如border-width,border-color都是以border开头。拿个官网的实例看下:
<code>//sass style //------------------------------- .fakeshadow { border: { style: solid; left: { width: 4px; color: #888; } right: { width: 2px; color: #ccc; } } } //css style //------------------------------- .fakeshadow { border-style: solid; border-left-width: 4px; border-left-color: #888; border-right-width: 2px; border-right-color: #ccc; } </code>
sass中使用@mixin声明混合,可以传递参数,参数名以$符号开始,多个参数以逗号分开,也可以给参数设置默认值。声明的@mixin通过@include来调用。
<code>//sass style //------------------------------- @mixin center-block { margin-left:auto; margin-right:auto; } .demo{ @include center-block; } //css style //------------------------------- .demo{ margin-left:auto; margin-right:auto; } </code>
<code>//sass style //------------------------------- @mixin opacity($opacity:50) { opacity: $opacity / 100; filter: alpha(opacity=$opacity); } //css style //------------------------------- .opacity{ @include opacity; //参数使用默认值 } .opacity-80{ @include opacity(80); //传递参数 } </code>
调用时可直接传入值,如@include传入参数的个数小于@mixin定义参数的个数,则按照顺序表示,后面不足的使用默认值,如不足的没有默认值则报错。除此之外还可以选择性的传入参数,使用参数名与值同时传入。
<code>//sass style //------------------------------- @mixin horizontal-line($border:1px dashed #ccc, $padding:10px){ border-bottom:$border; padding-top:$padding; padding-bottom:$padding; } .imgtext-h li{ @include horizontal-line(1px solid #ccc); } .imgtext-h--product li{ @include horizontal-line($padding:15px); } //css style //------------------------------- .imgtext-h li { border-bottom: 1px solid #cccccc; padding-top: 10px; padding-bottom: 10px; } .imgtext-h--product li { border-bottom: 1px dashed #cccccc; padding-top: 15px; padding-bottom: 15px; } </code>
如果一个参数可以有多组值,如box-shadow、transition等,那么参数则需要在变量后加三个点表示,如$variables...。
<code>//sass style //------------------------------- //box-shadow可以有多组值,所以在变量参数后面添加... @mixin box-shadow($shadow...) { -webkit-box-shadow:$shadow; box-shadow:$shadow; } .box{ border:1px solid #ccc; @include box-shadow(0 2px 2px rgba(0,0,0,.3),0 3px 3px rgba(0,0,0,.3),0 4px 4px rgba(0,0,0,.3)); } //css style //------------------------------- .box{ border:1px solid #ccc; -webkit-box-shadow:0 2px 2px rgba(0,0,0,.3),0 3px 3px rgba(0,0,0,.3),0 4px 4px rgba(0,0,0,.3); box-shadow:0 2px 2px rgba(0,0,0,.3),0 3px 3px rgba(0,0,0,.3),0 4px 4px rgba(0,0,0,.3); } </code>
@content在sass3.2.0中引入,可以用来解决css3的@media等带来的问题。它可以使@mixin接受一整块样式,接受的样式从@content开始。
<code>//sass style //------------------------------- @mixin max-screen($res){ @media only screen and ( max-width: $res ) { @content; } } @include max-screen(480px) { body { color: red } } //css style //------------------------------- @media only screen and (max-width: 480px) { body { color: red } } </code>
sass中,选择器继承可以让选择器继承另一个选择器的所有样式,并联合声明。使用选择器的继承,要使用关键词@extend,后面紧跟需要继承的选择器。
<code>//sass style //------------------------------- h1{ border: 4px solid #ff9aa9; } .speaker{ @extend h1; border-width: 2px; } //css style //------------------------------- h1,.speaker{ border: 4px solid #ff9aa9; } .speaker{ border-width: 2px; } </code>
从sass 3.2.0以后就可以定义占位选择器%。这种选择器的优势在于:如果不调用则不会有任何多余的css文件,避免了以前在一些基础的文件中预定义了很多基础的样式,然后实际应用中不管是否使用了@extend去继承相应的样式,都会解析出来所有的样式。占位选择器以%标识定义,通过@extend调用。
<code>//sass style //------------------------------- %ir{ color: transparent; text-shadow: none; background-color: transparent; border: 0; } %clearfix{ @if $lte7 { *zoom: 1; } &:before, &:after { content: ""; display: table; font: 0/0 a; } &:after { clear: both; } } #header{ h1{ @extend %ir; width:300px; } } .ir{ @extend %ir; } //css style //------------------------------- #header h1, .ir{ color: transparent; text-shadow: none; background-color: transparent; border: 0; } #header h1{ width:300px; } </code>
如上代码,定义了两个占位选择器%ir和%clearfix,其中%clearfix这个没有调用,所以解析出来的css样式也就没有clearfix部分。占位选择器的出现,使css文件更加简练可控,没有多余。所以可以用其定义一些基础的样式文件,然后根据需要调用产生相应的css。
ps:在@media中暂时不能@extend @media外的代码片段,以后将会可以。
sass定义了很多函数可供使用,当然你也可以自己定义函数,以@fuction开始。实际项目中我们使用最多的应该是颜色函数,而颜色函数中又以lighten减淡和darken加深为最,其调用方法为lighten($color,$amount)和darken($color,$amount),它们的第一个参数都是颜色值,第二个参数都是百分比。
<code>//sass style //------------------------------- $baseFontSize: 10px !default; $gray: #ccc !defualt; // pixels to rems @function pxToRem($px) { @return $px / $baseFontSize * 1rem; } body{ font-size:$baseFontSize; color:lighten($gray,10%); } .test{ font-size:pxToRem(16px); color:darken($gray,10%); } //css style //------------------------------- body{ font-size:10px; color:#E6E6E6; } .test{ font-size:1.6rem; color:#B3B3B3; } </code>
sass具有运算的特性,可以对数值型的Value(如:数字、颜色、变量等)进行加减乘除四则运算。请注意运算符前后请留一个空格,不然会出错。
<code>$baseFontSize: 14px !default; $baseLineHeight: 1.5 !default; $baseGap: $baseFontSize * $baseLineHeight !default; $halfBaseGap: $baseGap / 2 !default; $samllFontSize: $baseFontSize - 2px !default; //grid $_columns: 12 !default; // Total number of columns $_column-width: 60px !default; // Width of a single column $_gutter: 20px !default; // Width of the gutter $_gridsystem-width: $_columns * ($_column-width + $_gutter); //grid system width </code>
@if可一个条件单独使用,也可以和@else结合多条件使用
<code>//sass style //------------------------------- $lte7: true; $type: monster; .ib{ display:inline-block; @if $lte7 { *display:inline; *zoom:1; } } p { @if $type == ocean { color: blue; } @else if $type == matador { color: red; } @else if $type == monster { color: green; } @else { color: black; } } //css style //------------------------------- .ib{ display:inline-block; *display:inline; *zoom:1; } p { color: green; } </code>
语法为:if($condition, $iftrue, $iffalse) 。三个参数分别表示:条件,条件为真的值,条件为假的值。
<code>if(true, 1px, 2px) => 1px if(false, 1px, 2px) => 2px </code>
for循环有两种形式,分别为:@for $var from through 和@for $var from to 。$i表示变量,start表示起始值,end表示结束值,这两个的区别是关键字through表示包括end这个数,而to则不包括end这个数。
<code>//sass style //------------------------------- @for $i from 1 through 3 { .item-#{$i} { width: 2em * $i; } } //css style //------------------------------- .item-1 { width: 2em; } .item-2 { width: 4em; } .item-3 { width: 6em; } </code>
语法为:@each $var in 。其中$var表示变量,而list和map表示list类型数据和map类型数据。sass 3.3.0新加入了多字段循环和map数据循环。
<code>//sass style //------------------------------- $animal-list: puma, sea-slug, egret, salamander; @each $animal in $animal-list { .#{$animal}-icon { background-image: url('/images/#{$animal}.png'); } } //css style //------------------------------- .puma-icon { background-image: url('/images/puma.png'); } .sea-slug-icon { background-image: url('/images/sea-slug.png'); } .egret-icon { background-image: url('/images/egret.png'); } .salamander-icon { background-image: url('/images/salamander.png'); } </code>
<code>//sass style //------------------------------- $animal-data: (puma, black, default),(sea-slug, blue, pointer),(egret, white, move); @each $animal, $color, $cursor in $animal-data { .#{$animal}-icon { background-image: url('/images/#{$animal}.png'); border: 2px solid $color; cursor: $cursor; } } //css style //------------------------------- .puma-icon { background-image: url('/images/puma.png'); border: 2px solid black; cursor: default; } .sea-slug-icon { background-image: url('/images/sea-slug.png'); border: 2px solid blue; cursor: pointer; } .egret-icon { background-image: url('/images/egret.png'); border: 2px solid white; cursor: move; } </code>
<code>//sass style //------------------------------- $headings: (h1: 2em, h2: 1.5em, h3: 1.2em); @each $header, $size in $headings { #{$header} { font-size: $size; } } //css style //------------------------------- h1 { font-size: 2em; } h2 { font-size: 1.5em; } h3 { font-size: 1.2em; } </code>
(完)