Skip to main content

Command Palette

Search for a command to run...

Converting CSS to SASS

Updated
•View as Markdown

Install

  1. Open terminal and change directory to the project folder
  2. Install Sass with the command line below
    $npm install sass
    
  3. Check if you can find the version info of sass on package.json>>"dependencies"
    "dependencies": {
     "@testing-library/jest-dom": "^5.16.4",
     "@testing-library/react": "^13.2.0",
     "@testing-library/user-event": "^13.5.0",
     "react": "^18.1.0",
     "react-dom": "^18.1.0",
     "react-router-dom": "^6.3.0",
     "react-scripts": "5.0.1",
     "sass": "^1.51.0", //you should see the info here
     "web-vitals": "^2.1.4"
    },
    
  4. Change the extension of linked css file to ".scss" Screenshot 2022-05-10 at 14.37.32.png
//from 
import "./Login.css";
import "./Main.css";

//to
import "./Login.scss";
import "./Main.scss";


Converting

Variables

Making variables is a way to store information that you want to reuse throughout your stylesheet. Store things like colours, fonts, or any CSS values you think you are going to reuse. You can use $ symbol to make a variable.

//CSS
.login-container {
    border: 1px solid lightgrey;
    background-color: #fff;
    margin: 40px auto 0;
}

.login-input {
    display: block;
    box-sizing: border-box;
    border: 1px solid lightgrey;
    border-radius: 3px;
    box-shadow: 0 1px #fff;
}

//Sass
$primary-white: #fff;
$border: lightgrey;

.login-container {
    border: 1px solid $border;
    background-color: $primary-white;
    margin: 40px auto 0;
}

.login-input {
    display: block;
    box-sizing: border-box;
    border: 1px solid $border;
    border-radius: 3px;
    box-shadow: 0 1px $primary-white;
}


Nesting

Unlike HTML, CSS doesn't have a hierarchy. However, Sass lets you nest your CSS selectors in a way that HTML does.

//CSS
.login-container {
    border: 1px solid lightgrey;
    background-color: #fff;
    margin: 40px auto 0;
}

.login-container h1 {
    text-align: center;
    margin: 50px 0 50px 0;
    background-color: #fff;
}

//Sass
$primary-white: #fff;
$border: lightgrey;

.login-container {
    border: 1px solid $border;
    background-color: $primary-white;
    margin: 40px auto 0;
   h1 {
       text-align: center;
       margin: 50px 0 50px 0;
       background-color: $primary-white;
   }
}


Mixins

Mixins let you make groups of CSS declarations that you want to reuse throughout your page. To create a mixin, use @mixin directive and give it a name. You can also pass in values to make your mixing more flexible. After you create the mixin, use it as a CSS declaration starting with @include followed by the name of the mixin.

//CSS
.info {
  background: DarkGray;
  box-shadow: 0 0 1px rgba(169, 169, 169, 0.25);
  color: #fff;
}

.alert {
  background: DarkRed;
  box-shadow: 0 0 1px rgba(139, 0, 0, 0.25);
  color: #fff;
}

.success {
  background: DarkGreen;
  box-shadow: 0 0 1px rgba(0, 100, 0, 0.25);
  color: #fff;
}

//Sass
@mixin theme($theme: DarkGray) {
  background: $theme;
  box-shadow: 0 0 1px rgba($theme, .25);
  color: #fff;
}

.info {
  @include theme;
}
.alert {
  @include theme($theme: DarkRed);
}
.success {
  @include theme($theme: DarkGreen);
}


Operators

Sometimes you want to do math in your css. Sass offers various math operators such as +, -, *, %, and math.div(). Operations in Sass can help us doing like take pixel values and convert them to percentages easily.

//CSS
.container {
  display: flex;
}

article[role="main"] {
  width: 62.5%;
}

aside[role="complementary"] {
  width: 31.25%;
  margin-left: auto;
}

//Sass
@use "sass:math";

.container {
  display: flex;
}

article[role="main"] {
  width: math.div(600px, 960px) * 100%;
}

aside[role="complementary"] {
  width: math.div(300px, 960px) * 100%;
  margin-left: auto;
}


Reference
https://sass-lang.com/guide

J

Thank you! This is exactly what I was looking for

More from this blog

[Kream 클론 프로젝트] 상품 더보기 기능

목표 offset/limit parameter를 사용한 상품 더보기 기능 구현 과정 1. 상품 더보기 기능 상품 목록 하단의 더보기 버튼을 누를 때마다 상품을 8개씩 더 로딩해오는 기능을 구현하기위해 예전에 배웠던 query parameter와 offset/limit 개념을 활용했다. offset과 limit을 설정해두면 데이터 요청 후 받아온 결과값에 순서를 부여해서 offset부터 limit까지의 데이터만 보여줄 수 있도록 페이징 처리...

Jul 22, 2022

[Kream 클론 프로젝트] 상품 검색 & 정렬 기능

목표 상품의 검색과 옵션별 정렬이 가능한 상품 목록 페이지 구현 과정 1. 상품 목록(메인) 페이지 UI 1) Kream이 상품 거래 사이트이다보니 각 상품마다 동일하게 반복되는 양식들이 많았는데, 이 부분들을 전부 컴포넌트로 만들고 재사용함으로써 코드의 길이를 많이 줄일 수 있었다. 특히 2차 프로젝트에서는 styled components를 사용하면서 각 페이지마다 js파일의 코드 양이 두배로 많아지는 바람에 한번 작성하고나면 알아보기가...

Jul 22, 2022

[Lululemon 클론 프로젝트] 장바구니 페이지

목표 상품 추가 / 삭제 / 수량 변경이 가능한 장바구니 페이지 구현 과정 1. 상품 데이터 받아오기 1) 사용자가 장바구니에 넣은 상품들의 목록을 렌더링하기위해 fetch 함수로 서버에서 데이터를 받아온 후 'itemList' 변수에 저장해두었다 . 2) 사용자를 식별한 다음 그에 맞는 데이터를 불러와야하기때문에 request header에 로그인시 발급했던 토큰 인가 과정을 추가했다. 코드🔻 const Bag = () => { co...

Jun 11, 2022

[Lululemon 클론 프로젝트] 로그인/회원가입 페이지

목표 JWT 인증방식을 활용한 로그인/회원가입 페이지 구현 과정 1. 로그인/회원가입 페이지 UI 1) lululemon의 사이트는 로그인 페이지에서 회원가입 버튼 클릭시 양식이 슬라이드로 올라와 한 페이지에서 로그인과 회원가입을 모두 진행할 수 있는 방식으로 되어 있었다. 이를 구현하기 위해 로그인 양식과 회원가입 양식을 각각 컴포넌트로 만든 뒤 'modal' 변수의 상태값이 true인지 false인지에 따라 적절한 컴포넌트가 렌더링될 수 ...

Jun 11, 2022

Rey's Blog

49 posts