반응형

transition 은 css3에 추가된 속성으로 ie10 이상부터 사용이 가능하다.

 

명시적으로 원하는 영역에 어떤 속성을 움직이게 할지,

언제 애니메이션을 시작하게 할지, 얼마나 애니메이션을 지속할지,

그리고 어떻게 애니메이션을 실행할지에 대한 값을 지정하는 속성이다.

 

속성 설명
transition

transition 속성을 사용하는 축약형으로, 순서대로 작성시

transition: property || duration || timing-function || delay

순서로 작성하게 된다.

transition-property transition 효과를 줄 css 속성을 설정한다.
transition-duration transition 효과가 지속될 시간을 설정한다.
transition-timing-function transition 효과가 실행될 때의 효과를 설정한다. (easing)
transition-delay transition 효과를 시작하기 전까지의 대기 시간을 설정한다.

 

1. transition-property

원하는 css 속성에 transition 효과를 지정할 수 있고

지정한 css 속성만이 transition 효과를 가질 수 있다.

<style>
   .box{margin-bottom:8px; width:50px; height:50px; background:skyblue;}
   .box1{transition-property:all;}   /* 모든 css 속성(all)에 transition을 적용한다. */
   .box2{transition-property:width;}   /* width 속성에만 적용 */
   .box3{transition-property:width, height;}  /* width, height 속성에 적용 */
</style>
<body>
   <div class="box box1"></div>
   <div class="box box2"></div>
   <div class="box box3"></div>
</body>

 

2. transition-duration

transition 효과의 지속 시간을 정한다.

<style>
   .box{
     margin-bottom:8px;
     width:50px;
     height:50px;
     background:skyblue;
     transition-duration:0.5s;  /* transition 효과를 2초 동안 지속 */
   }
   .box1{transition-property:all;}
   .box2{transition-property:width;}
   .box3{transition-property:width, height;}
</style>
<body>
   <div class="box box1"></div>
   <div class="box box2"></div>
   <div class="box box3"></div>
</body>

 

3. transition-timing-function

transition 효과가 일어나는 효과를 줄 수 있다.

기본 값은 ease 효과이고

linear, steps, ease-in, ease-out

그리고 cubic-bezier(n,n,n,n)을 이용해서 원하는 효과를 만들 수도 있다.

<style>
   .box{
     margin-bottom:8px;
     width:50px;
     height:50px;
     background:skyblue;
     transition-duration:0.5s;
   }
   /* 기본 효과인 ease */
   .box1{
     transition-property:all;
   }
   /* ease-in 효과 */
   .box2{
     transition-property:width;
     transition-timing-function:ease-in;
   }
   /* steps 효과 */
   .box3{
     transition-property:width, height;
     transition-timing-function:steps(4, end);
   }
</style>
<body>
   <div class="box box1"></div>
   <div class="box box2"></div>
   <div class="box box3"></div>
</body>

 

4. transition-delay

transition 효과가 일어나기 전 대기 시간을 정한다.

<style>
   .box{
     margin-bottom:8px;
     width:50px;
     height:50px;
     background:skyblue;
     transition-duration:0.5s;
   }
   .box1{
     transition-property:all;
     transition-delay:0.5s;
   }
   .box2{
     transition-property:width;
     transition-timing-function:ease-in;
     transition-delay:0.3s;
   }
   /* transition-delay값 미입력시 delay없음 */
   .box3{
     transition-property:width, height;
     transition-timing-function:steps(4, end);
   }
   
   /* transition 확인을 위한 hover시 효과 적용 */
   .box:hover{width:100px; height:100px; background:red;}
</style>
<body>
   <div class="box box1"></div>
   <div class="box box2"></div>
   <div class="box box3"></div>
</body>

 

위에서 배운 transition 효과를 적용한 화면을 보자면 아래와 같다.

 

첫 번째 상자는 delay가 0.5초가량 된 후 width, height, background의 transition 효과가 적용이되고

 

두 번째 상자는 width값만 ease-is의 효과를 가지며 transition이 적용된다.

 

세 번째 상자는 width, height 값이 steps 효과를 가지며 transition이 적용된다.

 

 

 

 

 

 

 

반응형
반응형

모바일 UI개발을 하다보면

아이폰5 기준(320px)으로 작업을 하게되는 경우

보통 디자인 파일은 320px의 2배인 640px로 받아서 작업을 진행하게 된다.

 

단순히 2배 혹은 3배의 이미지를 받아오기 위해

원래의 화면 크기보다 큰 디자인으로 받아서 작업을 한다는 생각을 해보기 전

 

해상도에 대해 알아볼 필요가 있다.

 

1. 고밀도 해상도

모바일 뿐만 아니라 태블릿, 데스크탑까지 구분 없이 작은 크기의 영역(디바이스)에

높은 밀도의 해상도를 가진 화면을 말한다.

 

애플에서 사용한 레티나 디스플레이부터 보편화되기 시작하였다.

 

2. PPI란?

Pixel per inch의 약자로 1인치당 몇 개의 픽셀로 이뤄졌는지를 나타내는 밀도의 단위이다.

(ppi는 일반적인 디바이스나 화면에서, dpi는 인쇄물에서 주로 사용)

 

10PPI면 정사각형 한 면 (1inch, 2.54cm)10개의 픽셀이 있고

가로 세로 10px을 곱하게 되면 100px로 이루어져 있다는 뜻이 된다.

위의 이미지에서 살펴보면 10ppi 보다 20ppi가 훨씬 밀도가 높고

높은 해상도를 자랑하는 것을 볼 수 있다.

 

 

그리고 화면이 작은 기기일수록

더 높은 밀도의 해상도를 통해 선명한 화면을 구현한다.

 

3. 물리픽셀과 논리픽셀

고밀도 해상도의 간단한 예로 아이폰 4를 예시로 들자면

 

아이폰 4구현하는 해상도는 640*960 이고, (물리 픽셀)

CSS로 표현할 수 있는 값은 320*480이다. (논리 픽셀)

 

, CSS로 구현하는 화면은 320px이지만

실제 해상도는 640px2배의 밀도를 가지게 된다. (ratio 2)

 

만약 아이폰4에 디자인 작업을 할 때 320px의 디자인 파일을 받아서 작업을 하게 된다면,

640px의 해상도 화면에 320px의 디자인이 적용되기 때문에

이미지를 늘여 놓은 것과 같은 뿌연 화면이 나타나게 된다.

 

그렇기 때문에 우리가 모바일 작업을 할 때

물리 픽셀에 맞춘 디자인으로 작업을 하게 되는 것이다.

 

그리고 우리가 논리픽셀을 적용하기 위한 수단으로

우리는 meta태그의 viewport 속성을 이용한다.

<meta name=“viewport” content=“width=device-width”>

 

 

 

반응형

'Frontend > Web' 카테고리의 다른 글

크로스 브라우징이란?  (0) 2020.09.12
SEO(검색 엔진 최적화)란?  (0) 2020.04.21
브라우저 렌더링 성능 최적화  (2) 2020.04.16
XML과 HTML  (0) 2020.04.14
URI vs URL 비교  (0) 2020.04.10
반응형

SPA란 Single Page Application 의 약자로 

 

기존의 웹 페이지는 페이지 자체가 여러개 존재하고

원하는 정보가 있으면 새 데이터를 요청할 때 마다

전체 페이지가 다시 로드 되었다.

 

하지만 SPA를 사용하게 되면

맨 처음 로딩할 때 하나의 페이지를 불러오고

그 페이지에서 JSON/XML 등의 데이터를 동적으로 가져오는 형태로 페이지를 바꿔나간다.

 

즉, 새로고침이나 새로운 페이지를 부르지 않고

데이터를 가지고만 페이지를 운영한다.

 

 

1. SPA의 장점

그렇다면 왜 기존의 페이지를 불러오는 방식이 아닌

SPA 방식을 사용하는지 즉, 장점에 대한 생각을 해봐야한다.

 

1. 사용자가 페이지를 이용할 때의 속도가 빠르다. (반응성이 빠르다)

  : 초기 로딩에 데이터를 가져오기 때문에 로딩이 된 후에는 새로고침 없이 빠르게 페이지를 이용할 수 있다.

 

2. 화면에 필요한 데이터만 가져와서 렌더링 하기 때문에 효율적이다.

 

3. 신속한 개발이 가능

  : 단일 페이지 응용 프로그램 아키텍처가 분리되어 있기 때문에 프론트엔드와 백엔드 개발 서비스를 분리하여 작업할 수 있다. 그렇기 때문에 개발자는 독립적이고 신속하게 작업을 할 수 있다.

 

4. 캐싱 능력

  : 데이터에 대한 지속적인 액세스가 있기 때문에 캐싱 관리하기에 수월하다.

 

2. SPA의 단점

SPA가 장점만 갖고있는 것은 아니라

SPA를 사용했을 때의 단점도 몇 가지 있다.

 

1. 초기 로딩시에 데이터를 가져오는 문제로 초기 로딩 속도 저하의 문제가 발생할 수 있다.

 

2. 검색엔진최적화 (SEO)에 어려움이 있을 수 있다.

  : 스크립트 언어로 화면의 전환이 되기 때문에 검색엔진에서 크롤링 하기가 어렵다.

 

 

 

 


 

참고

https://www.excellentwebworld.com/what-is-a-single-page-application/

 

 

반응형

'Frontend > Vue.js' 카테고리의 다른 글

[vue 2 기초] 라우터  (1) 2023.11.06
[vue 2 기초] 컴포넌트 통신(props, event emit)  (1) 2023.11.04
[Vue 2 기초] 컴포넌트  (0) 2023.11.03
[Vue 2 기초] 인스턴스  (0) 2023.11.03
Vue.js 란?  (0) 2023.11.03
반응형

2020/04/09 - [Web] - 브라우저 렌더링

 

브라우저 렌더링에 대해서 알아본 후에

브라우저가 렌더링 되는 과정이 조금 더 빠르게 만들고

그로인해 사용자들의 편의성이나 페이지 유입을 늘리기 위해서

 

브라우저 렌더링을 최적화 하는 방법은 뭐가 있을지에 대해 알아보았다.

 

1. Reflow, Repainting

맨 처음 브라우저가 로딩될 때 렌더링 과정을 통해 화면이 그려진다.

그리고 그려진 화면은 자바스크립트에 의해 DOM 트리, CSSOM 트리가 변경될 때 재구성 된다.

 

DOM이 추가/삭제 되거나 DOM 요소에 높이, 너비, 위치 등의

기하학적 영향을 주는 CSS 내용이 변경될 경우에 렌더 트리가 재구성 되는데

이것을 Reflow(리플로우) 혹은 재배치라고 한다.

 

리플로우는 요소에 기하학적인 영향을 주는 CSS가 변경 되었을 때 발생하는데

반대로 기하학적 영향을 주지 않는 CSS 속성이 변경되었을 경우는 리플로우 과정을 건너뛰고

Paint 과정부터 수행한다. 이를 Repaint(리페인트)라고 한다.

 

리플로우가 일어나면 전체 픽셀을 다시 계산하는 과정을 거치기 때문에 부하가 크지만, 

리페인트는 재배치 과정을 건너뛰고 화면에 그리는 작업만 수행하기 때문에 부하가 적다.

 

* 리플로우가 되는 CSS 속성 : top, left, right, bottom, width, height, line-height, font-size 등
* 리플로우 건너뛰고 리페인트 되는 CSS 속성 : background-image, color, visibility, outline 등

- 참고
https://docs.google.com/spreadsheets/u/0/d/1Hvi0nu2wG3oQ51XRHtMv-A_ZlidnwUYwgQsPQUg1R2s/pub?single=true&gid=0&output=html

리플로우와 리페인팅이 일어나면 렌더링 시간이 늘어나게 된다.

그렇기 때문에 불필요한 리플로우와 리페인팅을 없애기 위해 신경써야한다.

 

2. 렌더링 최적화 (로딩 최적화)

위에서 살펴본바와 같이 

리플로우, 리페인팅으로 인한 초기 로딩 후에 렌더링 시간 지연이 있고

 

페이지에 진입했을 때 초기 로딩이 지연되는 경우가 있다.

 

이런 초기 로딩의 속도를 높이기 위해서 고려해야할 점들이 있다.

 

1. 블록 리소스 최적화

 

블록 리소스란 HTML이 파싱될 때 CSS나 자바스크립트로 인해 파싱이 중단되는 경우가 있다. 
이렇게 HTML의 파싱을 막는 CSS나 자바스크립트의 리소스를 블록 리소스라고 한다.

 

 css 최적화 

 

