zoukankan      html  css  js  c++  java
  • Sass基础教程

    Sass基础教程

    Sass基础语法

    使用变量

    变量声明

    /* 声明$nav-color变量 这种注释内容会出现在生成的css文件中 */
    $nav-color: #abcdef;
    nav {
        $ 100px; // 声明$width变量 静默注释 这种注释内容不会出现在生成的css文件中
         $width;
        color: $nav-color;
    }
    

    变量引用

    $highlight-color: #abcdef;
    .selected {
    	border: 1px $highlight-color solid;
    }
    

    看上边示例中的 $highlight-color 变量,它被直接赋值给 border 属性,当这段代码被编译输出CSS时, $highlight-color 会被 #abcdef 这一颜色值所替代。产生的效果就是给selected 这个类一条1像素宽、实心且颜色值为 #abcdef 的边框。

    嵌套 CSS 规则

    基础使用

    css原始方式:

    #content article h1 { color: #333 }
    #content article p { margin-bottom: 1.4em }
    #content aside { background-color: #eee }
    

    sass嵌套方式:

    #content {
        article {
            h1 { color: #333 }
            p { margin-bottom: 1.4em }
        }
        aside { background-color: #eee }
    }
    

    父选择器的标识符 &

    article a {
        color: blue;
        :hover { color: red }
    }
    

    这意味着 color: red 这条规则将会被应用到选择器 article a :hover , article 元素内链接的所有子元素在被 hover 时都会变成红色。

    article a {
        color: blue;
        &:hover { color: red }
    }
    

    结果:

    article a { color: blue }
    article a:hover { color: red }
    

    群组选择器的嵌套

    在CSS里边,选择器 h1 、 h2 和 h3 会同时命中 h1 元素、 h2 元素和 h3 元素。与此类似, .button 、button 会命中 button 元素和类名为 .button 的元素。这种选择器称为群组选择器。群组选择器的规则会对命中群组中任何一个选择器的元素生效。

    .button, button {
    	margin: 0;
    }
    

    css写法:

    .container h1, .container h2, .container h3 { margin-bottom: .8em }
    

    sass写法

    .container {
    	h1, h2, h3 {margin-bottom: .8em}
    }
    

    子组合选择器和同层组合选择器: > 、 + 和 ~

    >

    article section { margin: 5px }
    article > section { border: 1px solid #ccc }
    

    上例中,第一个选择器会选择 article下的所有命中 section 选择器的元素。第二个选择器只会选择 article 下紧跟着的子元素中命中section 选择器的元素。

    +

    同层相邻组合选择器 + 选择 header 元素后紧跟的 p 元素:

    header + p { font-size: 1.1em }
    

    ~

    同层全体组合选择器 ~ ,选择所有跟在 article 后的同层 article 元素,不管它们之间隔了多少其他元素:

    article ~ article { border-top: 1px dashed #ccc }
    

    嵌套属性

    在Sass中,除了CSS选择器,属性也可以进行嵌套。

    写法一:

    nav {
        border: {
            style: solid;
             1px;
            color: #ccc;
        }
    }
    

    编译结果:

    nav {
        border-style: solid;
        border- 1px;
        border-color: #ccc;
    }
    

    写法二:

    nav {
        border: 1px solid #ccc {
            left: 0px;
            right: 0px;
        }
    }
    

    这比下面的写法更简洁

    nav {
        border: 1px solid #ccc;
        border-left: 0px;
        border-right: 0px;
    }
    

    导入sass文件

    1557369657495

    使用Sass部分文件

    当通过 @import 把Sass样式分散到多个文件时,你通常只想生成少数几个CSS文件。那些专门为 @import 命令而编写的Sass文件,并不需要生成对应的独立CSS文件,这样的Sass文件称为局部文件。对此,Sass有一个特殊的约定来命名这些文件。

    此约定即,Sass局部文件的文件名以下划线开头。这样,Sass就不会在编译时单独编译这个文件输出CSS,而只把这个文件用作导入。当你 @import 一个局部文件时,还可以不写文件的全名,即省略文件名开头的下划线。举例来说,你想导入themes/_night-sky.scss这个局部文件里的变量,你只需在样式表中写 @import "themes/night-sky";

    局部文件可以被多个不同的文件引用。当一些样式需要在多个页面甚至多个项目中使用时,这非常有用。在这种情况下,有时需要在你的样式表中对导入的样式稍作修改,Sass有一个功能刚好可以解决这个问题,即默认变量值。

    默认变量值

    一般情况下,你反复声明一个变量,只有最后一处声明有效且它会覆盖前边的值。举例说明:

    $link-color: blue;
    $link-color: red;
    a {
    	color: $link-color;
    }
    

    在上边的例子中,超链接的 color 会被设置为 red 。这可能并不是你想要的结果,假如你写了一个可被他人通过 @import 导入的Sass库文件,你可能希望导入者可以定制修改Sass库文件中的某些值。使用Sass的 !default 标签可以实现这个目的。它很像CSS属性中 !important 标签的对立面,不同的是 !default 用于变量,含义是:如果这个变量被声明赋值了,那就用它声明的值,否则就用这个默认值。

    $fancybox- 400px !default;
    .fancybox {
    	 $fancybox-width;
    }
    

    在上例中,如果用户在导入你的Sass局部文件之前声明了一个 $fancybox-width 变量,那么你的局部文件中对 $fancybox-width 赋值 400px 的操作就无效。如果用户没有做这样的声明,则 $fancybox-width 将默认为400px 。

    接下来我们将学习嵌套导入,它允许只在某一个选择器的范围内导入Sass局部文件。

    嵌套导入

    blue-theme.scss文件,内容如下:

    aside {
        background: blue;
        color: white;
    }
    

    然后把它导入到一个CSS规则内,如下所示:

    .blue-theme {@import "blue-theme"}
    

    生成的结果跟你直接在 .blue-theme 选择器内写_blue-theme.scss文件的内容完全一样。

    .blue-theme {
        aside {
            background: blue;
            color: #fff;
        }
    }
    

    原生的CSS导入

    由于Sass兼容原生的CSS,所以它也支持原生的CSS @import 。尽管通常在Sass中使用@import 时,Sass会尝试找到对应的Sass文件并导入进来,但在下列三种情况下会生成原生的CSS @import ,尽管这会造成浏览器解析CSS时的额外下载:

    1. 被导入文件的名字以.css结尾;
    2. 被导入文件的名字是一个URL地址(比如http://sass-lang.com/stylesheets/application.css),由此可用谷歌字体API提供的相应服务;
    3. 被导入文件的名字是CSS的 url() 值。

    这就是说,你不能用Sass的 @import 直接导入一个原始的CSS文件,因为Sass会认为你想用CSS原生的 @import 。但是,因为Sass的语法完全兼容CSS,所以你可以把原始的CSS文件改名为.scss后缀,即可直接导入了。

    文件导入是保证Sass的代码可维护性和可读性的重要一环。次之但亦非常重要的就是注释了。注释可以帮助样式作者记录写Sass的过程中的想法。在原生的CSS中,注释对于其他人是直接可见的,但Sass提供了一种方式可在生成的CSS文件中按需抹掉相应的注释。

    混合器

    混合器中使用 @mixin 标识符定义,例如:

    @mixin rounded-corners {
        -moz-border-radius: 5px;
        -webkit-border-radius: 5px;
        border-radius: 5px;
    }
    

    通过 @include 来使用这个混合器

    示例:

    .notice {
        background-color: green;
        border: 2px solid #00aa00;
        @include rounded-corners;
    }
    

    Sass最终生成:

    .notice {
        background-color: green;
        border: 2px solid #00aa00;
        -moz-border-radius: 5px;
        -webkit-border-radius: 5px;
        border-radius: 5px;
    }
    

    何时使用混合器

    利用混合器,可以很容易地在样式表的不同地方共享样式。如果你发现自己在不停地重复一段样式,那就应该把这段样式构造成优良的混合器,尤其是这段样式本身就是一个逻辑单元,比如说是一组放在一起有意义的属性。

    判断一组属性是否应该组合成一个混合器,一条经验法则就是你能否为这个混合器想出一个好的名字。如果你能找到一个很好的短名字来描述这些属性修饰的样式,比如 rounded-corners 、fancy-font 或者 no-bullets ,那么往往能够构造一个合适的混合器。如果你找不到,这时候构造一个混合器可能并不合适。

    混合器中的CSS规则

    混合器中不仅可以包含属性,也可以包含CSS规则,包含选择器和选择器中的属性,例如:

    定义no-bullets混合器

    @mixin no-bullets {
        list-style: none;
        li {
            list-style-image: none;
            list-style-type: none;
            margin-left: 0px;
        }
    }
    

    使用no-bullets混合器

    ul.plain {
        color: #444;
        @include no-bullets;
    }
    

    Sass的 @include 指令会将引入混合器的那行代码替换成混合器里边的内容。

    结果:

    ul.plain {
        color: #444;
        list-style: none;
    }
    ul.plain li {
        list-style-image: none;
        list-style-type: none;
        margin-left: 0px;
    }
    

    混合器中的规则甚至可以使用Sass的父选择器标识符 & 。使用起来跟不用混合器时一样,Sass解开嵌套规则时,用父规则中的选择器替代 & 。

    给混合器传参

    混合器并不一定总得生成相同的样式。可以通过在 @include 混合器时给混合器传参,来定制混合器生成的精确样式。当 @include 混合器时,参数其实就是可以赋值给CSS属性值的变量。

    如果你写过JavaScript,这种方式跟JavaScript的 function 很像:

    @mixin link-colors($normal, $hover, $visited) {
        color: $normal;
        &:hover { color: $hover; }
        &:visited { color: $visited; }
    }
    

    当混合器被@include时,你可以把它当作一个CSS函数来传参。如果你像下边这样写:

    a {
    	@include link-colors(blue, red, green);
    }
    

    Sass最终生成的是:

    a { color: blue; }
    a:hover { color: red; }
    a:visited { color: green; }
    

    当你 @include 混合器时,有时候可能会很难区分每个参数是什么意思,参数之间是一个什么样的顺序。为了解决这个问题,Sass允许通过语法 $name: value 的形式指定每个参数的值。

    这种形式的传参,参数顺序就不必再在乎了,只需要保证没有漏掉参数即可:

    a {
        @include link-colors(
            $normal: blue,
            $visited: green,
            $hover: red
        );
    }
    

    尽管给混合器加参数来实现定制很好,但是有时有些参数我们没有定制的需要,这时候也需要赋值一个变量就变成很痛苦的事情了。所以Sass允许混合器声明时给参数赋默认值。

    默认参数值

    为了在 @include 混合器时不必传入所有的参数,我们可以给参数指定一个默认值。参数默认值使用 $name: default-value 的声明形式,默认值可以是任何有效的CSS属性值,甚至是其他参数的引用,例如:

    @mixin link-colors(
        $normal,
        $hover: $normal,
        $visited: $normal
        ) {
        color: $normal;
        &:hover { color: $hover; }
        &:visited { color: $visited; }
    }
    

    如果像下边这样调用: @include link-colors(red)$hover$visited 也会被自动赋值为 red 。

    混合器只是Sass样式重用特性中的一个。我们已经了解到混合器主要用于样式展示层的重用,如果你想重用语义化的类呢?这就涉及Sass的另一个重要的重用特性:选择器继承。

    附录

    /* Compass将CSS3变得容易了!
    尤其是CSS3渐变*/
    @import "compass/css3"
    
    // 这个混入类让我们可以轻松地制造渐变
    // 它会为我们挑选颜色,很好。
    @mixin easy-gradient($bg, $alpha: false) {
        @if ($alpha) {
        	$bg: rgba($bg, $alpha);
        }
        $top: lighten($bg, 5);
        $bottom: darken($bg, 5);
        @include background-image(
        	linear-gradient($top, $bottom)
        )
    }
    
    nav {
        margin: 20px { left: 0; right: 0 }
        @include easy-gradient(#ccc);
        a { color: blue; text-decoration: none }
    }
    
  • 相关阅读:
    Smart Client Architecture and Design Guide
    Duwamish密码分析篇, Part 3
    庆贺发文100篇
    .Net Distributed Application Design Guide
    New Introduction to ASP.NET 2.0 Web Parts Framework
    SPS toplevel Site Collection Administrators and Owners
    来自Ingo Rammer先生的Email关于《Advanced .Net Remoting》
    The newsletter published by Ingo Rammer
    深度探索.Net Remoting基础架构
    信道、接收器、接收链和信道接受提供程序
  • 原文地址:https://www.cnblogs.com/520future/p/11017856.html
Copyright © 2011-2022 走看看