>웹 프론트엔드 >CSS 튜토리얼 >CSS 전처리기 Sass 예제에 대한 자세한 설명

CSS 전처리기 Sass 예제에 대한 자세한 설명

小云云
小云云원래의
2018-01-15 09:51:581759검색

이 글은 CSS 전처리기 Sass에 대한 자세한 설명에 대한 관련 정보를 주로 소개합니다. 편집자가 꽤 좋다고 생각해서 지금 공유하고 참고용으로 제공하겠습니다. 편집자를 따라 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다.

Sass는 CSS를 향상시키는 보조 도구입니다. CSS 구문을 기반으로 하는 변수, 중첩 규칙, 믹스인 및 인라인 가져오기와 같은 고급 기능을 추가하여 CSS를 더욱 강력하고 우아하게 만듭니다. Sass 및 Sass 스타일 라이브러리(예: Compass)를 사용하면 스타일 파일을 더 잘 구성 및 관리하고 프로젝트를 더 효율적으로 개발하는 데 도움이 될 수 있습니다.

1. 기능

  1. CSS3과 완벽하게 호환

  2. CSS 기반 변수, 중첩, 믹스인 및 기타 기능 추가

  3. 함수를 사용하여 색상 값 및 속성 값 제어 작업

  4. 제어 지시문과 같은 고급 기능 제공

  5. 맞춤형 출력 형식

파일 접미사 이름: sass에는 접미사 파일 이름이 두 개 있는데, 하나는 접미사이고 다른 하나는 그렇지 않습니다. 중괄호와 세미콜론을 사용하세요. 여기서 사용하는 scss 파일은 중괄호와 세미콜론을 사용하여 일반적으로 작성하는 CSS 파일 형식과 유사합니다. 이 튜토리얼에서 언급된 모든 sass 파일은 접미사가 scss인 파일을 참조합니다. 또한 sass 접미사의 엄격한 형식 요구 사항으로 인한 오류를 방지하려면 접미사 scss가 있는 파일을 사용하는 것이 좋습니다.


//文件后缀名为sass的语法
body
  background: #eee
  font-size:12px
p
  background: #0982c1

//文件后缀名为scss的语法  
body {
  background: #eee;
  font-size:12px;
}
p{
  background: #0982c1;
}

2. Sass와 Less의 구문 비교

2.1 Sass와 Less의 차이점

  1. 컴파일 환경이 다릅니다. Sass는 Ruby와 같은 서버사이드 환경을 기반으로 컴파일됩니다. 그리고 Less는 서버를 지원할 수 있습니다. 사이드 컴파일은 클라이언트 측(브라우저 환경)에서도 컴파일할 수 있습니다

  2. 변수 기호는 다릅니다. Sass는 $ 기호를 사용하여 변수를 선언하고 Less는 @ 기호를 사용하여 변수를 선언합니다

  3. 조건문에 대한 지원이 다릅니다 - Sass는 복잡한 조건문을 지원합니다(if..else..와 유사). Less는 간단한 조건문만 지원합니다(if()..와 유사)

  4. 범위 - Sass 로컬 수정 변수 전역 변수에 영향을 줄 수 있습니다. Less는 로컬 범위에서만 적용됩니다.

  5. 외부 CSS 파일을 참조하는 방법은 다릅니다. Sass는 기본적으로 .sass 또는 .scss 파일을 가져올 때 접미사를 무시할 수 있지만 Less는 가져온 파일이 키워드 구성을 통해 처리되는 방식을 제어해야 합니다.

2.2 Sass와 Less의 유사점

  1. Mixins - 함수 또는 매크로와 유사하며 매개변수를 전달할 수 있습니다.

  2. 중첩 규칙 - 클래스가 클래스 내에 중첩되므로 중복 코드가 줄어듭니다.

  3. 연산 - CSS에서 덧셈, 뺄셈, 곱셈, 나눗셈을 사용하여 다양한 값과 문자열 등을 계산합니다.
  4. 색상 함수 - 내장된 함수를 통해 색상을 편집할 수 있습니다.
  5. )——호출할 수 있는 그룹 스타일;

  6. 3. Sass 구문의 주요 기능 소개

3.1 CSS 함수 확장

중첩 규칙

