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 }
    }
    
  • 相关阅读:
    js禁止页面回退,刷新,右键代码
    asp.net网站中的Gridview循环判断数据是否被选中
    Gridview中同时选中并删除多个数据
    asp.net中在后台更换控件图片的代码
    关于gcd的8题
    flash AIR 通过BitmapData生成图片到android Camera相册
    flash AIR 通过BitmapData生成图片到本地
    C的随机数
    xcode svn设置事项
    拒绝session丢失 利用DIV层实现对模态窗口的模拟
  • 原文地址:https://www.cnblogs.com/520future/p/11017856.html
Copyright © 2011-2022 走看看