前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >scss这样写,你学会了吗?

scss这样写,你学会了吗?

作者头像
Maic
发布2023-08-18 18:38:31
3750
发布2023-08-18 18:38:31
举报
文章被收录于专栏:Web技术学苑

scss[1]在平常业务中肯定会使用,对于切图css写的实在是有点太多,但是在你写css的同时,你可以让css写得和别人有点不一样,那还是比较有意思的。本文是一篇关于scss的使用,希望在你的业务中带来思考和帮助

主要会从scss下面几点来讲

  • scss中的变量如何复用
  • @extend复用样式
  • 如何动态灵活使用插值for循环
  • @mixin@include减少重复样式编写
  • 占位符scss函数的使用

正文开始...

@extend

我们以一组标签为例子,在一组标签中,每一种标签的颜色背景属性不一样,但是宽度,高度属性是一样的

代码语言:javascript
复制

import React, { useState } from "react";
import style from "./index.module.scss";
interface Props {}

const Index: React.FC<Props> = (props) => {
  const {} = props;
  const [tagData, setTagData] = useState([
    {
      name: "tag1",
      value: "tag1",
    },
    {
      name: "tag2",
      value: "tag2",
    },
    {
      name: "tag3",
      value: "tag3",
    },
  ]);
  return (
    <div className={style["set-app"]}>
      <h1>tag</h1>
      <div className="tag-wrap">
        {tagData.map((v) => (
          <span className={v.name} key={v.name}>
            {v.name}
          </span>
        ))}
      </div>
    </div>
  );
};

export default Index;

我们看下scss如何编写

  • 用scss定义了width,height变量
  • global作用域下定义一个.tag-common的类
  • .tag-common类中既使用了tailwindcss也使用了scss的变量【会不生效,所以sass与tailwindcss不能混用】
  • .tag-wrap中使用了@extend来继承.tag-common
代码语言:javascript
复制

$width: 100px;
$height: 30px;
.set-app {
  :global {
    .tag-common {
      // @apply inline-block;
      display: inline-block;
      width: $width;
      height: $height;
    }
    .tag-wrap {
      span {
        @extend .tag-common;
      }
    }
  }
}

插值与@each循环

现在我们要设置每一个tag的颜色

  • 与上面有所不同的是,我们使用tagWrap: "tag-wrap",在使用这个变量时,我们使用了scss的插值,.#{
  • 我们使用scss@each循环依次设置了tag1tag2tag3的样式
代码语言:javascript
复制

$width: 100px;
$height: 30px;
$tagWrap: "tag-wrap";
.set-app {
  :global {
    .tag-common {
      display: inline-block;
      width: $width;
      height: $height;
    }
    .#{$tagWrap} {
      span {
        @extend .tag-common;
      }
      @each $tagName, $textColor, $bgColor in ("tag1", red, #bf6b97),
        ("tag2", pink, #3070b4), ("tag3", blue, #f5f5f5)
      {
        .#{$tagName} {
          color: $textColor;
          background-color: $bgColor;
        }
      }
    }
  }
}

看下最终的样式就是已经ok了

嵌套规则

从以上我们发现在.tag-wrap的子级我们是直接这样写的

代码语言:javascript
复制

.tag-wrap {
  span {
    @extend .tag-common;
    &:hover {
       font-size: 20px;
    }
  }
}

以上等价于下面,&当前元素

代码语言:javascript
复制

.tag-wrap span {}
.tag-wrap span:hover {}

@mixin与@include

如果我们tag在多个地方重用,那么我们可以利用@mixin来复用样式tag的样式,这样这个@mixin定义后,我们通过@include xxx()就可以调用了

代码语言:javascript
复制

$width: 100px;
$height: 30px;
$tagWrap: "tag-wrap";

@mixin tagStyle($selector, $textColor, $bgColor) {
  .#{$selector} {
    color: $textColor;
    background-color: $bgColor;
  }
}

.set-app {
  :global {
    .tag-common {
      display: inline-block;
      width: $width;
      height: $height;
    }
    .#{$tagWrap} {
      span {
        @extend .tag-common;
      }
      @each $tagName, $textColor, $bgColor in ("tag1", red, #bf6b97),
        ("tag2", pink, #3070b4), ("tag3", blue, #f5f5f5)
      {
        @include tagStyle($tagName, $textColor, $bgColor);
      }
    }
  }
}

预览

运算

如果我想要动态改变tag的宽度与高度

  • scss里是可以支持+-*/
  • 使用math.div($width, 2)除以2,引入了@use "sass:math"函数
代码语言:javascript
复制

@use "sass:math";
$width: 100px;
$height: 30px;
$tagWrap: "tag-wrap";
.set-app {
    :global {
        .tag-common {
          display: inline-block;
          width: math.div($width, 2);
          height: $height + 20px;
        }
     }
  }
  

%xxx占位符

通过%xxx可以使用可以减少你使用

代码语言:javascript
复制

// color.scss
p%name1 {
  color: red;
}
p%name2 {
  color: blue;
}

index.module.scss引入,@extend引入%name1

代码语言:javascript
复制

@import "./color.scss";
.set-app { 
  :global {
    .public-name .name1 {
      @extend %name1;
    }
    .public-name .name2 {
      @extend %name2;
    }
  }
}

@if 条件

scss也是可以用@if条件的,比如我想根据条件设置不同按钮的颜色

代码语言:javascript
复制

@mixin setColor($class) {
  @if ($class == "success") {
    color: green;
    border: 1px solid green;
  }
  @if ($class == "error") {
    color: red;
    border: 1px solid red;
  }
  @if ($class == "warn") {
    color: orange;
    border: 1px solid orange;
  }
}
.set-app {
  :global {
    .tag-common {
      display: inline-block;
      width: math.div($width, 2);
      height: $height + 20px;
    }
    .btn-item {
      width: $width;
      height: $height;
      text-align: center;
    }

    .warn-app {
      display: flex;
      p {
        @extend .btn-item;
        &.warn {
          @include setColor("warn");
        }
        &.success {
          @include setColor("success");
        }
        &.error {
          @include setColor("error");
        }
      }
    }
  }
}

这样我就可以根据传入的条件设置不同按钮的颜色了

@function

我们从以上例子中我们会发现@mixin@include是配合使用的,@mixin可以很好的定义一个工具mixin可以减少重复类似样式的使用,但在scss中也可以使用函数方式

代码语言:javascript
复制

$width: 100px;

@function setWith($width) {
  @return $width + 30px;
}
.set-app {
  :global {
    .btn-item {
      width: setWith($width);
      height: $height;
      text-align: center;
    }

    .warn-app {
      display: flex;
      p {
        @extend .btn-item;
        &.warn {
          @include setColor("warn");
        }
        &.success {
          @include setColor("success");
        }
        &.error {
          @include setColor("error");
        }
      }
    }
  }
}

我们会发现setWith($width)就可以直接调用了

总结

  • 主要是概述了我们平时开发中写scss中的一些比较高效的方法,比如@mixin@include@extend,还有函数,我们在使用scss中尽量复用,但是不建议有意把scss写得过于复杂,比如使用@for,@each,在某些时候是可以使用的,但是不建议为了使用而使用
  • scss写得更有意思,可以在项目中抽离出重复的样式做scss@mixin
  • code example[2]

参考资料

[1]scss: https://sass-lang.com/documentation/syntax/

[2]code example: https://github.com/maicFir/base-chrome-plugin

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Web技术学苑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • @extend
  • 插值与@each循环
  • 嵌套规则
  • @mixin与@include
  • 运算
  • %xxx占位符
  • @if 条件
  • @function
  • 总结
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档