브라우저와 브라우저의 동작방식에 대해서 심도 있게 학습하고, 유저에게 다이나믹한 경험을 줄 수 있는 반응형 웹, CSS 애니메이션, Canvas를 배우고 익히자!
기술 면접 단골임! 콜메모리, 브라우저 엔진
우리같은 프론트엔드 개발자는 브라우저가 어떻게 동작하고 렌더링되는지 알아야한다! 우리의 코드는 브라우저라는 소프트웨어 프로그램 상에서 수행되기 때문
GUI 기반의 소프트웨어 프로그램.
브라우저는 페이지를 다운로드 하기 위해 응용 계층의 대표적인 프로토콜인 HTTP를 통해 송수신
즉, 웹을 보여주기 위한 프로그램이라 생각하면 된다. 크롬, 사파리, IE&엣지, 파폭 등이 있다.
네트워크 배웠던거 복습시간이다!
자세하게 얘기하자면
우리는 크롬을 많이 쓰기에 알아둬야하는 부분이다.
V8 엔진의 메모리 구조는 크게 Heap Memory와 Call Stack으로 구성
힙(heap)은 동적 메모리 할당에 사용되는 자료구조, 여기에 저장되는 메모리는 V8 엔진 내부에서 가장 큰 공간을 차지하고 있으며, 가비지 컬렉션 또한 발생하는 곳
printSquare()
, square
함수, multiply
함수까지 성공적으로 실행console.log
도 같은 과정으로 콜스택에 쌓임쿠키 자체의 보안상 취약과 더불어 저장소의 절대적인 허용 용량의 적음으로 다른 대안을 찾게 되었고, 이윽고 웹 스토리지(Web Storage)가 출시
HTML, CSS, JavaScript 등 개발자가 작성한 문서가 브라우저에서 출력되는 과정
프로그래밍 언어로 작성된 파일을 실행시키기 위해 구문 분석(syntax analysis)을 하는 단계, 일종의 인터프리터나 컴파일러 구성 요소 가운데 하나
파서가 파싱하여 한 HTML 파일에서 DOM 트리, CSSOM 트리, Render 트리가 나올 수 있음
<link>
, <style>
태그를 만나게 되면 파싱을 잠시 멈추고 해당 리소스 파일을 서버로 요청, CSS 코드를 파싱하여 CSSOM 트리를 구축. 완료 후 멈췄던 파싱 구간으로 돌아감.여기선 웹 레이아웃 짜기 이런 개념과 다른 부분임
렌더트리를 기반으로 HTML 요소의 레이아웃(위치, 크기 등)을 계산하여 브라우저 화면 어디에 배치할 지 결정하는 과정
아직까지 렌더 트리는 텍스트로 구성된 객체로만 보여 페인팅이라는 작업을 거쳐야지 브라우저 위의 화면으로 그려지게 됨
레이아웃에서 결정된 대로 그림을 그리기 시작하는, 이런 픽셀에 대한 정보들을 바탕으로 픽셀을 채워나가는 과정
단순히 주소창에 주소를 검색해서 웹 사이트를 모니터를 통해 눈으로 확인할 뿐이지만, 그 내부에서 브라우저가 어떤 과정을 통해 웹 사이트를 띄우는지 살펴보면 굉장히 복잡한 과정이 빠르게 수행되고 있다는 것을 알 수 있게 됐다.
프론트엔드 엔지니어로서 브라우저 렌더링 과정을 알아둔다면 렌더링 최적화 시 어떤 단계에서 최적화를 시켜야 할 지 알 수 있게 된다.
위에서 봤던 것처럼 과정이 복잡하고 많다. 하지만 웹 앱으로 가는 추세 속에서 사용자가 요소들과 상호작용하며 CRUD 행위를 하는데 만약 최적화가 안돼있다면?
거기에 사용자의 눈에 일련의 과정이 부드럽게 처리 되려면 초당 60 프레임은 반드시 유지해야만 하는데?
리플로우, 리페인트가 일어나고 최적화가 안돼있기에 프레임드랍이 일어나 UX가 떨어진다!
그렇다면 최적화를 꼭 시켜야겠지?
기술 면접에서도 자주 물어보는 내용이기 때문에 꼭 숙지
현대에 들어서고 JSON이 나오며 동적 스킬이 대두되고, 구글 지도를 거치며 웹 앱에 대한 길이 열리며 상호작용의 중요도 증가 + 각각 다른 비율의 디스플레이를 가진 기기들이 출시되며 여러가지 버전의 웹페이지를 가지는, 다양성을 보이는 웹이 UX 측면에서 큰 반응을 얻는다. 그래서 프엔 개발자라면 필수 스킬이므로 배워두자
브라우저의 크기(스크린의 크기, 디바이스의 종류)에 실시간으로 반응하여 크기에 따라 레이아웃이 변하는 웹 사이트
반응형 웹하면 바로 떠오르는 전략이다.
Luke Wroblewski가 고안한 전략이자 철학으로 사용자 경험(UX)을 디자인할 때 모바일일 경우에 최우선으로 초점을 맞춰 디자인하는 것
데스크탑 유저보다 모바일 유저가 공유하는 정보가 많고, 늘리는 쪽이 개발하기 편해서이다! 그렇다고 모바일 웹을 늘려놓은 형태는 데탑 UX를 해치겠죠?
m.naver.com
은 반응형 웹이 아님!구체적인 조건으로 필요한 스타일을 적용
뷰포트(브라우저 창)의 크기에 따라 서로 다른 조판을 생성할 수 있기 때문에 많이 씀
미디어 속성 내 해당 조건을 만족할 때에만 해당 스타일을 적용
기본 구조
all
: 모든 미디어 타입print
: 프린터screen
: 컴퓨터 화면speech
: 스크린 리더min-width
와 max-width
, width
등의 미디어 기능을 활용orientation
/* 400px~1000px */
<link href="css파일이름.css" media="screen and (min-width: 400px) and (max-width: 1000px)" rel="stylesheet">
<style type="text/css" media="screen and (min-width: 400px) and (max-width: 1000px)">
/* 여기 css를 작성 */
</style>
@media 미디어 타입 (조건(너비 및 높이)) {
(CSS 입력하는 부분)
}
--예제
@media screen (max-width: 400px) {
body {
color: red;
}
}
@media (orientation: landscape) {
body {
color: rebeccapurple;
}
}
논리곱(and), 논리합(or), 부정(not)
/* 논리곱: and를 사용 */
@media screen and (min-width: 400px) and (orientation: landscape) {
body {
color: blue;
}
}
/* 논리합: 콤마로 분리 */
@media screen and (min-width: 600px), screen and (orientation: landscape) {
body {
color: blue;
}
}
/* 부정: not, 방향이 세로인 경우에만 텍스트가 파란색으로 적용 */
@media not all and (orientation: landscape) {
body {
color: blue;
}
}
CSS 애니메이션을 제대로 주는 법과 HTML 태그의 캔버스에 대해서 알아보자!
CSS 스타일을 부드럽게 커스텀 가능한 키워드이다!
1. 먼저 CSS로 키프레임 블록을 만들어아한다.
/* '%' 단위로 시간 진행에 따른 상태를 작성해주면 됨 */
@keyframes 애니메이션이름 {
0% { /* from 이라고 작성해도 됨 */
CSS속성 : 속성값;
}
50% { /* 애니메이션 진행도에 따른 스타일을 설정 */
/* 필요하다면 1부터 99까지도, 소수점까지도 모두 작성해도 됨*/
CSS속성 : 속성값;
}
100% { /* to 라고 작성해도 됨*/
CSS속성 : 속성값;
}
}
animation
속성을 넣어 부여한다.@keyframes lotate {
0% {
transform : rotate(0deg)
}
50% {
transform : rotate(180deg)
}
100% {
transform : rotate(360deg)
}
}
animation : 띄어쓰기로 쭉 나열하면 아래의 속성들을 한 번에 지정할 수 있음
animation-name
: 애니메이션의 중간 상태를 지정하는 이름. @keyframes 블록에 작성@keyframes
과 연결해주는 장치animation-duration
: 한 싸이클의 애니메이션이 재생될 시간 지정animation-delay
: 애니메이션의 시작을 지연시킬 시간 지정animation-direction
: 애니메이션 재생 방향을 지정normal
: 기본 값. 재생이 끝나면 처음부터 다시 재생reverse
: 역방향으로 재생alternate-reverse
: 역방향부터 순방향을 번갈아가며 재생animation-iteration-count
: 애니메이션이 몇 번 반복될지 지정animation-play-state
: 애니메이션을 재생 상태. 멈추거나 다시 재생 시킬 수 있음animation-timing-function
: 중간 상태들의 전환을 어떤 시간간격으로 진행할지 지정animation-fill-mode
: 애니메이션이 재생 전 후의 상태 지정none
: 기본 값. 재생중이 아닌 경우 요소의 스타일을 유지forwards
: 재생중이 아닌 경우 마지막 키프레임 스타일을 유지backwards
: 재생중이 아닌 경우 첫 번째 키프레임 스타일을 유지both
: 재생 전에는 첫 번째 키프레임 스타일을, 재생 후에는 마지막 키프레임 스타일을 유지@keyframes
와 애니메이션 속성을 합쳐보자!
#logo {
**animation-name : lotate;** /* lotate 라는 이름의 키프레임 애니메이션을 */
animation-duration : 3s; /* 3초 동안 재생하며, */
animation-iteration-count : infinite; /* 애니메이션을 무한 반복하고, */
animation-timing-function : linear; /* 선형으로 재생 */
}
/* 아래와 같이 일괄 작성해도 동일하게 적용 */
#logo {
animation : **lotate** 3s infinite linear;
}
이처럼 중간값을 지정해 다양한 애니메이션을 줄 수 있다!
<div class="blueBall"></div>
<div class="redBall"></div>
이 두개의 div 가지고 만들어보았다.
@keyframes blueBall {
0% {
top: 0px;
background-color: #fff;
}
95% {
width: 100px;
background-color: cornflowerblue;
}
to {
top: 300px;
width: 115px;
height: 90px;
transform: translate(100px, 100px);
background-color: rgb(56, 94, 165);
}
}
@keyframes redBall {
0% {
left: 0px;
background-color: #fff;
}
90% {
width: 100px;
background-color: #e84545;
}
to {
left: 300px;
width: 100px;
height: 100px;
transform: translate(100px, 100px);
background-color: red;
}
}
div.blueBall {
position: relative;
left: 100px;
top: 0;
width: 100px;
height: 100px;
border-radius: 50%;
background: blue;
animation: blueBall 1s ease-in Infinite Alternate;
}
div.redBall {
position: relative;
left: 100px;
top: 0;
width: 100px;
height: 100px;
border-radius: 50%;
background: red;
animation: redBall 1.5s ease-out Infinite Alternate;
}
이런 식으로 만들 수 있다!
HTML의 <canvas>
태그 + JS(DOM) = 다양한 그래픽 요소
<canvas id="canvas">
캔버스를 지원하지 않는 브라우저에서는 캔버스 대신 태그 사이 내용이 표시됩니다.
</canvas>
이제 자바스크립트를 사용해서 엘리먼트를 선택
const canvas = document.querySelector("#canvas");
캔버스는 canvas 엘리먼트를 DOM으로 조작하는 방식으로 작성된다. 따라서 엘리먼트를 선택할 때 사용할 id를 작성해야한다!
너비와 높이를 설정해야한다! HTML과 JS 각각 써줄 수 있으며 각자 특징이 있다.
이 방법에 width
, height
속성은 어떤 단위로 속성값을 설정해주든 픽셀로만 인식
<canvas id="canvas" width="500" height="500"></canvas>
// 500픽셀 * 500픽셀로 설정됩니다.
<canvas id="canvas" width="50vw" height="40vh"></canvas>
// vw, vh를 전달했지만 50픽셀 * 40픽셀로 설정됩니다.
유동적인 값도 설정해줄 수 있기 때문에 캔버스의 크기가 고정되어있지 않은 경우에 사용
canvas.width = 50vw;
canvas.height = 40vh;
// DOM으로 설정하면 50vw * 40vh 로 단위값을 지정해도 설정 가능
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
// 화면 크기에 맞춰서 설정 가능
클릭하면 사각형이 나오는 식으로 해보겠다!
fillStyle
속성으로 사각형 내부를 색칠할 색상을 설정fillRect
메소드를 사용해 사각형을 그려줌ctx.fillStyle = 'blue'
ctx.fillRext = (10, 10, 100, 50)
//전달 인자는 순서대로 x좌표, y좌표, 가로길이, 세로길이
lineWidth
속성으로 선의 굵기를, strokeStyle
속성으로 선의 색상을 설정해줍니다.strokeRect
메소드를 사용해 사각형을 그려줍니다.ctx.lineWidth = 5;
ctx.strokeStyle = "black";
ctx.strokeRect(10, 10, 100, 50)
// 전달 인자는 이번에도 순서대로 x좌표, y좌표, 가로길이, 세로길이
// 위에서 그려준 색칠된 사각형 바로 위에 그려보기
clearRect
메소드로 지울 범위를 설정ctx.clearRect( 20, 20, 80, 30)
// 전달 인자는 역시 동일하다. 그려놓은 사각형 가운데 부분을 지워보세요.
클릭이벤트가 일어날 때의 마우스의 위치 구하고 거기에 사각형이 생기는 코드 넣어주기
event.clientX
event.clientY
ctx.canvas.offsetLeft
ctx.canvas.offsetTop
event.offsetX
, event.offsetY
로 바로 구할 수도 있음!!canvas.onclick = function (event) {
const x = event.clientX - ctx.canvas.offsetLeft
const y = event.clientY - ctx.canvas.offsetTop
// 구한 좌표를 이용해서 사각형을 그리는 코드를 작성
ctx.fillRect(x - 15, y - 15, 30, 30);
// 클릭할 때마다 30픽셀*30픽셀 크기의 사각형을 그리도록 하려고 한다.
// 이 때, x, y를 그대로 전달하면 해당 좌표부터 사각형이 시작되어 어색한 느낌을 줌
// 클릭한 위치를 사각형의 정중앙이 되게 하려면 사각형크기/2 한 만큼 좌표에서 빼주면 됨
// 따라서 x - 15, y - 15 를 전달
}
const canvas = document.querySelector("#canvas");
const ctx = canvas.getContext("2d");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
canvas.onclick = function (event) {
const x = event.clientX - ctx.canvas.offsetLeft;
const y = event.clientY - ctx.canvas.offsetTop;
ctx.fillStyle = "#8EC3B0";
ctx.fillRect(x - 15, y - 15, 30, 30);
};
캔버스 기반 유용하게 쓸 수 있는 라이브러리 Chart.js가 있다. 그것도 한번 보자
CDN 및 너비와 높이를 결정해 차트의 치수를 결정
차트의 너비와 높이의 비율은 캔버스의 너비와 높이에 따라 비례하게 설정
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.js" ></script>
</head>
<body>
<canvas id="myChart" width="600" height="400"></canvas>
</body>
DOM을 이용해 인스턴스화 후 label
및 data
를 정의한 뒤, config
객체 안에 넣어 Chart constructor에 전달
myChart
변수를 선언myCanvas
변수를 전달config
객체에서는 Chart.js가 차트를 그리는데 필요한 모든 정보가 포함type
키를 통해 그리고자 하는 차트의 유형을 지정할 수 있습니다.line
, bar
, radar
, polarArea
, pie
, doughnut
, bubble
data
키에는 실제 데이터들을 담고 있음.backgroundColor
키는 막대 별로 색상을 다르게 하기 위해서 사용. 기본값은 rgba(0, 0, 0, 0.1)let myCanvas = document.getElementById("myChart").getContext("2d");
const labels = [
'January',
'February',
'March',
'April',
'May',
'June',
];
const data = {
labels: labels,
datasets: [{
label: 'My First dataset',
backgroundColor: 'rgb(255, 99, 132)',
borderColor: 'rgb(255, 99, 132)',
data: [0, 10, 5, 2, 20, 30, 45],
}]
};
const config = {
type: 'line',
data: data
};
// 이 부분이 chart constructor
const myChart = new Chart(
myCanvas,
config
);