Sass는 중첩할 CSS 스타일 다른 스타일 세트에 중첩된 내부 스타일은 외부 선택기를 상위 선택기로 사용합니다. 중첩 기능은 상위 선택기를 반복적으로 입력하는 것을 방지하고 다음과 같이 복잡한 CSS 구조를 더 쉽게 관리할 수 있도록 합니다. 상위 선택기&

CSS 규칙을 중첩할 때 중첩된 외부 레이어의 상위 선택기를 직접 사용해야 하는 경우가 있습니다. 예를 들어 요소에 대한 호버 스타일을 설정하거나 본문 요소에 특정 클래스 이름이 있는 경우 , &는 중첩 규칙 외부의 상위 선택자를 나타내는 데 사용할 수 있습니다.


//sass style or less style
#main p {
  color: #00ff00;
  width: 97%;

  .redbox {
    background-color: #ff0000;
    color: #000000;
  }
}

//css style
#main p {
color: #00ff00;
width: 97%; }
#main p .redbox {
  background-color: #ff0000;
  color: #000000; }
속성 중첩

일부 CSS 속성은 동일한 네임스페이스(네임스페이스)를 따릅니다. 예를 들어 글꼴 패밀리, 글꼴 크기, 글꼴 가중치는 모두 속성의 네임스페이스로 글꼴을 사용합니다. 이러한 속성의 관리를 용이하게 하고 반복적인 입력을 피하기 위해 Sass는 속성이 다음과 같은 네임스페이스에 중첩되도록 허용합니다.


//sass style or less style
a {
  font-weight: bold;
  text-decoration: none;
  &:hover { text-decoration: underline; }
  body.firefox & { font-weight: normal; }
}

//css style
a {
font-weight: bold;
text-decoration: none; }
a:hover {
  text-decoration: underline; }
body.firefox a {
  font-weight: normal; }
네임스페이스에는 다음과 같은 자체 속성 값도 포함될 수 있습니다. 3.2 Import

sass의 가져오기(@import) 규칙은 CSS의 규칙과 다릅니다. 컴파일 시 @import의 scss 파일이 병합되어 하나의 CSS 파일만 생성됩니다. 하지만 @import 'reset.css'와 같은 CSS 파일을 sass 파일로 가져오면 일반 CSS 가져오기 스타일 파일과 효과는 동일하지만 가져온 CSS 파일은 컴파일된 파일에 병합되지 않고 존재하게 됩니다. @import 모드에서.


모든 Sass 가져오기 파일은 접미사 .scss를 무시할 수 있습니다. 일반적으로 기본적인 파일 명명 방식은 _mixin.scss와 같이 _로 시작합니다. 이런 종류의 파일은 가져올 때 밑줄을 그을 필요가 없지만 @import "mixin"으로 쓸 수 있습니다.

less import(@import) 구문: @import(키워드) "filename";

여러 키워드 @import가 허용됩니다. 쉼표를 사용하여 키워드를 구분해야 합니다. 예: @import(선택 사항, 참조) " foo.less" ;

reference: 더 적은 파일을 사용하지만 출력하지 않음

