#
7-조건문과 반복문
#
목차
1. @if 1.1. 기본문법 1.2. ex 1.2.1. 준비작업 1.2.2. if 작성 1.2.3. Vanilla JS 1.2.4. jQuery
2. @for 2.1. 기본문법 2.2. ex-갤러리
3. @each 3.1. 기본문법 3.2. ex
#
1. @if
#
1.1. 기본문법
조건에 따라 스타일을 주고자 할 때, if와 else문을 사용한다. 상황에 따라 if 만 쓰거나 else, else if 를 사용할수 있다. 조건에는 논리 연산자 and, or, not을 사용한다.
@if (조건) {
// 조건이 참일 때 실행될 구문
}
#
1.2. ex
조건문을 사용하여 컬러테마를 만들어보자
#
1.2.1. 준비작업
partial.scss 파일의 @import 를 제외한 코드를 복사한후 새 문서를 생성하여 붙여 넣는다. 새 문서는 layout/_layout.scss 로 저장한다.
layout/_layout.scss
header {
@extend %padding;
@include flexDirectJustiAlign(row, space-between, center);
h1 {
@include fontSizeBgColor(2rem, #6ffaff, #0c08ff);
}
nav ul {
@include flexDirectJustiAlign(row, space-between, center);
& > li {
width: $col1;
}
}
}
main {
@extend %padding;
}
.section1 {
&-box {
@extend %boxshadow;
width: $col1 * 10;
margin: auto;
@include flexDirectJustiAlign();
}
&-item {
flex: 1 1 0;
@include flexDirectJustiAlign(column);
@include fontSizeBgColor(2rem, #d8d8d8, $color-red);
@extend %padding;
span:nth-child(1) {
@extend %colorSize;
}
}
}
mixin/_theme.scss 파일을 생성한다.
mixin/_theme.scss
//@if
root 폴더에 style.scss 파일을 생성한다.
모듈화된 scss 파일을 모두 임포트 한다.
style.scss
@import 'base/base';
@import 'mixin/mixin';
@import 'mixin/extend';
@import 'layout/layout';
@import 'mixin/theme';
#
1.2.2. if 작성
mixin/theme.scss
파일작성
mixin/theme.scss
@mixin textAndBgColor($textColor, $bgColor) {
color: $textColor;
background-color: $bgColor;
}
@mixin theme($mood) {
@if $mood == 'light' {
@include textAndBgColor(#333, #fff);
} @else if $mood == 'dark' {
@include textAndBgColor(#fff, #000);
} @else {
@include textAndBgColor(#f00, #aaa);
}
}
//body에 light 기본 적용
body {
@include theme('light');
}
//.dark-theme가 추가되면 mixin함수로 'dark' 전달
.dark-theme {
@include theme('dark');
}
//.mid-theme가 추가되면 mixin함수로 'dark' 전달
.mid-theme {
@include theme('mid');
}
#
1.2.3. Vanilla JS
seclect의 선택값에 따라 테마를 변경해보자
<script src="./js/theme.js" defer></script>
</head>
js/theme.js
let theme = document.querySelector('#theme');
console.log(theme);
theme.addEventListener('change', function (e) {
let val = this.options[this.selectedIndex].value;
switchTheme(val);
});
function switchTheme(theme) {
document.body.classList.remove('dark-theme');
document.body.classList.remove('mid-theme');
document.body.classList.remove('light-theme');
if (theme === 'dark') {
document.body.classList.add('dark-theme');
} else if (theme === 'mid') {
document.body.classList.add('mid-theme');
} else {
document.body.classList.add('light-theme');
}
}
위의 함수는 아래처럼 줄일수 있다.
const classList = ['dark-theme', 'mid-theme', 'light-theme'];
classList.forEach((el) => {
document.body.classList.remove(el);
});
#
1.2.4. jQuery
- 코어파일을 로드한다
<script src='https://code.jquery.com/jquery-3.7.1.min.js'></script>
let theme = $('#theme');
theme.on('change', function () {
let val = $(this).find('option:selected').val();
console.log(val);
switchTheme(val);
});
function switchTheme(theme) {
const body = $('body');
body.removeClass('dark-theme mid-theme light-theme');
if (theme === 'dark') {
body.addClass('dark-theme');
} else if (theme === 'mid') {
body.addClass('mid-theme');
} else {
body.addClass('light-theme');
}
}
#
2. @for
@for은 지정횟수 만큼 코드를 반복실행함
@for문에
from >
through <
키워드로 반복할 횟수를 지정한다.
#
2.1. 기본문법
for ($변수) from (시작) through(끝){
// 반복할 내용
}
#
2.2. ex-갤러리
이미지 반복하여 채우기
url 함수의 인자로 변수를 사용할 때는 중괄호
{}
를 사용한다style.scss 파일에 임포트 한다.
layout/_gallery.scss
$img_path: 'https://qwerew.cafe24.com/images/';
.photo_box {
$color: (#3f51b5, #c5e1a5, #cfd8dc) !global;
@include flexDirectJustiAlign() {
gap: $col1;
}
background-color: nth($color, 1);
@for $i from 1 through 5 {
& li:nth-child(#{$i}) {
background: url('#{$img_path}#{$i}.jpg') no-repeat;
background-size: cover;
width: $i * 20px;
height: $col1;
}
}
}
nav {
background-color: nth($color, 1);
a{color:nth($color,3)}
}
list 의 사용 여러개의 값을 배열로 저장하고 인덱스로 적용
!global
키워드는 전역변수가 된다.
layout/_gallery.scss
//지역변수 color 의 값이 전역으로 변경될경우 다른 전역변수와의 충돌방지코드
$color: null;
body{background-color: nth($color, 2);}
.photo_box {
//지역변수의 전역변경
$color: (#3f51b5, #c5e1a5, #cfd8dc, #3fb5a7, #76b53f) !global;
@include flexDirectJustiAlign() {
gap: $col1;
}
background-color: nth($color, 1);
}
#
3. @each
lists 나 맵의 각각 요소마다 스타일을 순회적용함
#
3.1. 기본문법
@each ($변수) in (리스트|맵){
//실행문
}
#
3.2. ex
<section>
<h2>Gallery</h2>
<ul class="photo_box">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<ul class="banners">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<div class="palette">
<span></span><span></span><span></span><span></span><span></span>
</div>
</section>
$size: 10, 20, 30, 40, 50;
$array: (
1: 'https://qwerew.cafe24.com/images/5.jpg',
2: 'https://qwerew.cafe24.com/images/6.jpg',
3: 'https://qwerew.cafe24.com/images/7.jpg',
);
@each $i, $name in $array {
.banners li:nth-of-type(#{$i}) {
background: url('#{$name}') 0 0 / cover no-repeat;
//나누기는 calc 함수사용
width: calc(nth($size, 1) * 10% / 4);
height: nth($size, 1) * 10%;
}
}
.banners {
@include flexDirectJustiAlign() {
justify-content: space-between;
}
width: nth($size, 3) * 30px;
height: nth($size, 2) * 20px;
}
.palette {
@include flexDirectJustiAlign() {
justify-content: space-between;
gap: nth($size, 1) * 1px;
}
span {
border-radius: 50%;
width: nth($size, 1) * 3px;
height: nth($size, 1) * 3px;
}
}
@each $name in $color {
$i: index($color, $name);
.palette span:nth-child(#{$i}) {
background-color: #{$name};
}
}