SASS - 图1

注释

  • 标准的CSS注释 / xxx / ,会保留到编译后的文件。
  • 单行注释 // xxx,只保留在SASS源文件中,编译后被省略。

    变量

    scss认为中划线和下划线是完全相等的 $primary-color === $primary_color

  1. $primary-color: #cf449c;

作用域

变量支持块级作用域,嵌套规则内定义的变量只能在嵌套规则内使用(局部变量),不在嵌套规则内定义的变量则可在任何地方使用(全局变量)。 将局部变量转换为全局变量可以添加 !global

  1. // 编译前
  2. #main {
  3. $width: 5px !global;
  4. width: $width;
  5. }
  6. #sidebar {
  7. width: $width;
  8. }
  9. // 编译后
  10. #main {
  11. width: 5px;
  12. }
  13. #sidebar {
  14. width: 5px;
  15. }

默认值

变量已赋值

  1. // 编译前
  2. $primary-color: #000;
  3. $primary-color: #cf449c !default;
  4. #main {
  5. color: $primary-color;
  6. }
  7. // 编译后
  8. #main {
  9. color: #000;
  10. }

变量未赋值

  1. // 编译前
  2. $primary-color: null;
  3. $primary-color: #cf449c !default;
  4. #main {
  5. color: $primary-color;
  6. }
  7. // 编译后
  8. #main {
  9. color: #cf449c;
  10. }

嵌套

  1. // 编译前
  2. .popupBody {
  3. padding: 0 24px 70px 24px;
  4. .popupBody-lib {
  5. padding: 40px;
  6. background: #ffffff;
  7. border-radius: 16px;
  8. border: 1px solid #f2f2f2;
  9. margin-bottom: 25px;
  10. }
  11. .popupBody-img {
  12. width: 32px;
  13. height: 32px;
  14. margin-right: 10px;
  15. }
  16. }
  17. // 编译后
  18. .popupBody {
  19. padding: 0 24px 70px 24px;
  20. }
  21. .popupBody .popupBody-lib {
  22. padding: 40px;
  23. background: #ffffff;
  24. border-radius: 16px;
  25. border: 1px solid #f2f2f2;
  26. margin-bottom: 25px;
  27. }
  28. .popupBody .popupBody-img {
  29. width: 32px;
  30. height: 32px;
  31. margin-right: 10px;
  32. }

父选择器:&

同级

  1. // 编译前
  2. .popupBody {
  3. padding: 0 24px 70px 24px;
  4. &-lib {
  5. padding: 40px;
  6. background: #ffffff;
  7. border-radius: 16px;
  8. border: 1px solid #f2f2f2;
  9. margin-bottom: 25px;
  10. }
  11. &-img {
  12. width: 32px;
  13. height: 32px;
  14. margin-right: 10px;
  15. }
  16. }
  17. // 编译后
  18. .popupBody {
  19. padding: 0 24px 70px 24px;
  20. }
  21. .popupBody-lib {
  22. padding: 40px;
  23. background: #ffffff;
  24. border-radius: 16px;
  25. border: 1px solid #f2f2f2;
  26. margin-bottom: 25px;
  27. }
  28. .popupBody-img {
  29. width: 32px;
  30. height: 32px;
  31. margin-right: 10px;
  32. }

子级

  1. // 编译前
  2. .popupBody {
  3. padding: 0 24px 70px 24px;
  4. #{&}-lib {
  5. padding: 40px;
  6. background: #ffffff;
  7. border-radius: 16px;
  8. border: 1px solid #f2f2f2;
  9. margin-bottom: 25px;
  10. }
  11. #{&}-img {
  12. width: 32px;
  13. height: 32px;
  14. margin-right: 10px;
  15. }
  16. }
  17. // 编译后
  18. .popupBody {
  19. padding: 0 24px 70px 24px;
  20. }
  21. .popupBody .popupBody-lib {
  22. padding: 40px;
  23. background: #ffffff;
  24. border-radius: 16px;
  25. border: 1px solid #f2f2f2;
  26. margin-bottom: 25px;
  27. }
  28. .popupBody .popupBody-img {
  29. width: 32px;
  30. height: 32px;
  31. margin-right: 10px;
  32. }

属性嵌套

  1. // 编译前
  2. .wrap {
  3. font: {
  4. family: fantasy;
  5. size: 30px;
  6. weight: bold;
  7. }
  8. }
  9. // 编译后
  10. .wrap {
  11. font-family: fantasy;
  12. font-size: 30px;
  13. font-weight: bold;
  14. }