inline: 소스 파일에 출력을 포함하지만 처리하지 않음

  • less: 将该文件视为less文件,无论其扩展名为什么

  • css: 将文件视为css文件,无论扩展名为什么

  • once: 该文件仅可导入一次 (默认)

  • multiple: 该文件可以多次导入

  • optional: 当没有发现文件时仍然编译

  • 导入文件代码示例:


    /*被导入sass文件a.scss,less文件a.less:*/
    
    //a.scss or a.less
    //-------------------------------
    body {
      background: #eee;
    }
    
    /*需要导入样式的sass文件b.scss,less文件b.less:*/
    
    @import "reset.css";
    @import "a";
    p{
      background: #0982c1;
    }   
    
    /*转译出来的b.css样式:*/
    
    @import "reset.css";
    body {
      background: #eee;
    }
    p{
      background: #0982c1;
    }

    根据上面的代码可以看出,b.scss编译后,reset.css继续保持import的方式,而a.scss则被整合进来了。同理,less中也是这样处理的。

    3.3 注释 /* */ 与 //

    Sass 支持标准的 CSS 多行注释 /* */,以及单行注释 //,前者会被完整输出到编译后的 CSS 文件中,而后者则不会。Less中不用担心这一点,Less中多行注释 /* */,以及单行注释 //都可以随意使用,都会在编译过程中被保留。例如:


    //sass style
    /* This comment is
     * several lines long.
     * since it uses the CSS comment syntax,
     * it will appear in the CSS output. */
    body { color: black; }
    // These comments are only one line long each.
    // They won't appear in the CSS output,
    // since they use the single-line comment syntax.
    a { color: green; }
    
    //css style
    /* This comment is
     * several lines long.
     * since it uses the CSS comment syntax,
     * it will appear in the CSS output. */
    body {
      color: black; }
    a {
      color: green; }

    3.4 SassScript

    变量 $

    Sass的变量必须是$开头,后面紧跟变量名,如果值后面加上!default则表示默认值。Less的变量与Sass类似,只是使用符号不同,Less中采用的是@


    //sass style
    //-------------------------------
    $fontSize: 12px;
    body{
        font-size:$fontSize;
    }  
    //less style
    //-------------------------------
    @fontSize: 12px;
    body{
        font-size:@fontSize;
    }
    //css style
    //-------------------------------
    body{
        font-size:12px;
    }

    变量默认值

    sass的默认变量一般是用来设置默认值,然后根据需求来覆盖的,覆盖的方式也很简单,只需要在使用默认变量之前重新声明下变量即可;默认变量的价值在进行组件化开发的时候会非常有用。


    //sass style
    //-------------------------------
    $baseLineHeight:  1.5 !default;
    body{
        line-height: $baseLineHeight; 
    }
    
    //css style
    //-------------------------------
    body{
        line-height:1.5;
    }
    
    /*覆盖默认值*/
    //sass style
    //-------------------------------
    $baseLineHeight:  2;
    $baseLineHeight:  1.5 !default;
    body{
        line-height: $baseLineHeight; 
    }
    
    //css style
    //-------------------------------
    body{
        line-height:2;
    }

    变量 #{} 的使用形式

    一般我们定义的变量都为属性值,可直接使用,但是如果变量作为属性或在某些特殊情况下等则必须要以#{$variables}形式使用。


    //sass style
    //-------------------------------
    $borderDirection:    top !default; 
    $baseFontSize:       12px !default;
    $baseLineHeight:     1.5 !default;
    
    //应用于class和属性
    .border-#{$borderDirection}{
      border-#{$borderDirection}:1px solid #ccc;
    }
    //应用于复杂的属性值
    body{
        font:#{$baseFontSize}/#{$baseLineHeight};
    }
    
    //css style
    //-------------------------------
    .border-top{
      border-top:1px solid #ccc;
    }
    body {
      font: 12px/1.5;
    }

    多值变量 list

    简单来说list类型有点像js中的数组。list数据可通过空格,逗号或小括号分隔多个值,可用nth($var,$index)取值。

    关于list数据操作还有很多其他函数如length($list),join($list1,$list2,[$separator]),append($list,$value,[$separator])等

    定义:


    //一维数据
    $px: 5px 10px 20px 30px;
    
    //二维数据,相当于js中的二维数组
    $px: 5px 10px, 20px 30px;
    $px: (5px 10px) (20px 30px);

    使用方法:


    //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;
    }

    多值变量 map

    简单来说map类型有点像es6语法中的map数据结构。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)等

    定义:


    $heading: (h1: 2em, h2: 1.5em, h3: 1.2em);

    使用方法:


    //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; 
    }

    变量作用域

    Sass和Less中的变量作用域分别类似与javascript中的两种变量申明方式,下面一段代码可以对比出变量声明时的不同处理方式。

    Sass中的变量赋值直接修改全局变量,Less中的变量赋值可只在局部生效。


    //Sass style
    $color:red; 
    p{ 
      $color:blue; 
      color:$color;//blue 
    } 
    a{ 
      color:$color;//blue 
    }
    //Less style
    @color:red; 
    p{ 
      @color:blue; 
      color:@color;//blue 
    } 
    a{ 
      color:@color;//red 
    }

    3.5 混合(mixin)

    sass中使用@mixin声明混合,可以传递参数,也可以给参数设置默认值。声明的@mixin通过@include来调用;在less中只需要将定义好的class用类似函数的方式直接引用。

    无参数 mixin


    //sass style
    @mixin center-block {
        margin-left:auto;
        margin-right:auto;
    }
    .demo{
        @include center-block;
    }
    //less style
    .center-block {
        margin-left:auto;
        margin-right:auto;
    }
    .demo{
        .center-block;
    }
    
    //css style
    .demo{
        margin-left:auto;
        margin-right:auto;
    }

    有参数 mixin


    //sass style
    @mixin opacity($opacity:50) {
      opacity: $opacity / 100;
      filter: alpha(opacity=$opacity);
    }
    .opacity-80{
      @include opacity(80); //传递参数
    }
    //less style
    .opacity(@opacity:50) {
      opacity: @opacity / 100;
      filter: alpha(opacity=@opacity);
    }
    .opacity-80{
      .opacity(80); //传递参数
    }
    //css style
    .opacity-80{
      opacity: .8;
      filter: alpha(opacity=80);
    }

    多个参数 mixin

    Sass调用时可直接传入值,如@include传入参数的个数小于@mixin定义参数的个数,则按照顺序表示,后面不足的使用默认值,如不足的没有默认值则报错。除此之外还可以选择性的传入参数,使用参数名与值同时传入;Less中使用方法类似。


    //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);
    }
    //less style
    .horizontal-line(@border:1px dashed #ccc, @padding:10px){
        border-bottom:@border;
        padding-top:@padding;
        padding-bottom:@padding;  
    }
    .imgtext-h li{
        .horizontal-line(1px solid #ccc);
    }
    //css style
    .imgtext-h li {
        border-bottom: 1px solid #cccccc;
        padding-top: 10px;
        padding-bottom: 10px;
    }

    多组值参数 mixin

    Sass中如果一个参数可以有多组值,如box-shadow、transition等,那么参数则需要在变量后加三个点表示,如$variables…;Less表示不定参数时可以直接使用 … 表示,并用@arguments表示所有参数


    //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));
    }
    //less style
    .box-shadow(...) {
      -webkit-box-shadow:@arguments;
      box-shadow:@arguments;
    }
    .box{
      border:1px solid #ccc;
      .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);
    }

    3.6 运算

    sass具有运算的特性,可以对数值型的Value(如:数字、颜色、变量、字符串等)进行加减乘除四则运算。请注意运算符前后请留一个空格,不然会出错。


    //计算数值、变量
    $baseFontSize:          14px !default;
    $baseLineHeight:        2 !default;
    $baseGap:               $baseFontSize * $baseLineHeight !default; // => 28px
    $halfBaseGap:           $baseGap / 4  !default; // => 7px
    $samllFontSize:         $baseFontSize - 2px  !default; // => 12px
    
    $_columns:              12 !default;  
    $_column-width:         60px !default;  
    $_gutter:               20px !default;     
    $_gridsystem-width:     $_columns * ($_column-width + $_gutter); // => 960px
    
    //计算颜色
    p {
      color: #010203 + #040506; // => #050709
    }
    
    //计算字符串
    p:before {
      content: "Foo " + Bar; // => "Foo Bar"
      font-family: sans- + "serif"; // => sans-serif
    }

    3.7 控制指令

    SassScript 提供了一些基础的控制指令,比如在满足一定条件时引用样式,或者设定范围重复输出格式。控制指令是一种高级功能,日常编写过程中并不常用到,主要与混合指令 (mixin) 配合使用。

    @if


    //sass style
    p {
      @if 1 + 1 == 2 { border: 1px solid; }
      @if 5 < 3 { border: 2px dotted; }
      @if null  { border: 3px double; }
    }
    //css style
    p {
    border: 1px solid; }
    
    //sass style
    $type: monster;
    p {
      @if $type == ocean {
        color: blue;
      } @else if $type == matador {
        color: red;
      } @else if $type == monster {
        color: green;
      } @else {
        color: black;
      }
    }
    //less style
    @type: monster;
    p (@type) when (@type = ocean){color: blue;}
    p (@type) when (@type = matador){color: red;}
    p (@type) when (@type = monster){color: green;}
    p (@type) when (@type = dark){color: black;}
    
    //css style
    p {
    color: green; }

    @for

    @for 指令包含两种格式:@for $var from 5151abf5f2f2896f3332f558b89cf20a through 55ce3cce52a8c4396e1d2f10875a095a,或者 @for $var from 5151abf5f2f2896f3332f558b89cf20a to 55ce3cce52a8c4396e1d2f10875a095a,区别在于 through 与 to 的含义:当使用 through 时,条件范围包含 5151abf5f2f2896f3332f558b89cf20a 与 55ce3cce52a8c4396e1d2f10875a095a 的值,而使用 to 时条件范围只包含 5151abf5f2f2896f3332f558b89cf20a 的值不包含 55ce3cce52a8c4396e1d2f10875a095a 的值。另外,$var 可以是任何变量,比如 $i;5151abf5f2f2896f3332f558b89cf20a 和 55ce3cce52a8c4396e1d2f10875a095a 必须是整数值。


    //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; }

    @each

    语法为:@each $var in 318243e94be5423f7ba05ee6944632b7。其中$var表示变量,而list和map表示list类型数据和map类型数据。

    单个字段list数据循环:


    //sass style
    $animal-list: puma, sea-slug, egret, salamander;
    @each $animal in $animal-list {
      .#{$animal}-icon {
        background-image: url(&#39;/images/#{$animal}.png&#39;);
      }
    }
    
    //css style
    .puma-icon {
      background-image: url(&#39;/images/puma.png&#39;); 
    }
    .sea-slug-icon {
      background-image: url(&#39;/images/sea-slug.png&#39;); 
    }
    .egret-icon {
      background-image: url(&#39;/images/egret.png&#39;); 
    }
    .salamander-icon {
      background-image: url(&#39;/images/salamander.png&#39;); 
    }

    多个字段list数据循环:


    //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(&#39;/images/#{$animal}.png&#39;);
        border: 2px solid $color;
        cursor: $cursor;
      }
    }
    
    //css style
    //-------------------------------
    .puma-icon {
      background-image: url(&#39;/images/puma.png&#39;);
      border: 2px solid black;
      cursor: default; 
    }
    .sea-slug-icon {
      background-image: url(&#39;/images/sea-slug.png&#39;);
      border: 2px solid blue;
      cursor: pointer; 
    }
    .egret-icon {
      background-image: url(&#39;/images/egret.png&#39;);
      border: 2px solid white;
      cursor: move; 
    }

    多个字段map数据循环:


    //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; 
    }

    @extend

    @extend 的作用是将重复使用的样式 (.error) 延伸 (extend) 给需要包含这个样式的特殊样式(.seriousError),例子:


    //sass style
    //-------------------------------
    .error {
      border: 1px #f00;
      background-color: #fdd;
    }
    .error.intrusion {
      background-image: url("/image/hacked.png");
    }
    .seriousError {
      @extend .error;
      border-width: 3px;
    }
    
    //css style
    //-------------------------------
    .error, .seriousError {
      border: 1px #f00;
      background-color: #fdd; }
    
    .error.intrusion, .seriousError.intrusion {
      background-image: url("/image/hacked.png"); }
    
    .seriousError {
      border-width: 3px; }

    3.8 函数指令

    Sass 支持自定义函数,并能在任何属性值或 Sass script 中使用:


    //sass style
    //-------------------------------
    $grid-width: 40px;
    $gutter-width: 10px;
    
    @function grid-width($n) {
      @return $n * $grid-width + ($n - 1) * $gutter-width;
    }
    
    #sidebar { width: grid-width(5); }
    //css style
    //-------------------------------
    #sidebar {
      width: 240px; }

    与 mixin 相同,也可以传递若干个全局变量给函数作为参数。一个函数可以含有多条语句,需要调用 @return 输出结果。

    Sass 函数允许使用关键词参数,上面的例子也可以写成:


    //关键词参数调用形式
    #sidebar { width: grid-width($n: 5); }

    虽然不够简明,但是阅读起来会更方便。关键词参数给函数提供了更灵活的接口,以及容易调用的参数。关键词参数可以打乱顺序使用,如果使用默认值也可以省缺,另外,参数名被视为变量名,下划线、短横线可以互换使用。

    相关推荐:

    vue-cli + sass 的正确打开方式

    如何解决webstrom sass注释中文出错问题

    详解node-sass安装失败的原因与解决方法

    위 내용은 CSS 전처리기 Sass 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.