오늘의 공부목차
1. 변형과 전환효과
2. 애니메이션 효과
3. 상속과 공용키워드
4. 반응형 웹과 뷰포트단위
5. 미디어쿼리
6. 모듈화 디자인
7. 과제 - 말풍선 추가하기
transform
속성을 사용translate(x,y)
: 지정한 크기만큼 x축, y축 방향으로 이동한다.scale(x,y)
: 지정한 크기만큼 x축, y축으로 확대 및 축소한다.skew(x,y)
: 지정한 각도만큼 x축, y축으로 비틀어 왜곡한다.totate(deg)
: 지정한 각도만큼 회전한다.<transition 하위 속성들>
property
: 변화 대상 속성을 지정한다.duration
: 변화가 실행될 시간을 지정한다.delay
: 변화 시작 전 지연 시간을 지정한다.timing-function
: 변화 실행시 실행 곡선 방식을 지정한다.transition-timing-function
별도 키워드
ease
: 기본값으로, 점점 속도가 빨라지다가 끝날 때 다시 느려지는 방식이다.linear
: 처음부터 끝까지 같은 속도로 진행한다.ease-in
: 느리게 시작했다가 점점 빨라진다.ease-out
:빠르게 시작했다가 점점 느려진다.name
: 적용할 키프레임 이름duration
: 애니메이션 지속시간delay
: 애니메이션 시작 전 시간timing-function
: 속도 그래프direction
: 동작 진행 방향iteration-count
: 반복 횟수fill-mode
: 전후 상태 설정play-state
: 애니메이션 적용 여부inherit
: 상위 요소로부터 해당 속성의 값을 받아 사용한다.initial
: (브라우저에 지정되어 있는) 해당 속성의 기본값을 요소에 적용한다.unset
: 상속 속성에 대해서는 inherit처럼, 상속되지 않는 속성에 대해서는 inital처럼 적용된다.반응형 웹이란,
다양한 기기나 브라우저의 크기에 맞게 구성이나 크기를 변경해가며 반응하는 웹문서 또는 이를 위해 사용하는 기법을 뜻한다.
뷰포트란,
현재 화면에 보여지고 있는 영역을 의미한다.
기기별로 뷰포트가 다르기 때문에, 동일한 웹페이지라도 기기에 따른 배율 조정이 발생해 화면의 크기가 다르게 보이는 현상이 나타난다.
vw
: 뷰포트 너비의 100분의 1vh
: 뷰포트 높이의 100분의 1vmin
: 뷰포트 너비와 높이 중 작은 쪽의 100분의 1vmax
: 뷰포트 너비와 높이 중 큰 쪽의 100분의 1
미디어쿼리는 미디어 타입을 인식하고, 컨텐츠를 읽어들이는 기기나 라우저의 물리적 속성을 감지할 수 있는 유용한 모듈이다.
min-width
: 디스플레이 영역의 최소 너비
max-width
: 디스플에이 영역의 최대 너비
min-height
: 디스플레이 영역의 최소 높이
max-height
: 디스플레이 영역의 최대 높이
orientation
: portrait 또는 landscape 감지
color
: 기기의 색상당 비트 수
color-index
: 출력 기기의 색상 테이블 수
aspect-ratio
: 디스플레이 영역의 너비와 높이의 비율
모듈화 디자인의 이점
- 반응형 컴포넌트를 만들고, 그것들을 조립해 하나의 페이지를 만들면 페이지는 자연스럽게 반응형 페이지가 된다.
- 스타일 재사용이 용이하다.
- 페이지의 일관성을 유지하기가 용이하다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link href="chat.css" rel="stylesheet" />
<link href="text.css" rel="stylesheet" />
<title>채팅방 만들기</title>
</head>
<body>
<div class="container">
<main class="chat-screen">
<section class="chat-screen__bar">
<div class="user">
<div class="user__column">
<div class="user__pic"></div>
</div>
<div class="user__column">
<div class="user__nick">친구</div>
<div class="user__count">2</div>
</div>
</div>
</section>
<ul class="chat-screen__texts">
<li class="text">야</li>
<li class="text">뭐하냐</li>
<li class="text">나 심심해</li>
<li class="text">놀아줘</li>
<li class="text">바빠?</li>
<li class="text">자냐?</li>
<li class="text">아 답장 좀</li>
<li class="text">아 뭐하냐구</li>
<li class="text">후엥</li>
<li class="text">으아아아아아ㅏ아ㅏ 심심해</li>
<li class="text">연락주삼</li>
<li class="text">나 연락 기다린다</li>
<li class="text">심심해 죽어가는 너의 친구가</li>
</ul>
</main>
<form class="chat-form">
<section class="chat-form__filed">
<textarea class="chat-form__msg"></textarea>
<input type="submit" value="전송" class="chat-form__btn" />
</section>
</form>
</div>
</body>
</html>
/*chat.css*/
* {
box-sizing: border-box;
}
/* 'height:100%' 화면을 꽉 채워서 쓰겠다는 의미 */
html {
height: 100%;
}
body {
height: 100%;
margin: 0;
}
/* body에는 기본적인 마진이 존재한다. 0px로 작성해 마진을 없애준다. */
.container {
height: 100%;
background-color: rgb(147, 190, 138);
}
/* 스크린 크기 조정 */
.chat-screen {
height: calc(100% - 120px);
overflow: scroll;
}
/* 유저 정보 표시되는 부분 */
.user {
background-color: antiquewhite;
padding: 16px;
height: 80px;
}
.user__column {
float: left;
}
.user__pic {
width: 50px;
height: 50px;
margin-right: 10px;
border-radius: 10px;
background-color: rgb(147, 190, 138);
}
.user__nick,
.user__count {
margin: 5px;
}
.user__count {
font-size: 12px;
color: gray;
}
/* 채팅 입력창 */
.chat-form {
height: 120px;
background-color: antiquewhite;
}
.chat-form__filed {
height: 120px;
}
.chat-form__msg {
width: calc(100% - 120px);
height: 120px;
border: none;
font-size: 24px;
padding: 10px;
resize: none;
float: left;
}
.chat-form__btn {
width: 120px;
height: 120px;
border-radius: 10px;
background-color: rgb(147, 190, 138);
font-size: 18px;
}
.chat-form__btn:hover {
background-color: rgb(105, 145, 165);
}
.chat-form__btn:active {
background-color: rgb(71, 94, 67);
}
.chat-form__msg:focus {
outline: none;
}
/*text.css*/
.chat-screen__texts {
padding: 0;
list-style-type: none;
}
.chat-screen__texts > .text {
background-color: antiquewhite;
width: 280px;
height: 50px;
margin: 0 0 10px 0;
padding: 10px;
border-radius: 8px;
line-height: 30px;
position: relative;
left: 20px;
}
.chat-screen__texts > .text::after {
content: "";
border-bottom: 16px solid transparent;
border-right: 16px solid antiquewhite;
position: absolute;
top: 10px;
left: -10px;
}
.chat-screen__texts > .text:hover {
background-color: rgb(198, 208, 145);
transition: background-color 1500ms 200ms ease-in;
}
.chat-screen__texts > .text:hover::after {
border-right: 16px solid rgb(198, 208, 145);
transition: border-right 1500ms 200ms ease-in;
}