렌더 트리를 구성하기 위해서는 DOM 트리와 CSSOM 트리가 필요하다.

 

DOM 트리는 파싱 중에 태그를 발견할 때마다 순차적으로 구성을 하지만

CSSOM 트리는 CSS를 모두 해석해야 다음 순서로 넘어가게 된다.

 

즉, CSSOM 트리가 모두 해석되지 않고 구성되지 않으면 렌더트리를 끝까지 만들지 못하고

렌더링이 차단된다.

 

이러한 이유로 CSS를 렌더링 차단 리소스라고 하고

렌더링이 차단되지 않도록 CSS는 가능하면 항상 HTML문서 최상단인 <head> 태그 안쪽에 배치해야한다.

<html>
   <head>
      <link rel="stylesheet" href="style.css">
   </head>
</html>

그리고 외부 스타일 시트를 가져올 경우 @import 사용은 피하고

link 태그를 사용하여 CSS를 불러와서 CSS 로드 속도를 줄여야한다.

(@import 사용시 직렬 로드를 하기 때문에 속도가 느리다.)

2020/03/03 - [CSS] - CSS 적용을 위한 또 다른 방법, @import

 

또한, 특정한 경우에서만 사용하는 CSS를 넣을 경우

미디어 쿼리를 사용하여 CSS를 분리해서 필요할 때만 로드될 수 있도록 한다.

<link rel="stylesheet" href="main.css">
<!-- 인쇄할 경우 -->
<link rel="stylesheet" href="main_print.css" media="print">
<!-- 세로모드일 경우 -->
<link rel="stylesheet" href="main_portrait.css" media="orientation:portrait">

 

 자바스크립트 최적화 

 

자바스크립트는 DOM 트리와 CSSOM 트리를 동적으로 제어하고 변경할 수 있기 때문에

블록 리소스에 해당한다.

<script> 태그를 만나면 스크립트가 실행되고 해당 <script> 태그 이전에 생성된 DOM에만 접근이 가능하다.

그리고 스크립트가 실행될 동안에는 DOM 트리 생성은 중단된다. 

 

그렇기 때문에 <script> 태그는 모든 DOM 요소가 생성된 이후에 가져오는 것이

블록 리소스를 최소화하는 좋은 방법이다.

(HTML 문서 최 하단 </body> 태그 직전에 배치)

<body>
   <div>test</div>
   <p>test desc</p>
   
   <script type="text/javascript" src="src.js"></script>
</body>

 

2. 리소스 요청 수 줄이기

 

CSS, 자바스크립트, 이미지 등의 리소스는 서버 요청 후 다운로드 되어야 사용할 수 있다.

특히나 이미지 파일은 용량도 크고 무겁기 때문에 이미지 로드에 많은 시간이 소비된다.

 

그렇기 때문에 페이지 로드시 필요한 이미지만 요청해서 가져올 수 있도록 최적화를 해야한다.

 

 이미지 스프라이트 

 

여러개의 아이콘 파일을 필요한 페이지에 각각 로드를 하게 된다면

아이콘 파일의 수 만큼 이미지 리소스를 불러와야 할 것이다.

 

그렇기 때문에 사용 용도에 맞게 아이콘들을 하나의 이미지로 합쳐서 만드는

이미지 스프라이트를 사용하게되면 여러번 불러와야 할 이미지들을

한 번만 불러와서 이미지 요청을 최소화 할 수 있다.

 

예시) 각각 처리할 수 있는 sns 아이콘을 하나의 이미지 파일로 합쳐서 관리한다.

ic_sns.png 파일로 관리

/* background-position 값을 이용하여 이미지 위치 표현 */
.facebook{background:url(./ic_sns.png) -150px 0 no-repeat; width:150px; height:150px;}

 

3. 리소스 용량 줄이기

 

 중복되는 코드 줄이기 

 

자바스크립트에서 자주 사용하는 내용에 대해서 함수처리하여 

중복되는 내용을 최소화 한다.

 

 HTML 마크업 최적화 

 

HTML 태그의 중첩을 최소화 하고 (HTML의 depth가 깊어지면 렌더링 속도에 영향을 준다.)

공백 주석 등도 최소화 하여 작업한다.

 

불필요한 마크업 사용을 자제하여 DOM 트리가 커지는 것을 방지하는 것이 좋다.

 

 간결한 CSS 선택자 사용 

 

CSS 스타일을 적용할 때 반복되고 공통되는 스타일은 클래스를 사용하여

다른 선택자의 사용을 최소화 한다.

 

<수정 전>

