일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 이웅모
- 쏙쏙 들어오는 함수형코딩
- 클린코드다시읽기
- 출처 : 자바스크립트 딥다이브
- 쏙쏙 들어오는 함수형 코딩
- 에릭 노이먼
- 큰돌의 CS책
- 갈길이 멀구나
- 에릭노이먼
- 나는 flux좋아...
- 리엑트를 다루는 기술
- 자바스크립트 딥다이브
- 에릭 노먼드
- 출처 : 한입크기로 잘라먹는 타입스크립트
- 출처는 코딩앙마
- 쏙쏙들어오는함수형코딩
- 오종택개발자님
- 출처는 코딩애플
- 출처 : 코딩앙마
- 쏙속 들어오는 함수형코딩
- 로버트 C마틴
- 출처 : 코딩애플
- 함수형 코딩
- 흥달쌤
- 고등애플
- 김영한쌤
- https://product.kyobobook.co.kr/detail/S000001952246
- 출처 : https://www.boostcourse.org/
- 유틸리티타입은 공식문서 자주 보자
- 생코님Redux
- Today
- Total
흰둥씨의 개발장
[오늘의 CSS] live sass compiler 초기 setting과 SCSS 문법 정리 본문
Sass
(Syntactically Awesome StyleSheet)
개발의 효율을 높이기 위한 CSS pre-processor(전처리기)
=> nesting작성이 가능하여 css보다 편리하고, 함수 등의 기능을 사용할수 있다.
다만, 브라우저는 Sass의 문법을 알지 못하기 때문에 Sass(.scss) 파일=> .css 파일로 트랜스파일링(컴파일)이 필요함
초기 설정 방법
웹팩이나 리액트, 뷰를 사용하지 않는 경우,
1. node.js 환경에서
npm install -g node-sass
$ node-sass scss/main.scss public/main.css //$ node-sass [옵션] <입력파일경로> [출력파일경로]
$ node-sass --watch scss/main.scss public/main.css // 변환 내용 실시간 확인
$ sass --version
2. vscode 환경에서
- Live Sass Compiler 설치
- settings.json 열어서 추추가
{
"liveSassCompile.settings.generateMap": false, //map 파일 및 주석 생기지 않게 처리하기
"liveSassCompile.settings.formats": [
{
"format": "expanded",
"extensionName": ".css",
"savePath": "~/../css/", // 저장경로. null 설정시 scss와 같은 폴더에 저장
}
]
}
문법
1. 주석 처리 방식
// 컴파일되지 않는 주석 css에 흔적없음
/* 컴파일되는 주석 css에 흔적남김 */
2. 변수(Variable)
반복적으로 사용되는 값을 변수로 지정 가능
기본작성 방식 : $변수명
변수는 선언된 블록{}안에서만 유효함 ; 만약 블록 안에서 선언된 변수를 전역으로 쓰고싶다면, !global 쓰기
!default 는 변수가 재할당되더라도 초기에 선언된 값으로 처리됨 (=> 현재 설정하는 변수의 값은 사용하지 않겠다는 뜻으로 씀)
$color1: #111; //전역변수
.box {$color2: #222; !global;//전역변수
$color3 : #333; //로컬변수
$color1 : red !default;
border : 1px solid $color1; // red안되고 #111로 처리됨
}
< 변수 종류 >
숫자Numbers,
문자열Strings,
색상Colors : blue, #FFFF00, rgba(255,0,0,.5)
Booleans : true, false
Nulls : null(의도적인 값 없음). 속성 값으로 사용 시 컴파일 안됨
Lists : 공백이나 ,로 구분된 값의 목록
Maps : (Key: Value)
$boolean: true;
$string: hello;
$color: red;
$number: 720;
$list: red, orange, yellow, green, blue;
$map: (
l: light,
d: dark,
);
$font-stack: '맑은 고딕', sans-serif;
$primary-color: #333;
body {
font-family: $font-stack;
color: $primary-color;
}
$family: unquote("Droid+Sans"); //unquote는 따옴표제거 함수
@import url("http://fonts.googleapis.com/css?family=#{$family}");
3. 중첩(Nesting)
.class {
padding: 3% 0px;
width: 100%;
color: $primary-color;
li {
list-style:none;
}
&:hover { // a:hover
color: white;
background-color: $color;
}
&-small { // .class-small
font-size: 12px;
}
}
4. Import & Extend
@import 다른 scss 파일 불러오기
@extend 특정 선택자 속성 상속 받기
@import "layout.scss";
@import "layout"; // 확장자 생략 가능
@import "header", "footer"; // 여러 scss 파일 불러오기
. css 파일로 임포트 되는 상황
파일 확장자가 .css일 때
파일 이름이 http://로 시작하는 경우
url()이 붙었을 경우
미디어쿼리가 있는 경우
@import "hello.css";
@import "http://hello.com/hello";
@import url(hello);
@import "hello" screen;
// common.scss
// colors
$color1: #ed5b46;
$color2: #f26671;
$color3: #f28585;
$color4: #feac97;
// Size Section
$borderRadius: 5px;
// default Tags
button {
cursor: pointer;
color: $color1;
background-color: $color2;
border-radius: $borderRadius;
border: 0px;
&:hover {
color: $color2;
background-color: $color1;
}
}
div {
padding: 5px;
border-radius: $borderRadius;
border: $color3 1px solid;
}
// style.scss
@import "common.scss";
.login_box {
height: 100%;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
div {
border: 0px;
}
.box {
background-color: $color4;
width: 700px;
height: 400px;
padding: 10px;
display: flex;
justify-content: space-between;
}
}
5. 믹스인(Mixins)
공통적으로 쓰이는 css 속성들을 묶어서 재사용이 가능하게 하는 기능
선언 @mixin
사용 @include
/* 선언 - @mixin */
@mixin large-text {
font: {
size: 22px;
weight: bold;
family: sans-serif;
}
color: orange;
&::after {
content: "!!";
}
span.icon {
background: url("/images/icon.png");
}
}
/* 사용 - @include */
h1 {
@include large-text;
}
div {
@include large-text;
}
매개변수(인수)를 가지는 mixin
@mixin 믹스인이름($매개변수) { 스타일; }
@include 믹스인이름(인수);
@content 를 추가로 작성하면 include할때 추가로 스타일을 작성할수 있음
@mixin 믹스인이름($매개변수) { 스타일; @content; }
태그명 { @include 믹스인이름(인수) {position: absolute; }; }
@extend를 사용하면 다른 선택자에 적용한 스타일을 그대로 복붙할수있음
//매개변수(인수)를 배우자
//scss
@mixin dash-line($width: 1px, $color) { // ()안에서 매개변수의 초기값 할당도 가능하고 인수값 없으면 초기값으로 적용
border: $width dashed $color;
}
.box1 { @include dash-line(4px, red); }
.box2 { @include dash-line(blue); }
// css
.box1 {
border: 4px dashed red;
}
.box2 {
border: 1px dashed blue;
}
//@content를 배우자
//scss
@mixin 여기에이름($url) {
&::after {
content: $url;
@content;
}
}
.box1 {
// 여기에이름의 기본기능만 사용
@include icon("/images/icon.png");
}
.box2 {
// 여기에이름의 기본기능에 추가로 스타일작성하여 사용
@include icon("/images/icon.png") {
position: absolute;
};
}
//css
.box1::after {
content: "/images/icon.png";
}
.box2::after {
content: "/images/icon.png";
position: absolute;
}
//@extend 를 배우자
//scss
.icon1{ color:red; }
.icon2{ //여기에 icon1에서 쓴 스타일을 복붙하고싶다!하면 요로코롬
@extend icon1;
padding:10px;
}
//css
.icon1, icon2 { color:red; }
.icon2{ padding:10px; }
extend를 애써 배웠찌만, extend가 컴파일 되었을때는 생각하지 않은 방향으로 전개될 수 있어 사용을 권장하지 않으며,
mixin을 적극 권장한다고 합니다.
6. 연산자(Operators)
+, - 연산시에는 단위 통일
나누기 연산시에는 괄호로 묶어서 사용
width: 50% - 20px; /* 단위 모순 에러(Incompatible units error) */
width: calc(50% - 20px); /* 연산 가능 */
7. 내장함수
모든 내장함수를 볼수있는 곳 https://sass-lang.com/documentation/modules
색상(RGB / HSL / Opacity) 함수
mix($color1, $color2) : 두 개의 색을 섞습니다.
lighten($color, $amount) : 더 밝은색을 만듭니다.
darken($color, $amount) : 더 어두운색을 만듭니다.
saturate($color, $amount) : 색상의 채도를 올립니다.
desaturate($color, $amount) : 색상의 채도를 낮춥니다.
grayscale($color) : 색상을 회색으로 변환합니다.
invert($color) : 색상을 반전시킵니다.
rgba($color, $alpha) : 색상의 투명도를 변경합니다.
opacify($color, $amount) / fade-in($color, $amount) : 색상을 더 불투명하게 만듭니다.
transparentize($color, $amount) / fade-out($color, $amount) : 색상을 더 투명하게 만듭니다.
문자(String) 함수
unquote($string) : 문자에서 따옴표를 제거합니다.
quote($string) : 문자에 따옴표를 추가합니다.
str-insert($string, $insert, $index) : 문자의 index번째에 특정 문자를 삽입합니다.
str-index($string, $substring) : 문자에서 특정 문자의 첫 index를 반환합니다.
str-slice($string, $start-at, [$end-at]) : 문자에서 특정 문자(몇 번째 글자부터 몇 번째 글자까지)를 추출합니다.
to-upper-case($string) : 문자를 대문자를 변환합니다.
to-lower-case($string) : 문자를 소문자로 변환합니다.
숫자(Number) 함수
percentage($number) : 숫자(단위 무시)를 백분율로 변환합니다.
round($number) : 정수로 반올림합니다.
ceil($number) : 정수로 올림합니다.
floor($number) : 정수로 내림(버림)합니다.
abs($number) : 숫자의 절대 값을 반환합니다.
min($numbers…) : 숫자 중 최소 값을 찾습니다.
max($numbers…) : 숫자 중 최대 값을 찾습니다.
random() : 0 부터 1 사이의 난수를 반환합니다.
List 함수
모든 List 내장 함수는 기존 List 데이터를 갱신하지 않고 새 List 데이터를 반환합니다.
모든 List 내장 함수는 Map 데이터에서도 사용할 수 있습니다.
length($list) : List의 개수를 반환합니다.
nth($list, $n) : List에서 n번째 값을 반환합니다.
set-nth($list, $n, $value) : List에서 n번째 값을 다른 값으로 변경합니다.
join($list1, $list2, [$separator]) : 두 개의 List를 하나로 결합합니다.
zip($lists…) : 여러 List들을 하나의 다차원 List로 결합합니다.
index($list, $value) : List에서 특정 값의 index를 반환합니다.
Map 함수
모든 Map 내장 함수는 기존 Map 데이터를 갱신하지 않고 새 Map 데이터를 반환합니다.
map-get($map, $key) : Map에서 특정 key의 value를 반환합니다.
map-merge($map1, $map2) : 두 개의 Map을 병합하여 새로운 Map를 만듭니다.
map-keys($map) : Map에서 모든 key를 List로 반환합니다.
map-values($map) : Map에서 모든 value를 List로 반환합니다.
관리(Introspection) 함수
variable-exists(name) : 변수가 현재 범위에 존재하는지 여부를 반환합니다.(인수는 $없이 변수의 이름만 사용합니다.)
unit($number) : 숫자의 단위를 반환합니다.
unitless($number) : 숫자에 단위가 있는지 여부를 반환합니다.
comparable($number1, $number) : 두 개의 숫자가 연산 가능한지 여부를 반환합니다.
Numbers: 숫자에 단위가 있거나 없습니다.
Strings: 문자에 따옴표가 있거나 없습니다.
Nulls: 속성값으로 null이 사용되면 컴파일하지 않음
Lists: ()를 붙이거나 붙이지 않기
Maps: ()를 꼭 붙여야 합니다.
8. @at-root (중첩 벗어나기) 와 속성 중첩작성
margin-top, margin-left, margin-right와 같이 겹치는 부분을 아래와 같이 작성할수있다.
article{
margin: {
top: 10px; //margin-top
left: 20px;
};
@at-root .box { // article과 형제관계인 .box에게 처리됨
width: 100px;
height: 200px;
}
}
9. IF문작성시 논리연산자 사용가능
&& 역할 = and / || 역할 = or / !의 역할 = not
$width: 90px;
div {
@if not ($width > 100px) { // 변수가 100px보다 크지 않으면
height: 300px; //적용됨
}
}
10. 커스텀 함수 만들기
mixin과 유사하지만, mixin은 스타일을 반환하고,
함수는 연산된 값을 반환한다.
// mixin
@mixin 믹스인이름($매개변수) {
스타일;
}
//mixin사용
@include 믹스인이름(인수);
// function
@function 함수이름($매개변수) {
@return 값
}
// functions 사용
함수이름(인수)
함수
//scss
$max-width: 980px;
@function columns($number: 1, $columns: 12) {
@return $max-width * ($number / $columns)
}
.box_group {
width: $max-width;
.box1 {
width: columns(); // 1
}
.box2 {
width: columns(8);
}
.box3 {
width: columns(3);
}
}
//css
.box_group {
/* 변수그대로 대입 */
width: 980px;
}
.box_group .box1 {
/* 인수1만처리되고 기본값적용 */
width: 81.66667px;
}
.box_group .box2 {
width: 653.33333px;
}
.box_group .box3 {
width: 245px;
}
11. if 구문사용하기
조건이 참이면 실행문1 이 적용되고, 조건이 거짓이면 실행문2가 적용됩니다.
if(조건, 실행문1, 실행문2)
//scss
$width: 555px;
.box {
width: if($width > 300px, $width, null);
}
//css
.box{ width:555px; }
@if로 작성하기
// @if
@if (조건) {
/* 조건이 참일 때 실행문 */
}
// @if @else
@if (조건) {
/* 조건이 참일 때 실행문 */
} @else {
/* 조건이 거짓일 때 실행문 */
}
// @if @else if @else
@if (조건1) {
/* 조건1이 참일 때 실행문 */
} @else if (조건2) {
/* 조건2가 참일 때 실행문 */
} @else {
/* 모두 거짓일 때 실행문 */
}
//scss
$color: orange;
div {
@if $color == strawberry {
color: beige;
} @else if $color == orange {
color: red;
} @else if $color == banana {
color: lightblue;
} @else {
color: teal;
}
}
//css
div { color: red; }
12. @for 사용
for문하고 유사합니다.
through를 이용하거나 , to 를 이용하는 방식으로 나뉩니다.
// through
// 종료 만큼 반복
@for $변수 from 시작 through 종료 {
// 반복 내용
}
// to
// 종료 직전까지 반복
@for $변수 from 시작 to 종료 {
// 반복 내용
}
//scss
// 1부터 3번 반복
@for $i from 1 through 3 {
.through:nth-child(#{$i}) {
width : 20px * $i
}
}
// 1부터 3 직전까지만 반복(1, 2까지만 반복됨)
@for $i from 1 to 3 {
.to:nth-child(#{$i}) {
width : 20px * $i
}
}
//css
.through:nth-child(1) { width: 20px; }
.through:nth-child(2) { width: 40px; }
.through:nth-child(3) { width: 60px; }
.to:nth-child(1) { width: 20px; }
.to:nth-child(2) { width: 40px; }
13. @each 사용
For-in문과 유사합니다.
//scss
// List Data
$fruits: (apple, orange, banana, mango);
.fruits {
@each $fruit in $fruits {
li.#{$fruit} {
background: url("/images/#{$fruit}.png");
}
}
}
//css
.fruits li.apple {
background: url("/images/apple.png");
}
.fruits li.orange {
background: url("/images/orange.png");
}
.fruits li.banana {
background: url("/images/banana.png");
}
.fruits li.mango {
background: url("/images/mango.png");
}
//index()내장함수 사용한 scss
$fruits: (apple, orange, banana, mango);
.fruits {
@each $fruit in $fruits {
$i: index($fruits, $fruit);
li:nth-child(#{$i}) {
left: 50px * $i;
}
}
}
//index()내장함수 사용한 css
.fruits li:nth-child(1) {
left: 50px;
}
.fruits li:nth-child(2) {
left: 100px;
}
.fruits li:nth-child(3) {
left: 150px;
}
.fruits li:nth-child(4) {
left: 200px;
}
//변수가 담고 있는 값이 1개 이상일 경우 scss
$apple: (apple, korea);
$orange: (orange, china);
$banana: (banana, japan);
@each $fruit, $country in $apple, $orange, $banana {
.box-#{$fruit} {
background: url("/images/#{$country}.png");
}
}
//변수가 담고 있는 값이 1개 이상일 경우 css
.box-apple {
background: url("/images/korea.png");
}
.box-orange {
background: url("/images/china.png");
}
.box-banana {
background: url("/images/japan.png");
}
// 키 : 값 형태로 작성된 데이터를 반복할때
@each $key변수, $value변수 in 데이터 {
// 반복 내용
}
//scss
$fruits-data: (
apple: korea,
orange: china,
banana: japan
);
@each $fruit, $country in $fruits-data {
.box-#{$fruit} {
background: url("/images/#{$country}.png");
}
}
//css
.box-apple {
background: url("/images/korea.png");
}
.box-orange {
background: url("/images/china.png");
}
.box-banana {
background: url("/images/japan.png");
}
14. @while
while문과 유사합니다.
@while은 조건이 false로 평가될 때까지 내용을 반복합니다.
다만, 잘못된 조건으로 무한루프에 빠질수있어서 사용을 권장하지 않습니다.
@while 조건 {
// 반복 내용
}
//scss
$i: 6;
@while $i > 0 {
.item-#{$i} {
width: 2px * $i;
}
$i: $i - 2;
}
//css
.item-6 { width: 12px; }
.item-4 { width: 8px; }
.item-2 { width: 4px; }
초기 설정은 학원 강의 정리
scss정리는 아래 글을 읽고 정리한 내용입니다.
출처 )
https://heropy.blog/2018/01/31/sass/
'[오늘의 공부] > html&CSS' 카테고리의 다른 글
[오늘의 HTML] anchor 태그에 block 요소를 넣어도 되는가 (0) | 2023.02.04 |
---|