zoukankan      html  css  js  c++  java
  • sass学习笔记2

    今天介绍sass在重用代码时最具威力的两个功能。一个是嵌套(Nesting),一个混合(Mixin)。

    我们在写CSS通过需要多个后代选择器组合到一起才能定位到目标元素上,而这定义过程,此元素的父元素与其他选择器都有许多相同的部分,嵌套就是把这些相同的部分放到某一层花括号里,然后通过花括号的层层缩进堆砌,找到它们的共性与特性。

    @charset "utf-8";//必须设置了这个才能编译有中文的注释
    nav {
        ul {
            margin: 0;
            padding: 0;
            list-style: none;
        }
    
        li { display: inline-block; }
    
        a {
            display: block;
            padding: 6px 12px;
            text-decoration: none;
        }
    }
    //------------------------------
    nav ul {
      margin: 0;
      padding: 0;
      list-style: none; }
    nav li {
      display: inline-block; }
    nav a {
      display: block;
      padding: 6px 12px;
      text-decoration: none; }
    
    

    当某一天,我们要兼容IE678等低级浏览器,发现它直接用nav不行时,需要改成.nav,我们只要改一处就行了,这大大提高维护性。

    sass的嵌套包括两种:一种是选择器嵌套;另一种是属性嵌套

    选择器嵌套是指在一个选择器里面能出现多重花括号,里面的每一重花括号前的选择器会在编译后,直接在前面加一个空白(后代选择器)跟在前方选择器的后面。 如果你不想它们之间出现后代选择器,可以在选择器的前面加一个&进行处理。

    
    @charset "utf-8";//必须设置了这个才能编译有中文的注释
    #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;
            }
        }
    }
    //------------------------------
    nav ul {
      margin: 0;
      padding: 0;
      list-style: none; }
    nav li {
      display: inline-block; }
    nav a {
      display: block;
      padding: 6px 12px;
      text-decoration: none; }
    
    

    属性嵌套,与前面的语法差不多,不同的是前面的选择器跟着一个冒号,那么编译后,它就像它转换为一个横扛与后面的选择器连接成一个单词。

    @charset "utf-8";//必须设置了这个才能编译有中文的注释
    .fakeshadow {
        border: {
            style: solid;
            left: {
                 4px;
                color: #888;
            }
            right: {
                 2px;
                color: #ccc;
            }
        }
    }
    //------------------------------
    .fakeshadow {
      border-style: solid;
      border-left- 4px;
      border-left-color: #888;
      border-right- 2px;
      border-right-color: #ccc; }
    
    

    sass3.3还添加了一个@at-root,用于跳出嵌套的,但我觉得现在说会破坏文章的流程,跳过。

    本文的第二个重点是@mixin,其实就相当于JS的函数,并且在传参方面,已经拥有es6、es7的一些新功能了。

    为了与内置方法的风格保持一致,建议大家都使用ruby风格(全部小写,并通过横杠连接)。 它的参数与变量名要求一致,需要以$打头,多个参数与逗号分开。如果参数有默认值,后面跟冒号再跟默认值。 如果想在其他地方使用这个函数,需要通过@include关键字来声明一下。

    @charset "utf-8";//必须设置了这个才能编译有中文的注释
    @mixin center-block{//没有参数
        margin-left:auto;
        margin-right:auto;
    }
    .demo{
        @include center-block();//小括号可以不写,但建议大家都写
    }
    
    @mixin opacity($opacity:50) {//有参数,并且有默认值
      opacity: $opacity / 100;
      filter: alpha(opacity=$opacity);
    }
    .opacity{
      @include opacity(); //使用默认值
    }
    .opacity-80{
      @include opacity(80); //使用传参
    }
    //------------------------------
    .demo {
      margin-left: auto;
      margin-right: auto; }
    
    .opacity {
      opacity: 0.5;
      filter: alpha(opacity=50); }
    
    .opacity-80 {
      opacity: 0.8;
      filter: alpha(opacity=80); }
    
    
    

    我们用@mixin搞一个兼容IE67的浮动函数练练手!

    $lte7:true;
    @mixin float($float:left) {
      float: $float;
      @if $lte7 {
        display: inline;
      }
    }
    

    再来一个创建小三角形的函数

    @charset "utf-8";//必须设置了这个才能编译有中文的注释
    @mixin triangle($direction, $size, $borderColor ) {
      content:"";
      height: 0;
       0;
    
      @if $direction == top {
        border-bottom:$size solid $borderColor;
        border-left:$size dashed transparent;
        border-right:$size dashed transparent;
      } 
      @else if $direction == right {
        border-left:$size solid $borderColor;
        border-top:$size dashed transparent;
        border-bottom:$size dashed transparent;
      } 
      @else if $direction == bottom {
        border-top:$size solid $borderColor;
        border-left:$size dashed transparent;
        border-right:$size dashed transparent;
      } 
      @else if $direction == left {
        border-right:$size solid $borderColor;
        border-top:$size dashed transparent;
        border-bottom:$size dashed transparent;
      }
    }
    .top-arrow {
      @include triangle(top, 1px, red)
    }
    //------------------------------
    .top-arrow {
      content: "";
      height: 0;
       0;
      border-bottom: 1px solid red;
      border-left: 1px dashed transparent;
      border-right: 1px dashed transparent; }
    
    

    @content传参机制,它相当于在@include 调用语句后添加了一对括号,括号里的内容当作额外的参数来替换 @content所在的位置。 此特性在sass3.2.0中引入,可以用来解决css3的@media等带来的问题。

    @charset "utf-8";//必须设置了这个才能编译有中文的注释
    @mixin max-screen($res){//参数一
      @media only screen and ( max- $res )
      {
        @content;//参数二
      }
    }
    
    @include max-screen(480px) {//传参一
      body { color: red }//传参二
    }
    //------------------------------
    @media only screen and (max- 480px) {
      body {
        color: red; } }
    
    

    此外,sass还有占位符及与它配套使用的@extend,它们的用法与@mixin, @include相差无几,以后再说。

    @function函数,此函数能对样式的规则的属性值进行更精致的计算,并且调用时不需要@include,相当的方便。许多内置函数就是由它创建的。

    //颜色处理
      lighten(#cc3, 10%) // #d6d65c
      darken(#cc3, 10%) // #a3a329
      grayscale(#cc3) // #808080
      complement(#cc3) // #33c
        rgba(#102030, 0.5) => rgba(16, 32, 48, 0.5)
        rgba(blue, 0.2)    => rgba(0, 0, 255, 0.2)
    
    //这个函数将一个颜色格式化成ie滤镜使用,在做css3使用滤镜兼容的时候用得上
        ie-hex-str(#abc) => #FFAABBCC
        ie-hex-str(#3322BB) => #FF3322BB
        ie-hex-str(rgba(0, 255, 0, 0.5)) => #8000FF00
    

    为数组添加更多方法

    
    //定义first()函数,获取列表中的第一个列表项
    @function list-first($list){
        @return nth($list,1);
    }
    
    //定义last()函数,获取列表中的最后一个列表项
    @function list-last($list){
        @return nth($list,length($list));
    }
    
    //移除数组某个元素
    @function remove($list, $value, $recursive: false) {
      $result: ();
    
      @for $i from 1 through length($list) {
        @if type-of(nth($list, $i)) == list and $recursive {
          $result: append($result, remove(nth($list, $i), $value, $recursive));
        }
    
        @else if nth($list, $i) != $value {
          $result: append($result, nth($list, $i));
        }
      }
    
      @return $result;
    }
    
    $list: a, b z, c, z, d, z, e, f;
    $new-list: remove($list, z);       // a, b z, c, d, e, f;
    $new-list: remove($list, z, true); // a, b, c, d, e, f
    //在某一位置上删除元素
    @function remove-nth($list, $index) {
      $result: null;
    
      @if type-of($index) != number {
        @warn "$index: #{quote($index)} is not a number for `remove-nth`.";
      }
    
      @else if $index == 0 {
        @warn "List index 0 must be a non-zero integer for `remove-nth`.";
      }
    
      @else if abs($index) > length($list) {
        @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`.";
      }
    
      @else {
        $result: ();
        $index: if($index < 0, length($list) + $index + 1, $index);  
    
        @for $i from 1 through length($list) {
          @if $i != $index {
            $result: append($result, nth($list, $i));
          }
        }
      }
    
      @return $result;
    }
    
    $list: a, b, z, c, d, e, f;
    $new-list: remove-nth($list,   3); // a, b, c, d, e, f
    $new-list: remove-nth($list,   0); // error
    $new-list: remove-nth($list,  -2); // a, b, z, c, d, f
    $new-list: remove-nth($list, -10); // error
    $new-list: remove-nth($list, 100); // error
    $new-list: remove-nth($list, zog); // error
    //对数组进行切片操作
    @function slice($list, $start: 1, $end: length($list)) {
      $result: null;
    
      @if type-of($start) != number or type-of($end) != number {
        @warn "Either $start or $end are not a number for `slice`.";
      }
    
      @else if $start > $end {
        @warn "The start index has to be lesser than or equals to the end index for `slice`.";
      }
    
      @else if $start < 1 or $end < 1 {
        @warn "List indexes must be non-zero integers for `slice`.";
      }
    
      @else if $start > length($list) {
        @warn "List index is #{$start} but list is only #{length($list)} item long for `slice`.";
      }
    
      @else if $end > length($list) {
        @warn "List index is #{$end} but list is only #{length($list)} item long for `slice`.";
      }
    
      @else {
        $result: ();
    
        @for $i from $start through $end {
          $result: append($result, nth($list, $i));
        }
      }
    
      @return $result;
    }
    }
    
    $list: a, b, c, d, e, f;
    $new-list: slice($list, 3, 5);   // c, d, e
    $new-list: slice($list, 4, 4);   // d
    $new-list: slice($list, 5, 3);   // error
    $new-list: slice($list, -1, 10); // error
    
    //反转数组
    @function reverse($list, $recursive: false) {
       $result: ();
    
       @for $i from length($list)*-1 through -1 {
          @if type-of(nth($list, abs($i))) == list and $recursive {
            $result: append($result, reverse(nth($list, abs($i)), $recursive));      
          }
    
          @else {
            $result: append($result, nth($list, abs($i)));
          }
       }
    
       @return $result;
    }
    $list: a, b, c d e, f, g, h;
    $new-list: reverse($list);       // h, g, f, c d e, b, a
    $new-list: reverse($list, true); // h, g, f, e d c, b, a
    //函数全部来自 http://hugogiraudel.com/2013/08/08/advanced-sass-list-functions/
    

    我们再创建一个页面看看unshift方法的效果

    
    <!DOCTYPE html>
    <html>
        <head>
            <title>TODO supply a title</title>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width">
        <link rel="stylesheet" type="text/css" href="css/index.css">
        </head>
        <body>
            <div class="text">司徒正美</div>
            <a href="http://www.cnblogs.com/rubylouvre">这是链接</a>
        </body>
    </html>
    

    @charset "utf-8";//必须设置了这个才能编译有中文的注释
    $list: b, c, d, e, f;
    @function unshift($list, $value) {
        @return join($value, $list);
    }
    $newlist: unshift($list, a);               // a, b, c, d, e, f
    body{
        background: blanchedalmond;
    }
    .text{
        &:after{
            color:red;
            display:block;
            border:1px solid red;
            content: "#{$newlist}";
        }
    }
    //------------------------------
    
    body {
      background: blanchedalmond; }
    
    .text:after {
      color: red;
      display: block;
      border: 1px solid red;
      content: "a, b, c, d, e, f"; }
    
    

    我们再定义一个将rem转换为px的函数:

    @charset "utf-8";//必须设置了这个才能编译有中文的注释
    $pixelBase : 16; 
    $px-only:true;
    @function parseInt($n) {
        @return $n / ($n * 0 + 1); 
    }
    
    @function rem2px($values){ 
    
        $list: ();
    
        @each $value in $values { //遍历数组
            $unit : unit($value); //取得其单位
            $val  : parseInt($value); //取得其值
            @if ($px-only) and ($unit == 'rem') { 
                $list: append($list, ($val * $pixelBase) + px); 
            }
            @else if($unit == 'px') or ($unit == 'rem'){ 
                $list: append($list, $value); 
            }
            @else {
                @warn 'There is no unit conversion for #{$unit}'; 
            }
        }
        @return $list;
    }
    
    body * {
        margin:rem2px(1rem 2rem 20px 3rem);
        padding-bottom:rem2px(0.25rem);
        font-size:rem2px(0.875rem);
    }
    //------------------------------
    body * {
      margin: 16px 32px 20px 48px;
      padding-bottom: 4px;
      font-size: 14px; }
    
    
    

    有了函数,sass就真正算是一门编程语言了!~

  • 相关阅读:
    CSS的水平居中和垂直居中解决方案
    如何组织CSS?
    关于前端工程师一定要做的6件事和自己的感悟
    让透明div里的文字不透明
    利用css3的多背景图属性实现幻灯片切换效果
    CSS响应式布局到底是什么?
    整站快速变黑白灰的方法
    分析一下jquery中的ajax操作
    什么是jquery中的事件委派?
    关于checkbox的一些jquery操作
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/3795384.html
Copyright © 2011-2022 走看看