ご存知のように、CSS は実際にはプログラミング言語ではありません。CSS に詳しい人なら誰でも、CSS の正式名が Cascading Style Sheets (カスケード スタイル シート) であることを知っています。これは、HTML を表現するために使用されるアプリケーションです (Standard General Markup のアプリケーション)。 Language) または XML (Standard General Markup Language) のサブセット) およびその他のファイル スタイルのコンピューター言語。これを使用して、プレゼンテーション層と構造層の分離、つまり html とスタイルの分離を実現します。これを使用して Web ページのスタイルを設定することはできますが、変数を宣言したり、関数を呼び出したり、JavaScript のような条件ステートメントを使用したりすることはできません。CSS は柔軟で動的であると言えます。
そこで、トラバーサル、メソッド、さらには継承を可能にし、文法エラーを通知できるように、それにプログラミングのアイデアを追加したいと考えている人もいます。そのため、CSS 前処理 を使用することで、最初に新しい特殊なプログラミング言語は Web ページのスタイルをデザインするために使用され、その後 CSS にコンパイルされます。実際、コンパイルされた CSS は最終的にも参照されます。
CSS の前処理といえば、ほとんどの人はまず Less を思い浮かべるかもしれません。 Less は、現在、CSS の前処理に適した言語の 1 つです。高速で便利で、使い始めるのが簡単です。Sass は 2 番目の言語です。比較的、より柔軟で、より多くの構文 (特に if、else、for) があります。 ) もちろん、多くの人がそれを使用しない理由は、インストールが不便であることです (幸いなことに、淘宝網のミラーがあります)。3 番目の理由は Stylus です。これは Sass に似ており、より柔軟で強力です。ここで、私は Sass を好み、Sass がすぐになくなることはないと信じているので、Sass について簡単に紹介します。
CSS 前処理を使用すると、よりプログラム的にスタイルを処理できることは事実ですが、それでも、CSS 前処理が使用される環境を考慮する必要があります。 end cssファイルが生成されます(若き私への昔の先輩の教え)。
そのため、プロジェクトが比較的小さく、あまり多くの CSS を必要とせず、開発時間が限られており、チーム内の多くの人がその方法を知らないかどうかは、プロジェクトのサイズ、開発時間、チームのコストに基づいて決定する必要があります。それを使用する場合は、ネイティブ CSS を使用する方が良いかもしれません。
そうですね、元々多くの開発者がsassを使いたかったのですが、sassはrubyベースなので高い壁があり、長い間rubyをインストールできないので断念したと言わざるを得ません。 W3Cplus チュートリアルを参照し、淘宝網イメージを使用してインストールすることをお勧めします。ノードを含むいくつかのパッケージをインストールするには、非常に高速で強力です。
そうですね、多くの友人がこれをインストールしていますが、コンパイルが非常に面倒だと感じています。ここでは、sass コンパイル チュートリアルへのリンクを続けます。Koala は更新を停止しましたが、実際には、less と sass の両方をコンパイルすることができ、コンパイル中に圧縮することもできます。
まずは違いを見てみましょう
実際、sass 構文は、sass の本来の文法構造であり、jade テンプレートのインデントに似た規則です。さらに、この文法規則は非常に厳密です。コンパイル中に報告されます。
Scss は、sass の新しい文法形式です。別の前処理言語とは考えないでください。実際、以前の文法構造が厳しすぎることが判明した後、sass によって再カスタマイズされた文法構造です。 css とは少し異なりますが、基本的には CSS と同じで、以前の CSS コードを直接コピーすることができます。
ここでは例としてコード ブロックに書きました。実際、ファイル名はそれぞれ .sass と .scss で終わります。
これは Sass の基本的なプログラミング要素の 1 つです。 JSでは変数の宣言にvarを使いますが、ES6ではletとconstが新たに追加されました。 Sass での変数の宣言と呼び出しのルールは次のとおりです
変数はデフォルト変数と通常の変数に分けられます。デフォルト変数の場合は、!payment のように値の後に !default を追加します。実際、コンポーネントを開発する場合、通常は通常の変数を宣言するだけで済みます。変数宣言は非常に簡単なので説明する必要はありません。
JS と同様に、sass 構文にはローカル変数とグローバル変数があります。以下に示すように、グローバル変数は最外層で宣言され、グローバル スコープで呼び出すことができます。em のローカル変数は em{} で宣言され、em{} 内でのみ呼び出すことができます。
和JS类似,sass也拥有自己的数据类型分别是
编程的思想嘛。混合宏是一个类似于函数的存在,当然,他并不是函数。简单来说就是加了参数功能的灵活度提升的可重用的代码块。
<span style="color: #800000;">@mixin border-radius</span>{<span style="color: #ff0000;"> -webkit-border-radius</span>:<span style="color: #0000ff;"> 5px</span>;<span style="color: #ff0000;"> border-radius</span>:<span style="color: #0000ff;"> 5px</span>; }<span style="color: #800000;"> button </span>{<span style="color: #ff0000;"> @include border-radius; </span>}
这里是一个简单的混合宏的使用,先是用@mixin定义了一个名叫border-radius的混合宏,然后在代码中利用@include进行调用,其实这样的话并不能太大体现出混合宏的特色。看下面的
<span style="color: #800000;">@mixin border-radius1($radius)</span>{<span style="color: #ff0000;"> -webkit-border-radius</span>:<span style="color: #0000ff;"> $radius</span>;<span style="color: #ff0000;"> border-radius</span>:<span style="color: #0000ff;"> $radius</span>; }<span style="color: #800000;"> @mixin border-radius2($radius:5px)</span>{<span style="color: #ff0000;"> -webkit-border-radius</span>:<span style="color: #0000ff;"> $radius</span>;<span style="color: #ff0000;"> border-radius</span>:<span style="color: #0000ff;"> $radius</span>; }<br><br><span style="color: #800000;"> .box1 </span>{<span style="color: #ff0000;"> @include border-radius(5px); </span>}<span style="color: #800000;"> .box2 </span>{<span style="color: #ff0000;"> @include border-radius; </span>}<span style="color: #800000;"> .box2 </span>{<span style="color: #ff0000;"> @include border-radius(5px); </span>}
从代码里可以看出,混合宏可以像函数一样传入参数,并且可以像ES6的函数扩展一样添加参数默认值,如果在调用的时候不传参数,那么就会使用默认的值,这样极大的增加了代码的灵活性,省却很多开发时间。
其实,mixin的灵活还不仅仅如此,它可以传入多个参数,这样我们想到了函数可以根据参数数量的不同来执行不同的代码。yes !sass也可以做到!
<span style="color: #800000;">@mixin size($width,$height)</span>{<span style="color: #ff0000;"> //两个参数或者多个参数可以这样这样定义 width</span>:<span style="color: #0000ff;"> $width</span>;<span style="color: #ff0000;"> height</span>:<span style="color: #0000ff;"> $height</span>; }<span style="color: #800000;"> .box-center </span>{<span style="color: #ff0000;"> @include size(100px,200px); </span>}
<span style="color: #800000;">@mixin box-shadow($shadows...)</span>{<span style="color: #ff0000;"> //参数过多可以使用...来代替 @if length($shadows) >= 1 { -webkit-box-shadow</span>:<span style="color: #0000ff;"> $shadows</span>;<span style="color: #ff0000;"> box-shadow</span>:<span style="color: #0000ff;"> $shadows</span>; }<span style="color: #800000;"> @else </span>{<span style="color: #ff0000;"> $shadows</span>:<span style="color: #0000ff;"> 0 0 2px rgba(#000,.25)</span>;<span style="color: #ff0000;"> -webkit-box-shadow</span>:<span style="color: #0000ff;"> $shadow</span>;<span style="color: #ff0000;"> box-shadow</span>:<span style="color: #0000ff;"> $shadow</span>; }<span style="color: #800000;"> }<br></span>
.box { @include box-shadow(0 0 1px rgba(#000,.5),0 0 2px rgba(#000,.2)); }
上面两个代码块第一个比较简单,就是增加参数数目。下面的代码块我们利用sass的if else方法来实现了判断,如果参数数目大于等于1,也就是传了参数,那么我们执行上面的代码,如果没有传参我们执行下面的代码,设置默认的$shadows值生成代码块。
但是混合宏也有不足之处:那就是调用一个混合宏生成的css代码并不会进行合并,这也是因为他能够传参所设置的,所以对于复用性很强的代码块不推荐使用混合宏。
sass允许你使用@extend继承别的代码块,并且通过@extend所继承的代码块会在生成css的时候进行合并~哈哈,完美解决了上面的问题
<span style="color: #800000;">.btn1 </span>{<span style="color: #ff0000;"> border</span>:<span style="color: #0000ff;"> 1px solid #ccc</span>;<span style="color: #ff0000;"> padding</span>:<span style="color: #0000ff;"> 6px 10px</span>;<span style="color: #ff0000;"> font-size</span>:<span style="color: #0000ff;"> 14px</span>; }<span style="color: #800000;"> %btn2 </span>{<span style="color: #ff0000;"> border</span>:<span style="color: #0000ff;"> 1px solid #ccc</span>;<span style="color: #ff0000;"> padding</span>:<span style="color: #0000ff;"> 6px 10px</span>;<span style="color: #ff0000;"> font-size</span>:<span style="color: #0000ff;"> 14px</span>; }<span style="color: #800000;"> <br /></span>
%btn3 { border: 1px solid #ccc; padding: 6px 10px; font-size: 14px; }
<span style="color: #800000;"> .btn-primary1 </span>{<span style="color: #ff0000;"> background-color</span>:<span style="color: #0000ff;"> #f36</span>;<span style="color: #ff0000;"> color</span>:<span style="color: #0000ff;"> #fff</span>;<span style="color: #ff0000;"> @extend .btn1; </span>}<span style="color: #800000;"> .btn-primary2 </span>{<span style="color: #ff0000;"> background-color</span>:<span style="color: #0000ff;"> #f36</span>;<span style="color: #ff0000;"> color</span>:<span style="color: #0000ff;"> #fff</span>;<span style="color: #ff0000;"> @extend %btn2; </span>}
上面的代码中.btn1是预先定义好的类,然后我们在.btn-primary1中继承他的所有代码块,而%btn2就是在标题里所提到的占位符,占位符的代码块如果不被继承在生成的css中是不会显示出来的,所以如果你是用sass编译css的话,公共类使用占位符来定义是一个很不错的选择。为了加深理解我们看下上面的代码所生成的css代码。
<span style="color: #800000;">.btn1, .btn-primary1 </span>{<span style="color: #ff0000;"> border</span>:<span style="color: #0000ff;"> 1px solid #ccc</span>;<span style="color: #ff0000;"> padding</span>:<span style="color: #0000ff;"> 6px 10px</span>;<span style="color: #ff0000;"> font-size</span>:<span style="color: #0000ff;"> 14px</span>; }<span style="color: #800000;"> .btn-primary2 </span>{<span style="color: #ff0000;"> border</span>:<span style="color: #0000ff;"> 1px solid #ccc</span>;<span style="color: #ff0000;"> padding</span>:<span style="color: #0000ff;"> 6px 10px</span>;<span style="color: #ff0000;"> font-size</span>:<span style="color: #0000ff;"> 14px</span>; }<span style="color: #800000;"> .btn-primary1 </span>{<span style="color: #ff0000;"> background-color</span>:<span style="color: #0000ff;"> #f36</span>;<span style="color: #ff0000;"> color</span>:<span style="color: #0000ff;"> #fff</span>; }<span style="color: #800000;"> .btn-primary2 </span>{<span style="color: #ff0000;"> background-color</span>:<span style="color: #0000ff;"> #f36</span>;<span style="color: #ff0000;"> color</span>:<span style="color: #0000ff;"> #fff</span>; }
继承btn1的btn-primary1他和btn1进行了合并,而我们使用占位符定义的%btn2,%btn3在生成代码里没有显示,因为btn-primary2继承了%btn2,所以他继承的公共部分被单独拿出来,如果有多个代码块继承%btn2,他们会进行合并。
占位符还是混合宏,主要还是看你的代码怎么使用,如果只是静态的代码公共块,那么占位符会比较适合,而如果是可变的代码例如写一个复杂的css3动画之类的,可能混合宏比较适合了。
如果接触过jade模板的朋友会比较熟悉,这里的插值和它用法是基本一致的。让我们来看一个复杂的代码块
<span style="color: #800000;">$properties: (margin, padding); @mixin set-value($side, $value) </span>{<span style="color: #ff0000;"> @each $prop in $properties { #{$prop</span>}<span style="color: #800000;">-#</span>{<span style="color: #ff0000;">$side</span>}<span style="color: #800000;">: $value; } } .login-box </span>{<span style="color: #ff0000;"> @include set-value(top, 14px); </span>}
首先我们声明了一个$properties的变量,里面是一个值列表里面两个字符串,@mixin方法里我们通过@each方法循环出值列表里面的字符串然后利用插值的方法将字符串插入进去,我们看下生成的css代码
<span style="color: #800000;">.login-box </span>{<span style="color: #ff0000;"> margin-top</span>:<span style="color: #0000ff;"> 14px</span>;<span style="color: #ff0000;"> padding-top</span>:<span style="color: #0000ff;"> 14px</span>; }
这里只是做一个示例,正常情况下我们不会用这么复杂的方法来生成这么短的css代码,那样才是真正的浪费开发时间,当然茶余饭后做个组件开发的话,还是很有用的。
sass允许我们做一些基本的运算:加减乘除,但是我要说的是:注意单位!注意单位!注意单位!当然如果你异想天开em+px,px*px,px/rem。。。我表示。。。
需要知道的是sass里允许进行颜色运算,也就是说 #222222 * 2你将会得到 #444444,其实颜色的运算机制是分段运算也就是说如果22*2 22*2 22*2然后在进行合并的。
字符串运算:
字符串可以通过+来进行链接,放心减号是不管用的。。。需要注意的是因为sass的字符串有两种类型,带引号和不带引号,相同相加当然出来的是一致的。如果有引号的字符串被添加了一个没有引号的字符串 (也就是,带引号的字符串在 + 符号左侧), 结果会是一个有引号的字符串。 同样的,如果一个没有引号的字符串被添加了一个有引号的字符串 (没有引号的字符串在 + 符号左侧), 结果将是一个没有引号的字符串,其实就是谁在左边就跟着谁。
<span style="color: #800000;">p:before </span>{<span style="color: #ff0000;"> content</span>:<span style="color: #0000ff;"> "Foo " + Bar</span>;<span style="color: #ff0000;"> font-family</span>:<span style="color: #0000ff;"> sans- + "serif"</span>; }<span style="color: #800000;"> //生成的css如下 p:before </span>{<span style="color: #ff0000;"> content</span>:<span style="color: #0000ff;"> "Foo Bar"</span>;<span style="color: #ff0000;"> font-family</span>:<span style="color: #0000ff;"> sans-serif</span>; }
上面的内容就是sass的上篇。都是一些基础的东西,下篇的话会整理一下说到函数和方法规则相关的东西。