動態

詳情 返回 返回

scss使用注意點 - 動態 詳情

scss拓展寫法

.a {
    .b {
        &:hover {
            width: 100px;
        }
        &.c {
            width: 100px;
        }
        &-d {
            width: 100px;
            font: {
                size: 20px;
            }
        }
    }
}

轉化為:

.a .b:hover {
  width: 100px;
}
.a .b.c {
  width: 100px;
}
.a .b-d {
  width: 100px;
  font-size: 20px;
}
// %base (佔位符)用佔位符防止.button編譯 
.button%base {
    color: #333;
}

.btn-success {
    @extend %base;
    background-color: green;
}
.btn-error {
    @extend %base;
    background-color: red;
}

轉化為:

.button.btn-error, .button.btn-success {
  color: #333;
}

.btn-success {
  background-color: green;
}

.btn-error {
  background-color: red;
}

scss變量

css變量使用

:root {
    --color: #333;
}

body {
    --border-color: #000;
}

.header {
    --background-color: #f2f2f2;
    --font-color: #f00;
    width: 100vw;
    height: 100px;
    background-color: var(--background-color);
}
span {
    color: var(--font-color); // .header中的span生效, 不在header中的span標籤不生效
}

scss變量

$color: #fff; // scss變量以$開頭
$border_color: #f00;
$border-color: #ccc; // 注意scss變量對中劃線和下劃線不敏感, 下面的覆蓋上面的

.a {
    color: $color;
    border-color: $border_color;
}

轉化為:

.a {
  color: #fff;
  border-color: #ccc;
}

scss變量同樣存在作用域
但是

$color: null;
.a {
    $color: red !global; // 可以通過!global提升為全局變量, 雖然可以編譯成功, 但是編譯器會報錯As of Dart Sass 2.0.0, !global assignments won't be able to declare new variables. 需要在根節點聲明$color: null;才能解決報錯信息
}

.b {
    color: $color;
}

轉化為:

.b {
  color: red;
}
// scss變量的數據類型:
// 1. 可以是任何css屬性值;
// 2. 也可以是boolean/null用於判斷
// 3. 可以是逗號分隔的list
// 4. 可以是小括號包裹的key:value的類似於map的集合
$layer-index: 10;
$border-width: 3px;
$font-base-family: 'Open Sans', Helvetica, Sans-Serif;
$top-bg-color: rgba(255, 147, 29, .6);
$block-base-padding: 6px 10px 0 10px;
$block-mode: true;
$var: null;
$color-map: (color1: #f00, color2: #ff0, color: #0ff);
$fonts: (serif: 'Helvetica Neue', monospace: 'Consolas');
$font-size: null;
.container {
    @if $block-mode {
        background-color: #000;
        $var: 'hahaha'
    }@else {
        background-color: #fff;
        $var: 'heiheihei'
    }

    content: type-of($var);
    content: length($var);
    color: map-get($color-map, color2);
}

.wrap {
    font: 10px blod map-get($map: $fonts, $key: 'sans'); // map-get如果找不到對應key值會返回空值
}

轉化為:

.container {
  background-color: #000;
  content: null;
  content: 1;
  color: #ff0;
}

.wrap {
  font: 10px blod;
}
$color: #333;

$color: #666 !default;

p {
    color: $color;
}

轉化為:

p {
  color: #333;
}

scss中使用css變量

$color: #333;

:root {
    --color: #{$color}; // 注意不能直接使用$color, 需要用插值語法
}

導入

css導入

@import url(a.css);

scss導入

@import 'public.scss'; // 可以正確導入scss模塊
@import 'public'; // 可以正確導入scss模塊
@import url(public.scss); // 不會編譯, 作為普通css語法
@import 'public.css'; // 不會編譯, 作為普通css語法
@import 'https://xxx.com/xxx'; // 不會編譯, 作為普通css語法
@import 'landscape' screen and (orientation: landscape); // 不會編譯, 作為普通css語法

如果一個scss文件不想被編譯可以用下劃線開頭定義文件名

混入

@mixin block {
    .a {
        width: 96%;
        margin-left: 2%;
        border-radius: 10px;
        border: 1px solid #333;
    }
}

.container {
    @include block;
}

轉化為:

.container .a {
  width: 96%;
  margin-left: 2%;
  border-radius: 10px;
  border: 1px solid #333;
}
// 參數可以指定默認值
@mixin block-padding($top: 0, $right: 0, $bottom: 0, $left: 0) {
    padding-top: $top;
    padding-right: $right;
    padding-bottom: $bottom;
    padding-left: $left;
}

.container {
    // 可以按順序傳參
    // @include block-padding(10px, 20px, 30px, 40px);
    // 也可以指定參數名傳參
    @include block-padding($left: 40px, $right: 20px, $top: 10px, $bottom: 30px);
}

轉化為:

.container {
  padding-top: 10px;
  padding-right: 20px;
  padding-bottom: 30px;
  padding-left: 40px;
}

@mixin linear-gradient($direction, $gradients...) {
    background-color: nth($list: $gradients, $n: 1); // 獲取一個$list的$n位(不是從0開始)
    background-image: linear-gradient($direction, $gradients);
}

.container {
    @include linear-gradient(to top, #f00, #0f0, #00f);
}

轉化為:

.container {
  background-color: #f00;
  background-image: -webkit-gradient(linear, left bottom, left top, from(#f00), color-stop(#0f0), to(#00f));
  background-image: linear-gradient(to top, #f00, #0f0, #00f);
}

繼承

.alert {
    width: 100%;
}

.alert-info {
    @extend .alert;
    background-color: #f2f2f2;
}

.alert-success {
    @extend .alert;
    background-color: green;
}

轉化成:

// 如果不想成成.alert類的樣式, 只是用於集成的話, 可以在scss中將.alert換成%alert佔位符
.alert, .alert-success, .alert-info {
  width: 100%;
}

.alert-info {
  background-color: #f2f2f2;
}

.alert-success {
  background-color: green;
}

繼承和混入的區別

繼承和混入都能將一段樣式代碼引入到另一段代碼中, 但是@mixin會將這段代碼複製到所有@include處, 而@extend過來的代碼, 會將所有@extend的類集合起來寫, 雖然效果一樣, 但是用@extend得到的目標代碼更少, 更精簡.

主要來説兩者用法不一樣

  • 混入的話意圖在於樣式代碼的複用
  • 繼承的話意圖在於在一個選擇器中使用另一個選擇器的樣式

運算符

==        等於
!=        不等於
>        大於
<        小於
>=        大於等於
<=        小於等於
and        且
or        或
not     非
+        加 / 字符串連接
-        減
*        乘
/        除
%        取餘
// 加減乘除應用於數字類型的數據操作, 在scss中 1 1px 1pt 1vw 1%都是數字類型, 有多種單位的數字, 所以就很噁心, 用之前試一試吧, 大部分編譯結果還是可以常理預測的, 但是也有特殊的
.container {
    width: 10 + 20;
    width: 30 + 40%;  // 如果一個數字和帶單位的數據加, 那麼數字會默認加上對應單位
    width: 50% + 60;
    width: 70% + 80%;
    width: 90 + 100px;
    width: 110px + 120;
    width: 130px + 140px;
    // width: 20px + 10%;  報錯, 兩個不同單位相加減會報錯, 這種應該用css的calc函數
    width: calc(150px + 160%);

    width: 10 * 20;
    width: 5 * 10%;
    // width: 50% * 10%; // 報錯
    // width: 10px * 50px; 報錯
    width: 2 * 10px;

    width: 10 / 5; // 不會計算(三種情況會走計算邏輯1. 值或值得一部分是變量或函數返回值; 2. 值被小括號包裹; 3. 值是算數表達式的一部分)
    $width: 1000px;
    .div {
        width: $width / 2;
        width: $width / 2px;
        z-index: round($number: 10) / 2;
        height: (500px / 2);
        height: (500px / 2px);
        // height: (500 / 2px); // 報錯
        height: (500 / 2);
    }

    .span {
        width: 10 % 3;
        width: 50 % 3px;
        width: 50px % 3px;;
    }
}

轉換成:

.container {
  width: 30;
  width: 70%;
  width: 110%;
  width: 150%;
  width: 190px;
  width: 230px;
  width: 270px;
  width: calc(150px + 160%);
  width: 200;
  width: 50%;
  width: 20px;
  width: 10/5;
}
.container .div {
  width: 500px;
  width: 500;
  z-index: 5;
  height: 250px;
  height: 250;
  height: 250;
}
.container .span {
  width: 1;
  width: 2px;
  width: 2px;
}

插值語法#{}

$class-name: danger;
$attr: color;
$author: 'wjt';

/*
@author: #{$author}
*/
a.#{$class-name} {
    border-#{$attr}: #f00;
}

轉換為:

/*
@author: wjt
*/
a.danger {
  border-color: #f00;
}

常用函數

顏色相關lighten/darken/opacify

p {
    height: 30px;
}
$bgc: #5c7a29;
.p0 {
    background-color: $bgc;
}
.p1 {
    background-color: lighten($color: $bgc, $amount: 30%);
}
.p2 {
    background-color: darken($color: $bgc, $amount: 15%);
}
.p3 {
    background-color: opacify($color: $bgc, $amount: .5);
}
.p4 {
    background-color: opacify($color: rgba($bgc, .1), $amount: .5);
}

轉換為:

p {
  height: 30px;
}

.p0 {
  background-color: #5c7a29;
}

.p1 {
  background-color: #aace6e;
}

.p2 {
  background-color: #314116;
}

.p3 {
  background-color: #5c7a29;
}

.p4 {
  background-color: rgba(92, 122, 41, 0.6);
}
p {
    &:after {
        content: quote($string: aaa);
    }
    background-color: unquote($string: "#f00");
    z-index: str-length($string: "aaa")
}

轉換為:

p {
  background-color: #f00;
  z-index: 3;
}
p:after {
  content: "aaa";
}
p {
    z-index: abs($number: -15);
    z-index: ceil($number: 4.2);
    z-index: max(5, 1, 5, 8, 3);
    opacity: random();
}

轉換為:

p {
  z-index: 15;
  z-index: 5;
  z-index: 8;
  opacity: 0.3833696362;
}

Add a new 評論

Some HTML is okay.