<head>
   <style>
      .text01{padding:10px; font-size:13px; color:#ddd; font-weight:bold;}
      .text02{padding:10px; font-size:13px; color:#333; font-weight:bold;}
   </style>
</head>
<body>
   <p class="text01">test용 텍스트</p>
   <div>
      <p class="text02">안녕하세요 Olleh</p>
   </div>
</body>

 

<수정 후> - 공통되는 내용을 .text 클래스에 담아서 반복되는 css 스타일을 최소화 하였다.

<head>
   <style>
      .text{padding:10px; font-size:13px; font-weight:bold;}
      .text01{color:#ddd;}
      .text02{color:#333;}
   </style>
</head>
<body>
   <p class="text text01">test용 텍스트</p>
   <div>
      <p class="text text02">안녕하세요 Olleh</p>
   </div>
</body>

 

 display:none 속성 사용 

 

display:none 속성을 사용해서 요소를 숨겨버리면 DOM 트리에는 반영이 되지만 렌더트리에는 반영되지 않아서 리플로우나 리페인팅도 발생하지 않는다.

 

초기 로딩에서 css를 적용해서 렌더트리에 반영이 필요하지 않는 영역의 경우 display:none으로 숨겨서 노출을 하는 것도 로딩 속도 향상을 위한 방법 중에 하나이다.

(visibility:hidden 속성으로 숨긴 영역은 렌더트리 구성에 포함이 된다.)

 

 

 

 


 

** 참고 **

https://ui.toast.com/fe-guide/ko_PERFORMANCE/

 

성능 최적화

애플리케이션 성능 최적화는 앱과 웹에서 모두 중요하다. 최근 웹 애플리케이션은 Ajax 통신, 복잡한 UI 등 많은 기능을 담으면서 크고 무거워졌다. 무거워진 웹은 긴 로딩 시간 함께 사용자 경험에 안 좋은 영향을 끼친다. Pinterest는 긴 로딩 시간으로 인해 사용자가 페이지를 나가는 비율이 높았는데, 최적화를 통해 사용자 이탈률을 줄이고 매출은 40%로 증가시켰다. 이처럼 매출 실적과 연결될 정도로 웹 애플리케이션의 성능 최적화는 매우 중요하다.

ui.toast.com

 

 

반응형

'Frontend > Web' 카테고리의 다른 글

SEO(검색 엔진 최적화)란?  (0) 2020.04.21
웹해상도 (물리픽셀, 논리픽셀, 고밀도 해상도, PPI)  (0) 2020.04.21
XML과 HTML  (0) 2020.04.14
URI vs URL 비교  (0) 2020.04.10
브라우저 렌더링  (0) 2020.04.09
반응형

XML과 HTML을 비교하기에 앞서 XML의 특징을 확인해봐야 할 것이다.

 

1. XML이란

XML은 Extensible Markup Language 의 약자로 W3C 권고 범용 마크업 언어이다.

 

* XML의 특징

- XML은 다른 목적의 마크업 언어를 만드는데 사용되는 다목적 마크업 언어이다.

- XML은 다른 시스템끼리 다양한 종류의 데이터를 손쉽게 교환할 수 있도록 해준다.

- XML은 새로운 태그를 만들어 추가해도 계속해서 동작하므로 확장성이 좋다.

- XML은 데이터를 보여주지 않고 데이터를 전달하고 저장하는 것만을 목적으로 한다.

- XML은 텍스트 데이터 형식의 언어로 모든 XML 문서는 유니코드 문자로만 이루어진다.

- XML은 SGML을 기반으로 만들어졌다.

- XHTML, MathML, SVG, RSS, RDF 등이 XML을 기반으로 만들어 졌다.

 

2. XML과 HTML의 차이

2-1. HTML은 데이터의 표현에 목적, XML은 데이터 교환을 위한 구조 정의에 목적

앞서 살펴본 XML 특징 중 하나인 데이터를 전달하고 저장하는 것만을 목적으로 한다는 점에서

생각해본다면 HTML의 차이를 생각할 수 있다.

 

2-2. HTML은 정해진 태그의 틀이 있다면 XML은 사용자가 태그를 직접 정의해서 사용

HTML은 html태그 안에 head태그, body태그가 있고

head 태그안에 title태그, meta태그를 사용하는 등 각 태그가 미리 정해진 형식에 따라 사용하고

각 태그마다의 의미도 정해져 있다면

XML태그는 사용자가 직접 태그명을 만들어서 필요에 맞춰 사용한다.

<!-- HTML -->
<html>
   <head>
      <title>abcdqbbq의 Tistory</title>
      <meta charset="utf-8">
   </head>
   <body>
      <div>
         <h1>학생이름</h1>
         <p>주소</p>
         <span>나이</span>
      </div>
   </body>
</html>


<!-- XML -->
<student>
   <name>학생이름</name>
   <addr>주소</addr>
   <age>나이</age>
</student>

 

2-3. HTML은 웹 환경에서만 작동되는 언어, XML은 어떤 환경에도 구애 받지 않는 언어

HTML은 웹브라우저라는 환경에서만 사용할 수 있고

XML의 경우 다목적 마크업 언어이므로 특정 어플리케이션에 종속되지 않고 사용할 수 있다.

 

2-4. HTML은 데이터 + 데이터 표현, XML은 데이터만 갖고있는 언어

HTML은 가지고 있는 데이터를 웹브라우저 환경에서 표현하고 나타낼 수 있지만

XML은 가지고 있는 데이터를 전달하고 저장하는게 목적인 언어이기 때문에 

별도의 브라우저나 어플리케이션 환경에서 데이터를 표현하진 않는다.

 

 

 

 

 

 


 

 

참조 페이지

http://tcpschool.com/xml/xml_intro_basic

https://www.crocus.co.kr/1493

https://www.w3schools.com/xml/xml_whatis.asp 

 

반응형

'Frontend > Web' 카테고리의 다른 글

SEO(검색 엔진 최적화)란?  (0) 2020.04.21
웹해상도 (물리픽셀, 논리픽셀, 고밀도 해상도, PPI)  (0) 2020.04.21
브라우저 렌더링 성능 최적화  (2) 2020.04.16
URI vs URL 비교  (0) 2020.04.10
브라우저 렌더링  (0) 2020.04.09
반응형

작업을 하면서 URL이라는 얘기는 많이 들어봤지만

URI에 대해서는 들어볼 기회가 없었다.

 

URI에 대해 알아보면서 URN이란 개념도 같이 알아보았다.

 

1. URI (Uniform Resource Identifier)

통합 자원 식별자라는 뜻을 가진 개념으로

인터넷에 있는 자원을 나타내는 유일한 주소를 말한다.

 

URI의 개념 안에는 URL과 URN이 포함된다.

 

2. URL (Uniform Resource Locator)

자원,

웹사이트 서버들에 있는 파일의 위치(리소스의 위치)

 

URI의 개념에 포함된다.

 

3. URI와 URL의 차이

위의 정의된 내용만 보면 어떤 얘기인지 감지 잡히지 않는다.

예시를 들어 둘의 차이를 설명하자면

 

URI : https://abcdqbbq.tistory.com/3?category=843598

URL(URI이자 URL) : https://abcdqbbq.tistory.com/3 

 

위의 예시를 보면

?category=843598 이라는 식별자를 포함하고 있기 때문에

유일한 주소가 되고 URI에 해당한다.

 

그리고,

식별자 이전까지인 주소의 위치가 URL의 개념에 포함된다.

 

4. URN (Uniform Resource Name)

URI에 포함되는 개념으로 

 

URL이 주소의 위치를 가지고 있다면

URN은 위치와 관계없이 리소스의 이름값만을 이용해서 접근하는 방식이다.

 

예를들면

https://abcdqbbq.tistory.com/category/1 의 위치에서 

https://abcdqbbq.tistory.com/1 의 위치로 실제 파일이 위치 이동을 하게 된다면

 

위의 category/1 의 url을 알고 있던 사람들은 기존의 주소로 접근할 수 없을 것이다.

 

하지만 URN으로 적용을하면 위치 기준이 아닌 이름값 기준으로 접근하기 때문에

그러한 문제가 해결된다.

 

 

 

반응형

'Frontend > Web' 카테고리의 다른 글

SEO(검색 엔진 최적화)란?  (0) 2020.04.21
웹해상도 (물리픽셀, 논리픽셀, 고밀도 해상도, PPI)  (0) 2020.04.21
브라우저 렌더링 성능 최적화  (2) 2020.04.16
XML과 HTML  (0) 2020.04.14
브라우저 렌더링  (0) 2020.04.09
반응형

Internet Explorer(IE), Chrome, FireFox, Safari, Opera 등 많은 브라우저가 존재한다.

이렇게 많은 브라우저들이 사용자들에게 페이지나 콘텐츠들을 어떻게 보여주는 지에 대해

알아보려고 한다.

 

1. 브라우저의 주요 기능

브라우저는 사용자가 URI에 입력하고 요청(request)한 내용을 보여준다.

 

그리고 브라우저는 HTML과 CSS 기본 명세에 따라 각 파일을 해석하고 표시하는데

이 명세는 웹 표준화 기구인 W3C의 기준을 따른다.

 

2. 브라우저의 기본구조

브라우저 렌더링을 알아보기 전 먼저 브라우저의 기본 구조에 대해 알아봐야한다.

 

1. 사용자 인터페이스 : 주소 표시줄, 이전/다음 버튼, 북마크 메뉴 등 요청한 페이지 창을 제외한 나머지 부분.

2. 브라우저 엔진 : 사용자 인터페이스와 렌더링 엔진 사이에서 동작을 제어.

3. 렌더링 엔진 : HTML을 요청하면 HTML, CSS를 파싱하여 화면에 나타내는 등의 사용자가 요청한 내용을 표시.

4. 통신 : HTTP 요청과 같은 네트워크 호출에 사용.

5. UI 백엔드 : 콤보 박스와 창 같이 기본적인 장치를 그림.

6. 자바스크립트 해석기 : 자바스크립트 코드를 해석하고 실행.

7. 자료 저장소 : 쿠키를 비롯한 모든 종류의 자원 및 자료를 하드 디스크에 저장할 수 있는 저장소이다.

 

*크롬(chrome)은 대부분의 브라우저와 달리 각 탭별로 독립된 프로세스로 처리된다

 

 

3. 렌더링 엔진 동작 과정

앞서 살펴본바와 같이 렌더링 엔진은

사용자에게 요청 받은 내용을 브라우저에 표시하는 역할을 한다.

 

렌더링 엔진은 크게

웹킷(Webkit) 엔진과 게코(Gecko) 엔진이 있는데

웹킷은 사파리와 크롬, 게코는 파이어폭스 브라우저에서 사용된다.

(*크롬의 경우 웹킷에서 블링크(Blink) 엔진으로 변경되었다.)

 

렌더링 엔진의 동작 순서를 살펴보자면

 

1. DOM 트리 구축을 위한 HTML 파싱

서버로 부터 HTML 문서를 받아서 파싱하고 컨텐츠 트리 내부에서 태그를 DOM 노드로 변환한다.

그리고 CSS 파일도 받아서 CSSOM(CSS Object Model)로 변환한다.

 

그 후에 DOM Tree와 CSSOM Tree를 이용하여 렌더 트리라는 또 다른 트리를 생성한다.

 

2. 렌더 트리 구축(생성)

HTML과 CSS를 파싱해서 만들어진 렌더 트리는 색상 또는 면적 등의

시각적 속성이 있는 사각형을 포함하고 있고 정해진 순서대로 렌더링하게 된다.

 

순수한 요소들의 구조와 텍스트만 존재하는 DOM Tree와는 다르게 렌더 트리(Render Tree)에는 스타일 정보가 설정되어 있고

실제 화면에 표현되는 노드들로만 구성이 된다.

* 실제 화면에 표현되는 노드들로만 구성이 된다는 말은 display:none 속성이 설정된 노드와 같이 어떠한 공간도 차지하지 않고 보여지지 않는 노드들은 렌더 트리에서 제외된다는 것을 말한다.

(단, visibility:hidden 과 같이 공간은 차지하지만 내용만 숨겨줄 경우 렌더 트리를 그릴 때 포함이 된다.)

 

3. 렌더 트리 배치(Layout)

렌더 트리 구축이 끝난 뒤에 렌더 트리 배치가 시작되는데

이것은 브라우저의 뷰포트(Viewport) 내에서 각 노드를 정확한 위치에 표시되는 것을 의미한다.

 

4. 렌더 트리 그리기(Paint)

배치가 완료된 렌더 트리를 UI 백엔드에서 각 노드를 가로지르며 그리기 작업을 진행한다.

 

이전 단계에서 요소들의 위치나 크기, 스타일 계산이 완료된 렌더 트리를 이용해

실제 픽셀 값을 채워넣게 된다.

이 때, 텍스트, 색, 이미지, 그림자 효과 등이 모두 처리된다.

 

그리고 처리해야 하는 스타일이 복잡할수록 paint 과정에서 소요되는 시간은 늘어난다.

예를 들어, 단순히 color값을 변경하는 속성보다 text-shadow나 그라데이션 효과가

painting 과정이 더 오래 걸린다.

 

 

위와 같은 과정을 진행하면서

렌더링 엔진은 좀 더 나은 사용자 경험을 위해 최대한 빠르게 내용을 표시하게 되는데

모든 HTML을 파싱할 때까지 기다리지 않고 배치와 그리기 과정을 시작한다.

 

네트워크로부터 나머지 내용이 전송되기를 기다리는 동시에

받은 내용의 일부를 화면에 먼저 표시한다.

 

- webkit의 동작 과정

 

- Gecko의 동작 과정

 

Webkit(웹킷)과 Gecko(게코)에서 사용하는 용어들은 조금씩 다르지만

동작 과정은 기본적으로 동일하다.

 

- Webkit은 시각적으로 처리되는 렌더를 렌더트리라고 표현하고 각 요소를 렌더 객체로 표현

- Gecko는 형상 트리라고 표현하고 각 요소를 형상이라고 지칭한다.

 

- Webkit에서는 요소를 배치하는데 배치라는 용어를 사용하지만

- Gecko는 리플로우 라는 용어를 사용한다.

 

- Webkit은 HTML과 CSS를 각각 파싱한 자료를 합쳐서 렌더 트리를 생성하는 작업을 어테치먼트라고 표현

- Gecko는 형상 구축이라 표현한다.

 

- Webkit은 HTML과 Stylesheet를 처음부터 분리하여 작업

- Gecko는 HTML을 최초로 호출하고 콘텐츠 싱크 과정을 두어 Stylesheet를 분리해서 작업한다.

* 위의 과정의 차이는 DOM 요소를 생성하는 과정으로 크게 의미있는 차이라고 보지 않는다.

 

 

 


 

참고

https://d2.naver.com/helloworld/59361

https://vallista.kr/2019/05/06/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EB%A0%8C%EB%8D%94%EB%A7%81-%EA%B3%BC%EC%A0%95/

 

 

 

반응형

'Frontend > Web' 카테고리의 다른 글

SEO(검색 엔진 최적화)란?  (0) 2020.04.21
웹해상도 (물리픽셀, 논리픽셀, 고밀도 해상도, PPI)  (0) 2020.04.21
브라우저 렌더링 성능 최적화  (2) 2020.04.16
XML과 HTML  (0) 2020.04.14
URI vs URL 비교  (0) 2020.04.10
반응형

html 구조에서 제목을 나타내는 태그가 있다. 바로 흔히 hn 태그라고 불리는

h1~h6 까지의 태그이다.

 

기본적으로 block요소의 성격과

h1부터 h6까지 텍스트의 크기가 다르게 설정이 되어있고 bold 처리가 되어있다.

 

사이즈 조정 및 bold 처리를 수정하기 위해서는

css로 별도의 조정이 필요하다.

 

그리고,

 

제목의 중요도나 분류에 따라 1부터 6까지 사용한다.

 

쓰임에 맞게 h1부터 h2, h3~ 순서에 맞게 작성하는 것이 좋다.

<h1>전체 공지사항</h1>
<section>
   <h2>인사 정보 관련 공지</h2>
   <div>
      <h4>인사 발령</h4>  <!-- (x) 순서에 맞게 h3태그를 사용하는 것이 좋다. -->
      <p>인사팀 홍길동 외 10명 특별 승진.</p>
   </div>
</section>

 

<h1>전체 공지사항</h1>
<section>
   <h2>인사 정보 관련 공지</h2>
   <div>
      <h3>인사 발령</h3>
      <p>인사팀 홍길동 외 10명 특별 승진.</p>
   </div>
</section>
<section>
   <h2>개발 본부 관련 공지</h2>
   <div>
      <h3>인사 발령</h3>
      <div>
         <h4>Frontend 개발자 승진 명단</h4>
         <p>김땡땡 외 3명</p>
         <h4>Backend 개발자 승진 명단</h4>
         <p>최땡땡 외 1명</p>
      </div>
      <h3>부서 운영비 개정</h3>
      <p>1인당 1만원에서 25만원으로 대폭 증가</p>
   </div>
</section>

 

 

반응형
반응형

Sass에서는 자바스크립트에서와 마찬가지로 데이터 타입이 존재한다.

 

레퍼런스에서는 Value(값)으로 소개가 되고 있는데,

 

총 8가지의 데이터 타입이 있다.

 

1. Numbers 숫자

- 단위를 포함하거나 포함하지 않을 수 있다. (12 or 12px)

 

2. Strings 문자열

- 따옴표를 포함하거나 포함하지 않을 수 있다. ("bold" or bold)

 

3. Colors 색상

- 일반적인 red, green 과 같은 색상이나 #f0f0f0 등의 Hex 표현으로도 작성할 수 있다.

 

4. List (자바스크립트의 배열과 유사)

- 쉼표나 공백으로 List 를 구분하여 작성한다. (Helvetica, Arial, sans-serif) or (10px 15px 0 0)

 

5. Map (자바스크립트의 객체와 유사)

- 객체와 유사하게 key값과 value 값을 작성한다. ("background" : red, "border-color" : blue)

 

6. boolean (true or false)

 

7. null

- 자바스크립트의 null과 마찬가지로 아무것도 없는 값을 나타낸다.

 

8. Function 함수

- Sass에서 제공하는 내장함수와 임의로 작성할 수 있는 함수가 있다. (@function)

 

 

반응형

'Frontend > Sass (SCSS)' 카테고리의 다른 글

[Sass 특징] @mixin, content block (@content)  (0) 2021.03.29
[Sass 특징] @at-root  (0) 2020.05.06
[Sass 특징] @mixin 과 @include  (0) 2020.03.27
[Sass 특징] Nesting (중첩)  (0) 2020.03.19
[Sass 특징] 변수  (0) 2020.03.17
반응형

css를 작성하면서 내가 원하는 컨텐츠가 다른 컨텐츠 뒤에 가려져서

난감한 경우가 종종 있다.

 

그런 경우를 해결하기 위해 사용하는 속성이 바로 z-index라는 속성이다.

 

z-index의 기본값은 auto 이고

보통 1, 9, 100, -1, -100등의 숫자로 그 속성의 값을 지정한다.

 

1. z-index 특징 (position값과의 연관성)

z-index의 가장 중요한 특징 중 하나는

아무 요소나 다 z-index를 넣는다고 해서 우선순위를 넣을 수 는 없다는 점이다.

 

z-index 속성이 적용되기 위해서는 

z-index를 적용한 영역이 position:static 값이 아니어야 한다.

<style>
   .wrap{position:relative;}
   .box1{background:skyblue; width:100px; height:100px; z-index:10;}
   .box2{position:absolute; top:0; left:0; background:pink; width:50px; height:50px; z-index:1;}
</style>
<body>
   <div class="wrap">
      <div class="box1">BOX1</div>
      <div class="box2">BOX2</div>
   </div>
</body>

 

BOX1
BOX2

분명 .box1 영역이 z-index:10 으로 설정해놓았기 때문에

더 위쪽에 위치해야할 것 같지만

실제로 출력되는 화면을 보면 .box2 영역이 .box1 영역을 덮고 있다.

 

그 이유가 바로 .box1에 position 값이 지정되어있지 않기 때문에

z-index 속성이 먹히지 않아서 이다.

 

그렇다면 .box1에 position:relative를 주게되면 어떻게 될까?

BOX1
BOX2

그렇게되면 위의 모습과 같이 z-index:10을 준 .box1 영역이 더 위쪽으로 오는 것을

확인할 수 있다.

 

2. z-index 특징 (같은 형제 요소와의 비교)

z-index의 가장 중요하면서 헷갈리기 쉬운 특징 중에 하나는

z-index의 비교 대상을 확인하는 것이다.

 

z-index는 같은 형제 요소에 선언된 z-index끼리 비교를 한다.

만약 같은 형제 요소끼리에서 z-index가 선언된 내용이 없으면

자식 요소의 z-index값을 가지고 확인한다.

 

위 내용을 예를 들면

<style>
 .wrap{position:relative;}
 .box1{position:absolute; top:0; left:0; background:skyblue; width:40px; height:40px; z-index:10;}
 .box2{position:absolute; top:0; left:0; background:pink; width:80px; height:80px; z-index:1;}
 .box2-1{position:absolute; top:0; left:0; background:red; width:60px; height:60px; z-index:999;}
</style>
<body>
   <div class="wrap">
      <div class="box1">
         BOX1
      </div>
      <div class="box2">
         BOX2
         <div class="box2-1">BOX2-1</div>
      </div>
   </div>
</body>

위의 소스를 보면 .box2-1 클래스영역에 z-index 값이 999이기 때문이 그 어느것보다도 

앞에 위치할 것 같은데...

BOX1
BOX2
BOX2-1

 

 

 

 

막상 노출되는 화면을 보면 위와 같이 box1 영역이 가장 위쪽으로 위치하게된다.

 

이는 .box1과 .box2 두 형제 요소끼리의 z-index 비교에서

이미 .box2영역이 z-index:1로 .box1의 z-index:10에서 밀리기 때문에

.box2 자식 요소로 있는 영역에 아무리 z-index를 많이 줘봤자

밀리게 된다.

 

원래 원하던대로 .box2-1를 가장 위쪽으로 위치하게 하기 위해선

.box2에 설정된 z-index:1; 을 제거하면 된다.

<style>
 .wrap{position:relative;}
 .box1{position:absolute; top:0; left:0; background:skyblue; width:40px; height:40px; z-index:10;}
 .box2{position:absolute; top:0; left:0; background:pink; width:80px; height:80px;}
 .box2-1{position:absolute; top:0; left:0; background:red; width:60px; height:60px; z-index:999;}
</style>
<body>
   <div class="wrap">
      <div class="box1">
         BOX1
      </div>
      <div class="box2">
         BOX2
         <div class="box2-1">BOX2-1</div>
      </div>
   </div>
</body>

 

BOX1
BOX2
BOX2-1

 

 

 

그렇게되면 .box1과 .box2-1의 z-index값을 비교하게 되어

원하는 값을 출력받을 수 있다.

 

3. z-index의 음수(-) 값

z-index로 우선순위를 지정하다보면

필요에 따라서 음수(-) 값을 주게되는 경우가 있다.

 

그런 경우 어떤 경우에는 내가 원하는대로 기존 값들의 뒤쪽에

잘 배치가 되는가하면

 

어떠한 경우에는 아예 내가 조정하려는 영역이 화면에서 사라지게 된다.

<style>
 .wrap{position:relative; height:100px; background:#fff;}
 .box1{position:absolute; top:0; left:0; background:skyblue; width:40px; height:40px;}
 .box2{position:absolute; top:0; left:0; background:pink; width:80px; height:80px;}
</style>
<body>
   <div class="wrap">
      <div class="box1">BOX1</div>
      <div class="box2">BOX2</div>
   </div>
</body>

위와 같은 소스가 있다고 가정하여

출력을 한다면

BOX1
BOX2

 

 

 

위와 같이 .box2 영역이 .box1을 덮는 형태로 출력이 될 것이다.

 

이 경우 .box1의 z-index를 조정하지 않고

.box2에 z-index를 음수(-) 로 줘서 조정할 수 있다고 생각할 수 있다.

 

실제로도 z-index를 음수 값을 줘서 조정하는 경우도 있다.

 

하지만 위의 소스같은 경우 .box2에 z-index 값을 음수로 주게되면

.box2 영역이 사라지는 것을 볼 수 있다.

<style>
 .wrap{position:relative; height:100px; background:#fff;}
 .box1{position:absolute; top:0; left:0; background:skyblue; width:40px; height:40px;}
 .box2{position:absolute; top:0; left:0; background:pink; width:80px; height:80px; z-index:-1;}
</style>
<body>
   <div class="wrap">
      <div class="box1">BOX1</div>
      <div class="box2">BOX2</div>
   </div>
</body>

 

BOX1
BOX

 

위의 소스를 출력하면 위와 같은 화면으로 출력이 된다.

 .box2는 어디에도 없다...

 

그 이유는 .wrap에 적용된 background:#fff 값 때문에 그렇다.

z-index 속성이 음수(-) 처리가 되면 기본적인 영역들의 바닥에 깔리게 되는데

 

부모 속성인 .wrap에 #fff 색상의 장판을 깔아서

그 아래에 들어간 .box2가 보이지 않게 된 것이다.

 

그래서 z-index 값을 음수(-)로 사용할 때는

부모 요소에 background가 없는지 확인하고

 

가능하면 이런 문제를 피하기 위해 음수가 아닌 양수의 값을

사용하도록 하는 것이 좋다.

 

 

반응형
반응형

자바스크립트에서 특정 아이디(id), 클래스(class), 태그(tag)의 dom 요소를 찾기 위해서

사용되는 메소드가 있다.

 

1. 아이디(Id)값 찾기

- getElementById()

<div id="content">
   <p class="txt_red">안녕하세요</p>
   <p>반갑습니다.</p>
   <span class="txt_red">Hello world</span>
</div>

<script>
   var Content = document.getElementById('content');
   // id가 content인 요소를 가져온다.
</script>

 

2. 클래스(Class)값 찾기

- getElementsByClassName()

 : 가져온 값은 HTML Collection 객체(유사배열) 로 가져온다.

<div id="content">
   <p class="txt_red">안녕하세요</p>
   <p>반갑습니다.</p>
   <span class="txt_red">Hello world</span>
</div>

<script>
   var textRed = document.getElementsByClassName('txt_red');
   // class가 txt_red인 요소를 HTMLCollection 배열로 가져온다.
   
   console.log(textRed[0]);
   // <p class="txt_red">안녕하세요</p>
</script>

 

3. 태그(Tag) 값 찾기

- getElementsByTagName()

 : 가져온 값은 HTML Collection 객체(유사배열) 로 가져온다.

<div id="content">
   <p class="txt_red">안녕하세요</p>
   <p>반갑습니다.</p>
   <span class="txt_red">Hello world</span>
</div>

<script>
   var tag_P = document.getElementsByTagName('p');
   // document에서 p태그 요소를 HTMLCollection 배열로 가져온다.
   
   console.log(tag_P[1]);
   // <p>반갑습니다.</p>
</script>

 

 

위의 3가지 방법 외에도

querySelector, querySelectorAll과 같은 방법이 있다.

 

2020.10.12 - [Frontend/Javascript] - Javascript (자바스크립트) - 요소 찾기 (querySelector, querySelectorAll)

 

 

 

 

 

 

반응형
반응형

자바스크립트 배열에 요소들을 추가 혹은 제거할 때,

또 원하는 영역을 빼올 때 쓰는 메소드가 있다.

 

1. 배열에 요소 추가 (push(), unshift())

push, unshift는 배열에 원하는 요소들을 추가하는 메소드이다.

 

- push() : 배열의 끝에 요소 추가

- unshift() : 배열의 앞에 요소 추가

var arr01 = [1, 2, 3, 4, 5];

arr01.push(6, 7);
// arr01 = [1, 2, 3, 4, 5, 6, 7]

arr01.unshift('a', 'b', 'c');
// arr01 = ['a', 'b', 'c', 1, 2, 3, 4, 5, 6, 7]

 

2. 배열에서 요소 제거 (pop(), shift())

pop, shift는 배열의 앞이나 뒤에서 요소를 제거하는 메소드이다.

 

- pop() : 배열의 마지막 요소 제거

- shift() : 배열의 첫 번째 요소 제거

var arr02 = [1, 2, 3, 4, 5];

arr02.pop();
// arr02 = [1, 2, 3, 4]

arr02.shift();
// arr02 = [2, 3, 4]

 

3. 원하는 영역만큼 제거 (splice())

splice 메소드는 배열에서 원하는 영역만큼을 제거할 수 있다.

 

- splice(pos, length) : pos번째 부터 length까지 요소 제거

var arr03 = [1, 2, 3, 4, 5];

var splice = arr03.splice(1, 3);
// splice = [2, 3, 4]
// arr03 = [1, 5]

 

4. 원하는 영역만큼 복제하여 잘라내기 (slice())

slice 메소드는 splice 메소드와는 다르게 

원하는 영역만큼 요소를 제거하는 것이 아니라 

복제를 할 수 있다.

 

- slice(pos, lastpos) : pos(첫 위치) 부터 lastpos(마지막 위치) 만큼 잘라오기

var arr04 = [1, 2, 3, 4, 5, 6, 7];

var slice = arr04.slice(5);
// slice = [6, 7]
// arr04 = [1, 2, 3, 4, 5, 6, 7]

var slice02 = arr04.slice(2, 5);
// slice02 = [3, 4, 5]
// arr04 = [1, 2, 3, 4, 5, 6, 7]

var slice03 = arr04.slice(4, -1);
// slice03 = [5, 6]
// arr04 = [1, 2, 3, 4, 5, 6, 7]

* slice(pos) 처럼 한 숫자만 입력할 경우 시작점부터 끝까지 복제

* lastpos 값까지 복제 하는 것이 아니라 lastpos 값 바로 앞 위치 값까지 복제

* slice(pos, -lastpos) 처럼 마지막 위치 값이 -(음수) 일 경우 뒤에서 부터 계산

 

 

반응형
반응형

2020/03/24 - [HTML] - [html 태그] ol, ul 태그 (목록 태그)

 

이 전에 포스팅 했던 ol, ul 등의 일반적인 목록형 태그 외에

정의형 목록을 나타내는 태그도 html 존재한다.

 

바로 dl 태그인데,

이 태그는 ol과 ul이 li태그와의 짝을 이루듯

 

dl태그도 하나 이상의 dt태그와 하나 이상의 dd 태그로 짝을 이룬다.

(!) 반드시 dl태그 안에는 dt, dd태그만 위치할 수 있다.
<dl>
   <dt></dt>
   <dd></dd>
</dl>

위와 같은 기본 구성을 담고있다.

 

1. <dl> 태그 (Definition List)

말 그대로 정의 목록을 나타내는 태그이다.

특정 용어에 대해 정의하는 제목과 그 제목에 대한 설명을 담는다.

기본적으로 block요소의 속성을 갖고 있다.

 

2. <dt> 태그 (Definition Term)

정의 되는 용어에 대한 제목을 나타낸다.

기본적으로 block요소의 속성을 갖고 있다.

 

3. <dd> 태그 (Definition Description)

정의된 제목에 대한 설명을 나타낸다.

기본적으로 block요소의 속성을 갖고 있다.

 

4. 정의형 목록 스타일

<dl>
   <dt>정의 제목</dt>
   <dd>정의 설명</dd>
</dl>

기본적으로 dt와 dd 태그를 따로 스타일을 주지 않고 출력을 하게되면

dd태그의 들여쓰기가 된 상태에서 출력이 된다.

 

그래서 원하는 화면을 만들기 위해서는

margin값을 조정하거나 float, display:inline-block 등 별도의 스타일을 추가해야한다.

 

 

또한 여러개의 dt태그와 하나의 dd태그의 구성,

하나의 dt태그와 여러개의 dd태그의 구성 등의 표현이 가능하다.

<dl>
   <dt>정의 제목1</dt>
   <dt>정의 제목2</dt>
   <dt>정의 제목3</dt>
   <dd>정의 설명</dd>
</dl>

<dl>
   <dt>정의 제목1</dt>
   <dt>정의 제목2</dt>
   <dt>정의 제목3</dt>
   <dd>정의 설명1</dd>
   <dd>정의 설명2</dd>
   <dd>정의 설명3</dd>
</dl>

<dl>
   <dt>정의 제목</dt>
   <dd>정의 설명1</dd>
   <dd>정의 설명2</dd>
   <dd>정의 설명3</dd>
</dl>

 

 

반응형

'Frontend > HTML' 카테고리의 다른 글

[html 태그] address 태그  (0) 2020.07.04
[html 태그] hn태그 (h1, h2, h3, h4, h5, h6)  (0) 2020.04.03
[html 태그] p태그  (0) 2020.03.25
[html 태그] ol, ul 태그 (목록 태그)  (0) 2020.03.24
[html 태그] a태그  (0) 2020.03.06
반응형

Sass의 유용한 점 중에 하나인 반복되는 내용에 대한

재사용이 용이하다는 것을 가장 잘 증명할 수 있는 것 중 하나가

바로 @mixin 이다.

 

@mixin은 자바스크립트의 함수와 같이 

재사용이 필요한 내용들을 @mixin 문법에 담아놓고

@include를 사용하여 호출한다.

 

1. @mixin 사용

@mixin을 사용하기 위해서는 우선 반복이 되는 내용들을

담아야한다.

@mixin test{
   display:inline-block; border:1px solid #333; color:red; text-align:center;
}

위와 같이 @mixin 뒤에 mixin명 그리고 중괄호를 사용해

그 안에 반복할 css 내용을 넣는다.

(!) @mixin명에 하이푼, 언더스코어 (-, _)를 둘 다 쓸 수 있는데,
    둘 중에 어떤 걸 사용해도 동일한 @mixin명으로 인식한다.

ex) @mixin text-border === @mixin text_border

 

만들어 놓은 @mixin은 비동기 상태로

호출을 하기 위해선 @include를 사용한다.

/* SCSS */
section{
   .box{
      @include test;
   }
}

/* CSS */
section .box {display:inline-block; border:1px solid #333; color:red; text-align:center;}

이처럼 원하는 영역에 @include mixin명 을 사용하여 호출한다.

 

2. @mixin 응용

2-1. @mixin 안에 또 다른 @mixin @include

단순히 @mixin 안에 스타일을 넣고 @include 시키는 것 말고

@mixin 안에 또 다른 @mixin을 @inclue 시킬 수 있다.

(!) @mixin 안에 또 다른 @mixin을 생성하는 것은 안된다.
/* SCSS */
@mixin reset-border{
   border:none;
}

@mixin box{
   width:50px; height:50px; text-align:center;
   @include reset-border;
}

div{
   @include box;
}


/* CSS */
div{width:50px; height:50px; text-align:center; border:none;}

위의 소스처럼 reset-border 라는 @mixin을 box라는 @mixin 안에 @include시킬 수 있다.

 

2-2. 인수 값으로 변경되는 값 조정

@mixin을 만들 때 단순히 @mixin명과 스타일만 넣어서 만드는게 아니라

인수 값을 추가해서 변경되는 값들을

@include할 때마다 바꿔서 호출할 수 있다.

/* SCSS */
@mixin reset-border($border-color, $f-size){
   border:1px solid $border-color; font-size:$f-size;
}

@mixin box{
   width:50px; height:50px; text-align:center;
   @include reset-border(#333, 11px);  /* 혹은 $border-color:#333, $f-size:11px */
}

div{
   @include box;
}


/* CSS */
div{width:50px; height:50px; text-align:center; border:1px solid #333; font-size:11px}

그리고 인수 값에 기본 값 혹은 null 값을 넣을 수 있다.

 

기본적으로 인수 값은 필수로 입력해야하는 사항이지만

null 값을 넣게되면 넣어도 그만 안 넣어도 그만인 값이 된다.

/* SCSS */
@mixin reset-border($border-color:#666, $f-size:null){
   border:1px solid $border-color; font-size:$f-size;
}
div{
   @include reset-border;
}
p{
   @include reset-border($border-color:red, $f-size:14px);
}


/* CSS */
div{border:1px solid #333;}
p{border:1px solid red; font-size:14px;}

위의 소스상에 div의 경우 $f-size를 @include 하면서 따로 지정하지 않아 null 값이 되어

font-size는 따로 출력이 되지 않았다.

 

반면에 p태그의 경우 $f-size를 @include하면서 14px로 지정하여

$border-color의 경우에도 기본 값 #666에서 red로 변경을 하여

그에 맞게 출력 되었다.

 

 

반응형

'Frontend > Sass (SCSS)' 카테고리의 다른 글

[Sass 특징] @at-root  (0) 2020.05.06
[Sass 특징] Sass 데이터 타입(값) 소개  (0) 2020.04.02
[Sass 특징] Nesting (중첩)  (0) 2020.03.19
[Sass 특징] 변수  (0) 2020.03.17
Sass란?  (0) 2020.03.04
반응형

p태그의 p는 paragraph의 약자로 뜻 그대로 문단을 나타낼 때 쓰인다.

 

p태그는 기본적으로 block의 성격을 가진 태그로 내부에서 텍스트의 정렬을 위해서는

text-align 속성을 사용해 텍스트 정렬을 한다.

 

1. p태그 사용의 유의점

p태그는 기본적으로 margin의 상하값에 간격이 들어가있다.

그렇기 때문에 css를 초기화하거나 p태그에 margin:0 값을 넣어주지 않았다면

원하는 화면을 출력하지 못할 것이다.

 

그리고 p태그는 블록 요소의 태그이긴해도

p태그 안에(자식요소로) 다른 블록 요소가 들어가지 못한다.

 

그리고 무엇보다 p태그 안에 p태그는 삽입이 불가능하다.

 

<p>
   <h2>제목</h2>  <!-- x -->
   테스트를 위한 텍스트
</p>

<p>
   p태그 안에 또 p태그를..?
   <p>가능할까..??</p>   <!-- x -->
</p>

 

2. p태그의 사용

어떤 경우에는 p태그를 사용해 텍스트를 넣고

또 어떤 경우엔 span태그나 div를 사용해서 텍스트를 넣고

각자의 코딩 방식에 따라 p태그를 사용하는 방식이 조금씩의 차이는 있겠지만

 

p태그는 말 그대로 문단을 위해 사용하는 태그이므로

길이가 긴 문장이나 특정 영역에 대한 설명글 등 문단의 성격을 가진

텍스트를 사용할 때 필요에 맞춰 사용하는 것이 좋다.

반응형
반응형

css로 작업을 하다보면 내가 원하는 영역을

좌측 혹은 우측에 배치를 해야하는 경우가 많다.

 

텍스트의 경우는 text-align으로 배치를 할 수 있지만

텍스트가 아닌 일반 영역들 같은 경우는 다른 방법이 필요하다.

 

이럴 때 사용하는 것이 float라는 속성이다.

 

1. float 속성

float 속성에서 주로 사용하는 것은 float:left, float:right 속성이다.

말 그대로 원하는 영역을 왼쪽으로 정렬시키거나 오른쪽으로 정렬시키는 속성이다.

<style>
   .float_left{float:left; background:skyblue; width:150px; height:50px;}
   .float_right{float:right; background:greenyellow; width:150px; height:50px;}
</style>
<body>
   <div class="wrap">
      <div class="float_left">왼쪽정렬</div>
      <div class="float_right">오른쪽정렬</div>
   </div>
</body>

이런식으로 .float_left 클래스 영역은 왼쪽으로 .float_right 영역은 오른쪽으로 정렬할 수 있다.

 

그리고 텍스트와 float 설정된 영역이 같이 노출이 되는 경우엔 아래와 같이 노출된다.

<style>
   .float_left{float:left; background:skyblue; width:150px; height:50px;}
</style>
<body>
   <div class="wrap">
      <div class="float_left">왼쪽정렬</div>
      <p>텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다. 
      텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다. 
      텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다. 
      텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다.</p>
   </div>
</body>

 

<style>
   .float_right{float:right; background:greenyellow; width:150px; height:50px;}
</style>
<body>
   <div class="wrap">
      <div class="float_right">오른쪽정렬</div>
      <p>텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다. 
      텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다. 
      텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다. 
      텍스트가 노출이 되는 경우에는 float 속성이 어떻게 될지 궁금합니다.</p>
   </div>
</body>

 

2. float 해제 (clearfix)

위와 같이 float를 사용하여 왼쪽 혹은 오른쪽 정렬을 했을 경우에

생각지도 못한 상황이 발생하곤 한다.

<style>
   .float_left{float:left; background:skyblue; width:150px; height:50px;}
   
   .text p{color:red;}
</style>
<body>
    <div class="wrap">
        <div class="float_left">왼쪽정렬</div>
        <p>왼쪽 영역에 대한 텍스트 내용입니다.</p>
    </div>
    <div class="text">
        <p>안녕하세요 반갑습니다.</p>
    </div>
</body>

위와 같이 float를 사용한 영역 아래에

.text라는 클래스를 사용해서 별도의 영역을 만들고자 했을 때,

원하던 모습이 아닌 .text 영역의 위치가 .wrap 영역과 겹쳐서 보이는 것을 확인할 수 있다.

 

이것은 float 속성 때문에 그렇게 되는건데

 

float를 사용하면 사용한 영역 자체가 화면에서 아예 띄워지게 된다.

position:absolute 하는 것과 마찬가지로 띄워지게 돼서

 

그 영역을 감싸고 있는 부분이 float한 부분까지 너비나 높이를 인식하지 못한다.

 

그렇기 때문에 .wrap의 영역은 .float_left 영역의 높이값이 무시된 상태로

p태그에 텍스트 영역만 높이을 인정받아 .text영역의 위치가 위와 같이 노출이 된 것이다.

 

이를 해결하기 위해서는 float 설정해놓은 것을 해제해줘야한다.

 

그래야 올바른 높이값을 잡고 레이아웃을 바로할 수 있다.

 

float를 해제할 수 있는 방법은 크게 3가지가 있다.

1. float한 요소의 부모요소에 overflow:hidden 속성 사용

2. float한 요소의 부모요소에 가상선택자 :after를 사용하여 clear해제

3. 임의의 div를 만들어 clear 속성을 사용한 해제

 

2-1. overflow:hidden 사용

<style>
   .wrap{overflow:hidden;}  /* float를 사용한 .float_left의 부모인 .wrap에 overflow:hidden 사용 */

   .float_left{float:left; background:skyblue; width:150px; height:50px;}
   
   .text p{color:red;}
</style>
<body>
    <div class="wrap">
        <div class="float_left">왼쪽정렬</div>
        <p>왼쪽 영역에 대한 텍스트 내용입니다.</p>
    </div>
    <div class="text">
        <p>안녕하세요 반갑습니다.</p>
    </div>
</body>

 

2-2. 가상선택자 :after 를 사용하여 clear 처리

float된 영역의 부모 요소에 :after 사용하여

 

display:block; clear:both; content:"";

 

속성을 사용하여 해제

<style>
   .wrap:after{display:block; clear:both; content:"";} /* 부모요소 wrap에 가상 요소를 사용하여 clear */

   .float_left{float:left; background:skyblue; width:150px; height:50px;}
   
   .text p{color:red;}
</style>
<body>
    <div class="wrap">
        <div class="float_left">왼쪽정렬</div>
        <p>왼쪽 영역에 대한 텍스트 내용입니다.</p>
    </div>
    <div class="text">
        <p>안녕하세요 반갑습니다.</p>
    </div>
</body>

 

2-3. 임의의 div에 clear 속성 사용하여 해제 (비추천)

<style>
   .float_left{float:left; background:skyblue; width:150px; height:50px;}
   
   .clearfix{clear:both;}  /* 임의의 div에 clear 속성을 추가하여 float 해제 */
   
   .text p{color:red;}
</style>
<body>
    <div class="wrap">
        <div class="float_left">왼쪽정렬</div>
        <p>왼쪽 영역에 대한 텍스트 내용입니다.</p>
    </div>
    <div class="clearfix"></div>
    <div class="text">
        <p>안녕하세요 반갑습니다.</p>
    </div>
</body>

위와 같은 방법은 불필요한 div가 clear를 위해서

추가되는 방법이라 가능하면 비추천한다.

 

 

위의 3가지 방법 중에 보통은 부모 요소에 overflow:hidden 속성을 사용해서

float를 해제하거나

 

부모 요소를 넘어가는 레이어나 다른 요소들이 있는 경우에는

(부모 요소의 범위를 넘어서 ui를 표현해야하는 경우)

 

가상요소 :after를 사용해서 float 해제해주는 방법을 추천한다.

 

반응형
반응형

html태그 중 리스트 혹은 목록을 나타내는 태그가 있다.

ol태그와 ul태그가 그 태그이다. 

 

이 태그들을 상황에 맞게 알맞게 사용하는 것이 중요하다.

 

ol과 ul 각 태그는 반드시 li태그와 함께 사용이 된다.

ol, ul태그의 안에는 li태그 외에는 다른 태그는 바로 자식 선택자로 위치할 수 없다.

<ul>
  <li>순서가 의미가 없다.</li>  (o)
  <div></div>  (x)
  <li>
     <div></div>  (o)
  </li>
</ul>

div를 사용하고 싶다면 li태그를 먼저 만든 후에 그 안쪽으로 div태그를 작성해야한다.

 

1. ol 태그 (순서 있는 목록)

ol태그는 1번 2번 등 순서가 있는 목록을 만들 때 사용된다.

 

예를 들면, 1등부터 5등까지 순서를 나열하는 경우에서 사용이 된다.

<h1>체육대회 순위</h1>
<ol>
   <li>철수</li>
   <li>새미</li>
   <li>철수세미</li>
   <li>영수</li>
   <li>박수</li>
</ol>

위의 소스와 같이 출력을 하면 아래와 같이 노출이 된다.

ol태그 안 li태그에 1, 2, ~ 5번 등 숫자를 따로 표시하지 않아도

브라우저는 ol태그의 사용에 맞춰 스스로 순서를 부여한다.

 

2. ul 태그 (순서 없는 목록)

ul태그는 앞서 소개한 ol태그와는 다르게

순서가 정해져있지 않은 목록을 나타낼 때 쓰인다.


단순한 리스트의 나열이나 상품의 나열 등에서 쓰인다.

<h1>운동회 식사</h1>
<ul>
   <li>오리훈제</li>
   <li>쇠고기 무국</li>
   <li>김치</li>
   <li>치즈 등갈비</li>
   <li>양장피</li>
</ul>

위의 소스와 같이 출력을 하면 아래와 같이 노출이 된다.

왼편에 숫자가 아닌 원형의 점이 찍히면서

따로 순서에 의미가 없는 일반적인 리스트가 노출된다.

 

위와 같이 ol과 ul은 각각의 의미에 맞게 사용을 해야한다.

 

3. 리스트 기본 스타일 제거

ol은 왼편에 숫자, ul은 왼편에 점을 제거하기 위해선

css에 list-style 속성으로 조정을 해야한다.

<style>
   ol, ul{list-style:none;}
</style>
<body>
   <h1>체육대회 순위</h1>
   <ol>
      <li>철수</li>
      <li>새미</li>
      <li>철수세미</li>
      <li>영수</li>
      <li>박수</li>
   </ol>
   <h1>운동회 식사</h1>
   <ul>
      <li>오리훈제</li>
      <li>쇠고기 무국</li>
      <li>김치</li>
      <li>치즈 등갈비</li>
      <li>양장피</li>
   </ul>
</body>

위와 같이 li태그에 기본적으로 들어가던 숫자나 동그란 점이 사라질 것이다.

 

 

반응형

'Frontend > HTML' 카테고리의 다른 글

[html 태그] dl, dt, dd 태그 (정의형 목록)  (0) 2020.03.28
[html 태그] p태그  (0) 2020.03.25
[html 태그] a태그  (0) 2020.03.06
Meta tag (메타 태그)  (0) 2020.02.13
HTML5 - Content Model (콘텐츠 모델)  (0) 2020.02.12
반응형

css에서 position 속성은 내가 원하는 위치로 원하는 컨텐츠를 배치할 수 있는

중요한 속성이다.

 

static을 제외한 relative, absolute, fixed는 

top, left, bottom, right 속성과 함께 쓸 수 있다.

.test{position:absolute; top:0; left:100px;}

 

* 아래의 속성 외에 sticky라는 속성도 존재한다.

2020/11/20 - [Frontend/CSS] - [css 속성] position sticky

 

[css 속성] position sticky

css를 이용해 position 값을 사용하다보면 주로 사용하는 position 값은 static, relative, absolute, fixed 이 4가지가 될 것이다. 그도 그럴것이 이번에 소개할 position 값인 sticky의 경우엔 IE(익스플로어)에..

abcdqbbq.tistory.com

 

1. static

기본값으로 아무런 position값을 주지 않았을 경우 static이 적용된다.

position : static 일 경우 top, left 등의 조정 값들은 먹히지 않는다.

 

2. relative

주로 position : absolute; 속성과 함께 쓰이는 속성이다.

자식 요소에 적용된 absolute의 위치에 대해 기준을 잡는다.

 

3. absolute

position : relative 속성과 함께 쓰이는 속성이다.

가장 가까운 부모 요소에 있는 relative를 찾아서

그 요소의 위치를 기준으로 위치를 잡는다.

※ relative 뿐만 아니라 부모 요소에 fixed나 absolute로 설정이 되어있어도
   그 부모의 위치값을 기준으로 absolute를 잡는다.
<style>
  .wrap{padding:20px;}

  .box1{position:relative; border:1px solid #333; width:100px; height:100px;}
  .box2{background:skyblue; width:200px; height:200px;}

  .inr{position:absolute; top:0; left:0; width:50px; height:50px; color:#fff;}
  .box1 .inr{background:blue;}
  .box2 .inr{background:red;}
</style>
<body>
  <div class="wrap">
     <div class="box1">
        <div class="inr">box1 inr</div>
     </div>
     <div class="box2">
        <div class="inr">box2 inr</div>
     </div>
  </div>
</body>

위와 같은 상황을 예로 들었을 때,

 

.box1 안에 .inr는 .box1에 설정된 relative를 기준으로 top:0, left:0 이 적용 되었고

 

.box2 안에 .inr는 .box2가 relative가 설정되어있지 않고 그 위에 다른 부모 요소들에도

relative가 없어 기준을 잡을 부모가 없기 때문에 body태그에 top:0, left:0의 위치로 잡혔다.

 

4. fixed

absolute가 relative를 기준으로 위치를 잡는다면

fixed는 화면을 기준으로

말 그대로 아예 고정을 시켜버리는 것을 말한다.

<style>
  .wrap{padding:20px;}

  .box1{position:fixed; top:0; right:0; border:1px solid #333; width:100px; height:100px;}
  .box2{background:skyblue; width:200px; height:200px;}

  .inr{position:absolute; top:0; left:0; width:50px; height:50px; color:#fff;}
  .box1 .inr{background:blue;}
  .box2 .inr{background:red;}
</style>
<body>
  <div class="wrap">
     <div class="box1">
        <div class="inr">box1 inr</div>
     </div>
     <div class="box2">
        <div class="inr">box2 inr</div>
     </div>
  </div>
</body>

위의 예로 봤을 때,

.box1을 화면 기준으로 오른쪽으로 위로 고정을 시켜버렸고

그 안에 .inr도 fixed가 된 .box1을 기준으로 위치를 잡고있다.

 

fixed시킨 경우 화면을 기준으로 위치를 잡는거라 스크롤을 한다해도
항상 그 위치를 유지한다.

 

 

 

반응형
반응형

자바스크립트 데이터 타입 중 하나인 배열은 객체에 포함되는 개념이다.

 

1. 배열의 형태

형태는

var fruits = [
   "apple",
   "grape",
   "pineapple"
]

의 형태를 갖고있다.

 

2. 배열의 생성

배열을 만들 땐 객체와 유사하게

 

new 연산자를 사용하여 생성할 수 있고

리터럴 방식으로도 생성할 수 있다.

// new 연산자 사용
var 배열 = new Array();  // ()괄호 안에 숫자를 넣게되면 그 숫자에 맞는 빈 배열값들이 생성된다.

// var 배열 = new Array(3);
// var 배열 = [empty x 3]; // 빈 배열값 3개가 생성된다.


// 리터럴 방식
var 배열 = []

 

3. 배열에 접근 방법

배열에 접근하기 위해서는

[] 대괄호를 사용한다.

var fruits = [
   "apple",
   "grape",
   "pineapple"
]

fruits[0]  // "apple" 출력
fruits[1]  // "grape" 출력
fruits[2]  // "pineapple" 출력

fruits 라는 배열이 있다는 가정을 했을 때,

해당 배열에서 grape라는 값을 가져오고 싶다면 fruits[1]를 사용하고

원하는 값에 따라 그 순서를 맨 처음 0부터

그 자릿수로 접근할 수 있다.

 

또한,

원하는 값에 접근하여 내용을 수정할 수도 있다.

fruits[0] = "blueberry";

// fruits의 값은
// fruits = ["blueberry", "grape", "pineapple"];

 

4. 배열에 값 넣고 빼기

이미 생성된 배열에 내가 원하는 값을

추가로 넣거나 이미 들어가 있는 값을 뺄 수도 있다.

 

그 때 사용하는 함수가 push(), pop() 함수이다.

push()와 pop()은 각각 배열에 가장 뒤에 값을 추가하거나

가장 뒤에 있는 값을 제거할 수 있다.

var fruits = [
   "apple",
   "grape",
   "pineapple"
]

fruits.push("mango");

// fruits = ["apple", "grape", "pineapple", "mango"]
var fruits = [
   "apple",
   "grape",
   "pineapple"
]

fruits.pop();
// fruits = ["apple", "grape"]

fruits.pop("apple");  // pop에 빼고싶은 값을 넣으면 맨 뒤가 아닌 빼고싶은 값이 제거된다.
// fruits = ["grape"]

 

5. 배열의 길이 가져오기

배열에 저장되어 있는 값이 총 몇개가 들어가 있는지

그 길이를 가져오는 프로퍼티가 있다.

 

바로 length 이다.

var fruits = [
   "apple",
   "grape",
   "pineapple",
   "avocado"
]

fruits.length;  // 4 출력

 

 

 

반응형
반응형

객체 또한 자바스크립트에서 많이 사용되는 데이터 타입이다.

 

1. 객체의 형태

형태는

객체 = {
   속성1 : 값1,
   속성2 : 값2
}

의 형태를 갖고있다.

 

객체에 일반적인 값만 있을 경우

해당 속성을 그냥 속성, 혹은 프로퍼티라 부르고

 

객체의 속성에 함수가 들어가 있으면

그 속성은 메서드(method)라 부른다.

객체 = {
   속성(프로퍼티) : 값1,
   속성(메서드) : function(){} // 함수
}


var str = "안녕하새우";
str.length  // 문자열에서 length라는 속성의 값을 가져오는 프로퍼티
str.repeat() // 문자열에서 str에 있는 값을 반복하는 함수, 즉 메서드

 

 

2. 객체 만들기

일반적으로 객체를 만들 때는

var object = {};
var object2 = new Object();

위와 같이 {} 중괄호만 사용하여 객체를 생성하거나 (리터럴 방식)

new Object() 처럼 new 키워드를 통해 객체를 만들 수도 있다.

 

var student = {
   이름 : "박새로이",
   나이 : 45,
   키 : 235
}

그리고 위와 같이 처음 객체를 만들 때

바로 객체에 해당하는 값을 넣고 만들 수 있다.

 

3. 객체에 접근 방법

만들어진 객체에 접근을 하기 위해서는

크게 2가지 방법이 있다.

 

- .(점)을 이용한 접근

- [] 대괄호를 이용한 접근

 

이 2가지 방법의 차이는

변수를 넣을 수 있느냐 없느냐의 차이를 갖고 있다.

 

var student = {
   이름 : "박새로이",
   나이 : 45,
   키 : 235
}

예를 들어 위와 같은 student라는 객체가 있다고 했을 때,
해당 객체에 접근을 하기 위해서는

student.이름 
// or
student["이름"] 

 

의 방법으로 이름이라는 속성에 접근을 할 수 있는데

나이 라는 속성의 name을 변수로 만든다는 가정을 했을 때,

var 값 = "나이"; 

student.값   // 아무 값도 호출할 수 없다. 
student[값]  // student["나이"]로 변수값이 적용되어 값 45를 가져온다.

 

객체를 사용할 때 주로 .(점)을 사용하지만

 

위와 같이 변수를 가져와 특정 값을 가져와야 할 경우

[] 대괄호도 사용한다.

 

그리고 객체에 접근하여 객체에 저장된 값을 수정할 수도 있다.

var student = {
   이름 : "박새로이",
   나이 : 45,
   키 : 235
}

student.이름 = "벽세로이"

// console.log(student);
// {이름 : "벽세로이", 나이 : 45, 키 : 235}

 

4. 객체에 값 넣고 빼기

이미 만들어진 객체에 값을 넣기 위해서는

var student = {
   이름 : "박새로이",
   나이 : 45,
   키 : 235
}

student.주소 = "이태원";

// console.log(student);
// 출력값 : {이름 : "박새로이", 나이 : 45, 키 : 235, 주소 : "이태원"}

위와 같은 방법으로 객체명.속성 = 값 

입력해주면 원하는 값을 원하는 객체에 넣을 수 있다.

 

반대로 넣었던 값을 빼기 위해서는 delete 연산자를 사용해서 원하는 속성과 값을 제거할 수 있다.

var student = {
   이름 : "박새로이",
   나이 : 45,
   키 : 235
}

delete student.키;

// console.log(student);
// 출력값 : {이름 : "박새로이", 나이 : 45}

 

 

 

반응형
반응형

반복문을 사용하여 많이 연습하는 예제 중 하나인

별 찍기에 대해서 연습해보려 한다.

 

1. 별찍기 기본

*

**

***

****

*****

위 형태의 별 모양은 반복문을 돌려서 출력할 수 있다.

for (var i = 1; i <= 5; i++){  // 별 개수의 초기값 1; 최대 별 개수 5; 별개수는 1씩증가
   console.log("*".repeat(i)); // 문자열.repeat(n)이라는 함수로 문자열을 n번 만큼 반복할 수 있다.
}

 

또한 반대 모양인

*****

****

***

**

*

의 모양도 앞서 사용한 반복문을 응용해서 만들 수 있다.

for (var i = 5; i >= 1; i--){  // 별 개수의 초기값 5; 별 개수 최소값 1; 별개수는 1씩감소
   console.log("*".repeat(i));
}

 

2. 별찍기 응용

이제 별이 왼쪽에 붙는 형태가 아닌

오른쪽에 붙여서 별을 표현할 수 있다.

   

for(var i = 1; i <=5; i++){
   console.log(" ".repeat(5 - i) + "*".repeat(i)); 
}

// " "의 공백을 repeat()시켜줘서 별모양 앞에 여백을 준다.
// 이 때, 여백의 칸 수는 별의 수와는 다르게
// 4 -> 3 -> 2 -> 1 로 줄어들기 때문에 5 - i 를 적용시켜주었다.

반대의 경우

for(var i = 5; i >= 1; i--){
   console.log(" ".repeat(5 - i) + "*".repeat(i)); 
}

// 공백이 0 -> 1 -> 2 -> 3 -> 4 의 순서로 추가되기 때문에
// i 값이 5로 바뀐 상황에서 5 - i로 적용한다.

 

3. 별찍기 심화

이제 한 쪽으로 치우친 별이 아닌,

트리 형태, 거꾸로 된 트리 형태를 만들어 볼 것이다.

 

    *  

   ***

  *****

 *******

*********

for (var i = 1; i <= 9; i = i+2){  // 별의 최대 개수 9개; 별의 개수는 1-3-5-7-9로 2개씩 증가
   console.log(" ".repeat((9-i)/2) + "*".repeat(i))
}

// 공백의 수는 4 -> 3 -> 2 -> 1 로
// (9-i)/2 를 적용해준다.

 

거꾸로 된 트리 형태로는 아래의 소스를 적용할 수 있다.

for (var i = 9; i >= 1; i = i-+2){  // 별의 최대 개수 9개; 별의 개수는 1-3-5-7-9로 2개씩 증가
   console.log(" ".repeat((9-i)/2) + "*".repeat(i))
}

 

 

이 처럼 반복문을 사용해서 원하는 모양을 만들 수 있다.

 

 

 

반응형
반응형

자바스크립트 반복문을 사용하여 끝말잇기 게임을 만들 수 있다.

 

조건문과 반복문을 사용하고,

prompt() 라는 함수를 사용하여 사용자가 입력한 데이터를 받아서

끝말잇기 게임을 만들 수 있다.

for(var word = "첫단어"; true;){  // 처음에 입력한 단어를 만들고 true를 사용해 무한 루프를 돌린다.
   var answer = prompt(word);

   if (word[word.length-1] == answer[0]){  // word(첫단어)의 맨 마지막 글자와 대답한 데이터의 맨 첫 글자를 비교.
      word = answer;   // 위의 비교한 내용이 맞다면 내가 입력한 답이 다음 제시어(word)가 된다.
   }else {
      console.log("틀렸습니다.");
      break;   // 이 전 단어의 끝 글자와 내가 입력한 단어의 첫 글자가 다르다면 무한루프 반복문을 끝낸다.
   }
}

 

 

위와 같은 for문이 아닌 while 문을 사용해서도 끝말잇기를 만들 수 있다.

var word = "첫단어";

while (true){  // true로 하여 무한루프를 돌린다.
   var answer = prompt(word);
   if (word[word.length-1]){
      word = answer;
   }else{
      console.log("틀렸습니다.");
      break;
   }
}

 

 

 

 

반응형
반응형

자바스크립트 반복문을 연습하는 방법 중에 

가장 많이 하는 방법이 반복문을 이용해 구구단을 만드는 방법이 있다.

for (var i = 2; i <= 9; i++){
   for (var j = 2; j <= 9; j++){
      console.log(i + "*" + j + "=" + i*j);
   }
}

// 2*2=4
// 2*3=6
// 2*4=8
// ...
// 5*2=10
// 5*3=15
// 5*4=20
// ...
// 9*7=63
// 9*8=72
// 9*9=81

// 2단~9단까지의 내용이 각각 출력된다.

i는 각 단의 숫자를

j는 각 단별로 곱할 숫자를 나타낸다.

 

ex) i가 2일 때, j는 2~9까지 반복이 된다.

    2*2, 2*3 ~ 2*9로 반복된다.

    그리고 i가 2일 때의 반복이 끝나면, i는 3으로 증가하고

    j는 다시 2부터 9까지 반복이 된다.

 

 

위의 경우는 콘솔이 각각 출력이 되는데

구구단을 한 번에 출력을 하기 위해 변수를 사용하여

 

출력 될 값을 문자열에 담아서 한 번에 출력할 수도 있다.

var box = "";

for (var i = 2; i <= 9; i++){
    for (var j = 2; j <= 9; j++){
        box += i + "*" + j + "=" + i*j + "\t";   // \t 는 탭을 나타내는 인용부호
    }
    box += "\n";   // \n 은 줄바꿈을 나타내는 인용부호
}
console.log(box);


/*

2*2=4   2*3=6   2*4=8  ...  2*9=18
3*2=6   3*3=9   3*4=12 ...  3*9=27
...
...
9*2=18  9*3=27  9*4=36 ...  9*9=81

*/
// 위의 값이 한 번에 출력   

 

 

 

 

 

반응형
반응형

자바스크립트에서 조건문과 마찬가지로 중요한 개념이 반복문이다.

 

똑같은 내용을 여러번 반복해야 할 경우

console.log("반복이 필요해");
console.log("반복이 필요해");
console.log("반복이 필요해");
console.log("반복이 필요해");
console.log("반복이 필요해");
console.log("반복이 필요해");
console.log("반복이 필요해");
console.log("반복이 필요해");
console.log("반복이 필요해");
console.log("반복이 필요해");

// "반복이 필요해" 라는 문구가 10번 출력된다.

이런식으로 똑같은 내용을 여러번 복사, 붙여넣기를 해야한다.

 

하지만 자바스크립트에서는 반복문을 사용하면

복사, 붙여넣기의 반복이 아닌 단 몇 줄의 코드만으로 불필요한 복, 붙을 하지 않아도 된다.

 

1. for문

반복문 중에서도 가장 많이 사용되는 것이 for문이다.

for (초기화; 조건문; 증감){
   // 조건문 범위 내로 실행
}

for (var i = 0; i < 10; i++){
   console.log("반복이 필요해");
}

// "반복이 필요해" 10번 출력

1. 초기화 변수를 설정 (var 변수 = 초기값)

2. 반복할 조건 설정 (변수 <= 조건에 해당할 값)

3. 증가 or 감소값 설정 (변수++, 변수--, 변수*2...)

 

2. while문

var 변수 = 초기값;   // 초기값 설정
while (조건){
   // 조건이 참일 동안 계속해서 실행
   i++;  // 증,감
}


var i = 0;
while (i < 10){
   console.log("반복이 필요해");
   i++;
}

// "반복이 필요해" 10번 출력

1. 초기화 변수는 while문 이전에 설정 (var 변수 = 초기값)

2. 반복할 조건은 while(조건)에 입력

3. while문 안에 증가 or 감소값 설정

 

3. do while문

do while문은 do 영역 안에 있는 내용이 먼저 한 번 실행되고

while(조건)에 만족할 때 까지 do{}안에 있는 내용이 반복된다.

var 변수 = 초기값;  // 초기값 설정
do{
   // 우선 한 번 실행
   // while의 조건을 확인하고 참이면 계속 실행
   
} while(조건);


var i = 0;
do{
   console.log("반복이 필요해");
} while(i < 10);

// "반복이 필요해" 10번 출력

 

1. 초기화 변수는 do{} while() 문 이전에 설정 (var 변수 = 초기값)

2. 반복할 조건은 while(조건)에 입력

3. do{} 안에 증가 or 감소값 설정

 

 

 

반응형
반응형

if 조건문의 압축한 형태로 사용할 때 삼항 연산자를 사용한다.

 

var age = 20;
var LimitAge = (age >= 20) ? "가능한 나이 입니다." : "불가능한 나이 입니다.";

위와 같은 문법으로 사용할 수 있는데,

 

() 괄호 안에는 조건이 들어가고

조건 뒤에 ? 물음표 뒤엔 조건이 참일 경우에 실행될 값이,

: 콜론 뒤엔 조건이 거짓일 경우에 실행될 값이 들어간다.

 

위의 경우 age라는 변수가 20보다 크거나 같은 값이기 때문에 위의 조건은 참이 되고,

"가능한 나이 입니다." 라는 값이 적용된다.

 

위의 삼항연산자는 if문으로도 풀어서 사용이 가능하다.

var age = 20;

if (age >= 20){
   "가능한 나이 입니다."
}else{
   "불가능한 나이 입니다."
}

 

 

 

반응형
반응형

자바스크립트에서 중요하게 사용하는 문법 중에 하나인 조건문에 대하여 알아보려고 한다.

 

1. if (조건) {}

조건문(if문)의 사용법은

if (조건){
   실행
}

if 뒤에 괄호()에 조건을 입력하고

뒤에 나오는 중괄호{}에 입력한 조건이 참(true) 일 경우에 실행 될 내용을 적는다.

 

조건이 거짓일 경우 중괄호에 입력된 내용은 실행되지 않는다.

 

위의 코드 같은 경우 단순히 조건만 입력을 하면 그 조건은 참(true)이 되기에

"실행" 이라는 텍스트가 출력된다.

 

2. else if (조건) {}

단순히 한 가지의 조건이 아니라 추가로 여러개의 조건을 붙이고 싶을 때

else if(){} 문을 이용한다.

if (조건1){
   실행1
} else if(조건2){
   실행2
}

이렇게 조건문을 입력하게 되면 조건이 총 2가지가 적용 된 것이다.

 

조건1에 부합하면 실행1이 실행되고

조건2에 부합하면 실행2가 실행된다.

 

3. else{}

if와 else if에 적용한 조건 외에

그 어느 조건에도 해당하지 않는 경우에 특정 코드를 실행하기 위해서는

else{} 문을 사용한다.

if (조건1){
   실행1
} else if(조건2){
   실행2
} else{
   실행3
}

if와 else if에 걸어놓은 조건1, 조건2 그 어느것에도 부합하지 않을 경우

else{실행3}이 실행이 된다.

 

4. 조건문 예시

위에서 정리한 if, else if, else를 한 소스에서 정리해 예를 들어보자면

var color = "red";

if (color == "blue"){
   console.log("내가 원하는 색상은 blue!");
} else if(color == "red"){
   console.log("내가 원하는 색상은 red!");
} else if(color == "green"){
   console.log("내가 원하는 색상은 green!");
} else{
   console.log("내가 원하는 색상은 이 중에 없나보다...");
}

// "내가 원하는 색상은 red!" 출력

color라는 변수에 "red"라는 데이터와

두 번째 else if문의 "red" 와 일치하기 때문에 조건은 참이 되고

"내가 원하는 색상은 red!" 라는 텍스트가 출력이 된다.

 

 

반응형
반응형

자바스크립트에서 사용하는 데이터의 종류에는 크게 6가지가 있다.

 

1. 숫자 (Number)

2. 문자 (String)

3. 참, 거짓 (Boolean)

4. 객체 (Object)

5. undefinded

6. null

 

1. 각 데이터 입력 방법

- 숫자 (Number)

var number = 123;

 

- 문자 (String) : 문자형은 반드시 따옴표로 감싸줘야 한다.

var str = "String";

 

- 참, 거짓 (Boolean) : true(참)은 1, false(거짓)은 0이다.

var bool = true;  // 참
var bool = false;  // 거짓

 

- 객체 (Object)

var obj = {
   id : "abcdqbbq",
   phonenum : 01012345678
};

 

2. undefinded vs null

undefinded와 null은 둘 다 값이 없음을 나타낸다.

둘 다 아무런 값이 없는 상태인데 왜 다르게 사용이 된건지에 대한 의문이 많이 있을 것이다.

 

둘을 비교해보자면

 

undefinded는 정말로 아무런 값이 선언되지 않은 값이고

null은 명시적으로 값이 비었음을 나타내는 무의미한 '빈 값'이다.

var test;  // 변수에 값이 없으므로 undefinded 출력

var test2 = null;  // null을 값으로 넣었으므로 빈 값이지만 null 출력

그래서 null 값의 경우 특정 변수나 함수에서 일부러 임의의 빈 값을 넣을 때 사용된다.

 

3. 데이터 타입 비교

내가 사용한 데이터가 어떤 형식인지를 확인하기 위해서는

typeof 를 사용하면 된다.

그럼 해당 변수가 어떤 데이터 타입을 갖고 있는지 알 수 있다.

var num = 123;
var str = "String";
var bool = true;
var obj = {
   id : "abcdqbbq",
   phonenum : 01012345678
};
var test;
var test2 = null;

console.log(typeof num); // number 출력
console.log(typeof str); // string 출력
console.log(typeof bool); // boolean 출력
console.log(typeof obj); // object 출력
console.log(typeof test); // undefinded 출력
console.log(typeof test2); // null 출력

 

4. 데이터 타입 변환(암시적 변환)

문자면 문자 숫자면 숫자, 정해진 데이터 타입에서 특정 경우에는

데이터 타입이 변경이 된다. 

예를들면 문자 + 숫자, 숫자 + 참,거짓이 연산이 되면 

데이터 타입이 변경 된다.

var num = 123;
var str = "String";
var bool = true;

var numnum = num + num;  // 246, typeof : number
var numstr = num + str;  // "123String", typeof : string
var numbool = num + bool;  // 124, typeof : number
var strbool = bool + str;  // "trueString", typeof : string
var boolbool = bool + bool;  // 2, typeof : number

var numstrbool = num + str + bool;  // "123Stringtrue", typeof : string
var numboolstr = num + bool + str;  // "124String", typeof : string

var numboolMulti = num * bool;  // 123, typeof : number
var numstrMulti = num * str;  // NaN, typeof : number

위의 소스를 살펴보면 몇 가지 데이터 타입의 특징을 알 수 있다.

 

1. number + string = string이 된다.

2. number + boolean은 boolean의 1(true) 혹은 0(false) 에 의해 숫자와 만나면 연산이 된다.

3. boolean + string = string이 된다.

4. boolean + boolean =  number이 된다.

5. number + string + boolean = string이 되지만

   number + boolean + string은 number와 boolean의

   연산된 값과 string이 더해진 상태로 string이 된다.

6. number * boolean은 연산이 되고, number이 된다.

7. number * string은 연산이 되지 않고 NaN(Not a number)라는 값이 나타난다.

NaN (Not a number)은 숫자형(number)이다.

 

라는 몇 가지 특징이 나타난다.

여기서 유심히 살펴볼 것은 string이 더해지면 결국엔 다 string이 되고

string은 * 연산이 적용되지 않고 number 혹은 boolean은 * 연산이 적용된다는 사실을 알 수 있다.

 

5. 데이터 타입 변환(명시적 변환)

특정한 연산에 의해 자연스레 타입이 변경되는 것이 아니라

특정 함수를 사용하여 명시적으로 타입을 변환할 수 있다.

 

- String() : 숫자를 문자형으로 변환한다.

- toString() : 숫자를 문자형으로 변환한다.

- Number() : 문자형을 숫자형으로 변환한다.

- parseInt() : 문자형을 정수로 변환한다.

 

var num = 123;
var str = "123";
var str1 = "string";
var bool = true;

var numToStr = String(num);  // "123", typeof : string
var numToStr2 = num.toString();  // "123", typeof : string

var boolToNum = Number(bool);  // 123, typeof : number
var strToNum = Number(str);  // 123, typeof : number
var strToNum2 = Number(str1);  // NaN, typeof : number

var strToNum1 = parseInt(str);  // 123, typeof : number

여기서 주목할 점은 Number(str)은 숫자형으로 변경이 되었지만

Number(str1)은 NaN이 나오는 것을 볼 수 있다.

 

str의 값은 "123", str1의 값은 "string"이 담겨있었는데,

문자형이라 하여도 따옴표 안에 숫자가 담겨있었으면 Number() 함수를 이용해서

숫자형으로 변경할 수 있지만

문자가 하나라도 들어가 있으면 숫자형으로 변경할 수 없다는 사실을 알 수 있다.

 

 

 

반응형
반응형

자바스크립트를 사용하면서 가장 기본이 되고 중요한 내용 중에 하나가

바로 '변수' (variable) 이다.

 

변수는 언제든 변할 수 있는 수로

변할 수 있는 데이터를 담는 상자라고 생각하면 된다.

 

1. 변수의 선언

변수 선언 즉, 변수에 데이터를 담는 방법은

var 변수명 = 값;

의 방식으로 선언할 수 있다.

 

var이라는 문자 뒤에 선언 할 변수명을 입력하고

'=' 을 통해 데이터를 담을 수 있다.

 

ex) var test = "값";

 

또 다른 방법으로는 변수를 미리 선언한 뒤에

값을 따로 넣어주는 방법이 있다.

 

ex) var test;  // 변수선언

     test = "값"  // 값 대입

 

물론 test라는 변수는 언제 어디서든 필요할 때 마다

그 값을 바꿀 수 있다.

 

2. 변수명 규칙

변수를 선언할 때 필요한 변수명은 아무 내용이나 지정할 수는 없다.

나름대로의 변수명의 규칙이 존재한다.

 

- 변수는 대, 소문자 구분이 된다.

ex) var test 와 var Test는 다른 변수이다.

- 첫글자에 숫자 사용은 불가능 하다.

- 한글도 사용이 가능하지만 가능하면 영어로

- 숫자도 사용 가능

ex) var 123

- 특수문자는 $(달러), _(언더바) 만 사용할 수 있다. (그 외의 특수문자는 불가능)

 

 

 

반응형
반응형

Sass가 css와 다른 중요한 특징 중에 하나는

바로 Nesting이다.

즉, css를 중첩해서 사용할 수 있다는 것이다.

 

개인적으로 이 속성이 Sass의 가장 큰 매력이라고 생각한다.

 

css와 Sass의 소스를 비교해보면 어떻게 다른지,

어떤 점이 그렇게 매력적인지 알 수 있다.

/* css */
.main .content{text-align:center;}
.main .content p{text-align:left;}
.main .content span{display:inline-block;}
.main .content .txt p{color:red;}

/* Sass (SCSS) */
.main{
   .content{
      text-align:center;
      p{text-align:left;}
      span{display:inline-block;}
      .txt p{color:red;}
   }
}

위의 소스를 보면 .main 이라는 클래스 하위에 있는 영역들에 대한 수정을 하는 내용임을 알 수 있다.

 

.main 아래 .content 아래 p나 span등을 수정하기 위해서는

.main이라는 클래스를 상속해야하기 때문에 매번 .main을 반복해서 작성을 해야한다.

 

하지만 Sass 문법을 적용하게 되면

.main 이나 .content와 같이 반복되는 클래스 들을 한 번만 작성하여

편리함을 누릴 수 있다.

 

위의 소스만 봤을 때 css가 더 사용하게 편해보일 수도 있지만

방대한 양의 소스를 작성하다보면 Sass의 편리함에 감탄하게된다.

 

반응형

'Frontend > Sass (SCSS)' 카테고리의 다른 글

[Sass 특징] @at-root  (0) 2020.05.06
[Sass 특징] Sass 데이터 타입(값) 소개  (0) 2020.04.02
[Sass 특징] @mixin 과 @include  (0) 2020.03.27
[Sass 특징] 변수  (0) 2020.03.17
Sass란?  (0) 2020.03.04
반응형

변수는 모든 프로그래밍 언어에서 정의되는 내용으로

반복되는 내용을 복사/붙여넣기로 사용하는 것이 아닌

 

임의의 값을 만들어 반복되는 내용을 담아 놓고 재사용 할 수 있게 해준다.

 

1. Sass에서의 변수

Sass 문법에서도 변수라는 개념이 존재한다.

변수 선언은 '$' 특수문자로 선언한다. (ex. $test : 0;)

 

Sass를 사용하면서 변수가 필요한 상황을 예를 들자면

 

특정 페이지에서 주로 사용되는 포인트 컬러값이 빨간색이라고 했을 때,

border-color, background-color, color의 값을 특정 영역별로

 

border-color : red;

background-color : red;

color : red

를 반복적으로 사용해야 할 것이다.

 

또한 이렇게 반복적으로 사용한 값이

디자인 개선 작업과 같이 포인트 컬러값을 변경하는 일이 생겼을 경우

 

각 영역을 일일이 찾아서 바꿔줘야 할 것이다.

 

이러한 번거로움을 개선하기 위해 Sass에서도 변수를 지원한다.

/* CSS */
.main{border:1px solid red; background-color:red;}
.main p{color:red;}
.main .box{background:red; color:red;}

/* SCSS */
$color : red;
.main{
   border:1px solid $color; background-color:$color;
   p{color:$color;}
   .box{background:$color; color:$color;}
}

위의 소스 같이 css로 변수선언 없이 작업을 하다보면

각 영역별 color값 red를 변경해야 하는 경우 일일이 찾아서

바꿔줘야하지만

 

아래 Sass(SCSS) 소스의 경우 $color의 값만 변경해주면

다른 영역들의 color 값을 손쉽게 동시에 변경할 수 있다.

 

2. 변수의 범위

Sass에서 변수의 범위는 크게 전역변수/지역변수로 나눌 수 있다.

 

전역변수는 말 그대로 Sass문법이 적힌 전체 영역에 해당하는 변수를 선언하는 것이고

지역변수는 특정 블럭 영역 안에 변수의 범위를 한정하여 선언하는 것이다.

 

/* 전역변수 선언 */
$color : red;

.test1{
   /* 지역변수 선언 */
   $size : 12px;
   
   color : $color;
   font-size : $size;
}

.test2{
   border-color : $color;
   
   /* 에러 출력 (선언된 $size 변수가 없음.) */
   font-size : $size;
}

위의 소스처럼 .test1의 영역 안에 $size라는 변수를 선언해서 사용을 하였는데

이 변수를 .test2에서는 가져와서 사용할 수 없다.

 

그렇기 때문에 위의 소스를 출력했을 때 에러가 출력된다.

 

3. 변수의 정의 (!default, !global)

Sass에서 변수를 정의할 때 !default, !global 플래그와 함께 작성할 수 있다.

 

!default의 경우,

기존에 정의된 변수의 값이 있을 경우 기존 변수의 값을 유지하고

새로 값을 따로 적용시키지 않는다.

/* 변수 선언 */
$color : red;
$color : blue !default;

.test1{
   /* color : red 출력 */
   color : $color;
}

위의 경우와 같이 $color 변수가 이미 red 값으로 선언이 되어있었기 때문에

$color: blue에 !default 선언한 경우 선언한 변수의 값이 무시되어 color:red 값이 결국 출력이 되었다.

 

반면에

기존 변수에 'null' 값이 들어가 있었을 경우

!default 를 사용하면 해당 변수값이 적용된다.

/* 변수 선언 */
$color : null;
$color : blue !default;

.test1{
   /* color : blue 출력 */
   color : $color;
}

 

 

!global의 경우,

2번 변수의 범위에서 말했듯 변수에는 지역변수/전역변수의 개념이 존재하는데

지역변수 영역에 선언한 변수를 전역변수로 사용할 수 있도록 만든다.

/* 전역변수 선언 */
$color : red;

.test1{
   /* 지역변수 선언 & !global 사용으로 전역변수화 */
   $size : 12px !global;
   
   color : $color;  // color: red;
   font-size : $size;  // font-size: 12px;
}

.test2{
   border-color : $color;  // color: red;
   font-size : $size;  // font-size: 12px;
}

 

 

 

반응형

'Frontend > Sass (SCSS)' 카테고리의 다른 글

[Sass 특징] @at-root  (0) 2020.05.06
[Sass 특징] Sass 데이터 타입(값) 소개  (0) 2020.04.02
[Sass 특징] @mixin 과 @include  (0) 2020.03.27
[Sass 특징] Nesting (중첩)  (0) 2020.03.19
Sass란?  (0) 2020.03.04

+ Recent posts