嵌套 @import

  1. // 编译前
  2. // example.scss
  3. .popupBody-lib {
  4. padding: 40px;
  5. background: #ffffff;
  6. border-radius: 16px;
  7. border: 1px solid #f2f2f2;
  8. margin-bottom: 25px;
  9. }
  10. // index.scss
  11. .popupBody {
  12. padding: 0 24px 70px 24px;
  13. @import "./example";
  14. .popupBody-img {
  15. width: 32px;
  16. height: 32px;
  17. margin-right: 10px;
  18. }
  19. }
  20. // 编译后
  21. .popupBody {
  22. padding: 0 24px 70px 24px;
  23. }
  24. .popupBody .popupBody-lib {
  25. padding: 40px;
  26. background: #ffffff;
  27. border-radius: 16px;
  28. border: 1px solid #f2f2f2;
  29. margin-bottom: 25px;
  30. }
  31. .popupBody .popupBody-img {
  32. width: 32px;
  33. height: 32px;
  34. margin-right: 10px;
  35. }

占位符选择器:%

当占位符选择器单独使用时(未通过 @extend 调用),不会编译到 CSS 文件中;方便定义样式的重复使用

  1. // 编译前
  2. .wrap {
  3. background: #fff;
  4. %title {
  5. font: {
  6. family: fantasy;
  7. size: 30px;
  8. weight: bold;
  9. }
  10. }
  11. }
  12. .wrap-title {
  13. @extend %title;
  14. }
  15. // 编译后
  16. .wrap {
  17. background: #fff;
  18. }
  19. .wrap .wrap-title {
  20. font-family: fantasy;
  21. font-size: 30px;
  22. font-weight: bold;
  23. }

@mixin

  1. // 编译前
  2. @mixin font {
  3. font: {
  4. family: fantasy;
  5. size: 30px;
  6. weight: bold;
  7. }
  8. }
  9. .wrap {
  10. background: #fff;
  11. @include font;
  12. }
  13. // 编译后
  14. .wrap {
  15. background: #fff;
  16. font-family: fantasy;
  17. font-size: 30px;
  18. font-weight: bold;
  19. }

传参

单个

  1. // 编译前
  2. @mixin ellipsis($line) {
  3. overflow: hidden;
  4. text-overflow: ellipsis;
  5. display: -webkit-box;
  6. -webkit-line-clamp: $line;
  7. -webkit-box-orient: vertical;
  8. }
  9. .wrap {
  10. @include ellipsis(2);
  11. }
  12. // 编译后
  13. .wrap {
  14. overflow: hidden;
  15. text-overflow: ellipsis;
  16. display: -webkit-box;
  17. -webkit-line-clamp: 2;
  18. -webkit-box-orient: vertical;
  19. }

多个

  1. // 编译前
  2. @mixin hue($color, $background, $border) {
  3. color: $color;
  4. border: 1px solid $border;
  5. background-color: $background;
  6. }
  7. .wrap {
  8. @include hue($background: #fff, $color: red, $border: red);
  9. }
  10. // 编译后
  11. .wrap {
  12. color: red;
  13. border: 1px solid red;
  14. background-color: #fff;
  15. }
  1. // 编译前
  2. @mixin box-shadow($shadows...) {
  3. box-shadow: $shadows;
  4. }
  5. .wrap {
  6. @include box-shadow(0px 4px 5px #666, 2px 6px 10px #999);
  7. }
  8. // 编译后
  9. .wrap {
  10. box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
  11. }

案例-换肤

以前写的一个换肤,但是这种不推荐,自定义程度太低,需要大量重新设计。 推荐:

  • css in js
  • 写一套css,然后传值给后台,由后台生成整套的css进行替换(ant,element)
  1. @import "./skin-variable.scss";
  2. @mixin themeify {
  3. @each $theme-name, $theme-map in $themes {
  4. $theme-map: $theme-map !global;
  5. [data-theme="#{$theme-name}"] & {
  6. @content;
  7. }
  8. }
  9. }
  10. @function themed($key) {
  11. @return map-get($theme-map, $key);
  12. }
  13. @mixin background_color($color) {
  14. @include themeify {
  15. background: themed($color) or rgba($color: #ffffff, $alpha: 0.2) !important;
  16. }
  17. }
  18. @mixin btnStyle($bg, $color) {
  19. @include themeify {
  20. background: themed($bg) !important;
  21. color: themed($color) !important;
  22. }
  23. }
  24. @mixin colorm($color) {
  25. @include themeify {
  26. color: themed($color) or #ffffff !important;
  27. }
  28. }
  29. @mixin border($color) {
  30. @include themeify {
  31. border: 1px solid themed($color) or #ffffff !important;
  32. }
  33. }