HTML 태그의 위치를 지정해주는 속성이다. 이를 이용해 페이지의 레이아웃을 결정할 수 있다.
모든 태그들의 position 속성값은 기본적으로 static 값을 가진다. html 태그 순으로 정상적인 흐름(순서대로)에 따라 위치가 지정된다.
따라서 top, bottom, right, left 속성은 어떤 값을 적용해도 무시된다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>static</title>
<style>
.box1{
position:static;
top: 50px; -> 무시
right: 50px; -> 무시
bottom: 50px; -> 무시
background-color: green;
color:white;
width: 100px;
height: 100px;
}
.box2{
position:static;
background-color: red;
color:white;
width: 100px;
height: 100px;
}
.box3{
position:static;
background-color: blue;
color:white;
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div class="box1">box1</div>
<div class="box2">box2</div>
<div class="box3">box3</div>
</body>
</html>
static은 차례대로 요소를 놓는다.
position의 값을 static이 아닌 relative로 주면 원래 자신의 자리(static 지정시 자리)를 기준으로 움직인다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>relative</title>
<style>
.box1{
position: static;
background-color: green;
color: white;
width: 100px;
height: 100px;
}
.box2{
position:relative;
left: 40px;
background-color: red;
color:white;
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div class="box1">box1</div>
<div class="box2">box2</div>
</body>
</html>
위의 코드에서는 box2를 left 40px를 주어 원래자리 기준으로 왼쪽으로부터 40px만큼 공간을 두었다.
position : relative
인 요소가 있으면 그 중 가장 가까운 요소의 내부에서만 자유롭게 배치할 수 있다. <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>relative-absolute</title>
<style>
.box1{
position:relative;
top:40px;
background-color: green;
color:white;
width: 100px;
height: 100px;
}
.box2{
position:absolute;
top: 40px;
background-color: red;
color:white;
width: 100px;
height: 100px;
}
.box3{
position: absolute;
top: 30px;
left: 30px;
background-color: blue;
color:white;
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div class="box3">box3</div>
<div class="box1">box1
<div class="box2">
box2
</div>
</div>
</body>
</html>
box3의 경우는 상위 요소에 relative가 없으므로 viewport 기준에서 왼쪽에 30px 공간, 위에서부터 30px공간을 가진다. box2는 상위 요소인 box1이 relative 속성이므로 box2의 top : 40px은 box1(relative 속성인 상위요소)를 기준으로 위에서 부터 40px 내려온 모습이다.
이를 통해 알 수 있는 것은, 같은 absolute 속성이라도 상위 요소의 position 속성값에 따라 서로 다른 위치 결과가 나타난다!
position을 fixed로 설정하면 스크롤을 올리거나 내려도 해당 내용을 계속 화면에 보이게 된다.
sticky(끈끈한) 속성값이 적용된 요소는 조상에 스크롤이 있다면 가장 가까운 부모 요소의 컨텐츠 영역에 달라붙는다.
<!DOCTYPE html>
<html lang="ko">
<head>
<style>
section {
height: 1000px;
border: 3px solid black;
}
h2 {
position: -webkit-sticky;
position: sticky;
top: 0px;
background: greenyellow;
margin: 0;
}
</style>
</head>
<body>
<h1>sticky test</h1>
(section>h2{오늘의 메뉴$}+ul>(li>lorem)*3)*3
</body>
</html>
위의 코드에서 fixed와 비슷하게 오늘의 메뉴라는 h2요소가 상단에 고정이 되있으며 다음 콘텐츠로 넘어가면 다음 콘텐츠의 h2요소를 표시한다. 여기서 $
표시는 1부터 증가하는 숫자이고 코드를 실행하면 페이지 상단에 오늘의 메뉴1 -> 스크롤... -> 오늘의 메뉴2 ... 이런식으로 표시된다.
position 값으로 요소의 위치를 변경하다 보면 요소끼리 겹치기도 한다. 이때 어떤 요소가 더 위로 나타나게 할지 결정하는 속성이다.
static을 제외한 요소의 Z축 순서를 결정할 수 있고, z-index가 더 큰 요소가 작은 요소를 덮는다.
부모가 z-index를 높여 자식 위로 나올 순 없지만, 자식은 z-index를 낮춰 부모 뒤로 갈 수 있다.
<!DOCTYPE html>
<html lang="ko">
<head>
<style>
div {
/* 같이 움직이는지 확인 */
/* margin: 100px; */
width: 800px;
height: 800px;
position: relative;
background-color: blanchedalmond;
border: 1px solid black;
/* 부모에 달아도 수정이 안됨 */
/* z-index: 1; */
}
img {
padding: 10px;
position: absolute;
}
img:nth-child(1) {
top: 100px;
left: 100px;
background-color: red;
/* 자식에게 값을 주면 부모 뒤로 감 */
z-index: 0;
}
img:nth-child(2) {
top: 150px;
left: 150px;
background-color: green;
z-index: 0;
}
img:nth-child(3) {
top: 200px;
left: 200px;
background-color: blue;
z-index: 0;
}
</style>
</head>
<body>
<div>
<img src="https://via.placeholder.com/300" alt="">
<img src="https://via.placeholder.com/400" alt="">
<img src="https://via.placeholder.com/500" alt="">
</div>
</body>
</html>
기본 모습은 위와 같다.
div(부모) 요소의 margin을 설정하면 모든 박스가 같이 움직이는 것을 볼 수 있다. 이 div(부모)의 z-index를 자식보다 높게 설정해도 부모는 자식 위로 나오지 않는다.
display : flex
flex-container
자식 요소를 flex-item
이라고 한다.cross-axis
는 주축(axis)와 짝을 이루는 축이다.flex 컨테이너가 사용할 주축과 정렬 방향을 결정한다.
row
: 기본값. 왼쪽 -> 오른쪽(주축이 행방향)column
: 위 -> 아래(주축이 열방향)row-reverse
: 오른쪽 -> 왼쪽column-reverse
: 아래 -> 위 주축을 기준으로 배열의 위치를 조종하거나 아이템 간의 간격을 설정할 수 있다.
flex-start
: 배열의 위치를 처음 부분으로 옮긴다.flex-end
: 배열의 위치를 끝부분으로 옮긴다.center
: 배열의 위치를 중간으로 옮긴다.space-between
: 원래는 배열 양옆에 공간이 있었지만 space-between
을 선언하면 이 간격은 사라지고 각각의 아이템 사이에 공백을 같은 간격으로 최대로 둔다.space-around
: 각각의 아이템을 동일한 공백 넓이로 아이템을 감싼다.space-evenly
: 각 아이템의 상하 공백이 동일하게 주어진다.flex를 활용한 실습을 해보자.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.left div,
.center div,
.right div {
width: 50px;
height: 50px;
background-color: wheat;
}
.left,
.center,
.right {
display: flex;
flex-direction: column;
justify-content: space-between;
}
.right {
flex-direction: column-reverse;
}
.parent {
display: flex;
justify-content: space-between;
width: 400px;
height: 400px;
background-color: royalblue;
}
</style>
</head>
<body>
<div class="parent">
<div class="left">
<div class="A">A</div>
<div class="B">B</div>
<div class="C">C</div>
</div>
<div class="center">
<div class="D">D</div>
<div class="E">E</div>
</div>
<div class="right">
<div class="F">F</div>
<div class="G">G</div>
<div class="H">H</div>
</div>
</div>
</body>
</html>
색상은 다르지만 구조는 비슷하게 만들어 보았다. 설계 순서는 다음과 같다.
각각의 개념들을 보면 크게 어렵지는 않은데 적용이 어려운 것 같다. 어제 과제로 내주셨던 로그인 위젯 만들기를 오늘 수업 끝나고 강사님의 코드를 보면서 한줄한줄 주석을 추가하며 이해를 하는 시간을 가졌다. 지금은 이해가 가는데 나중가선 까먹지 않도록 계속 들여다 봐야 할 듯 하다.
이력서..도 슬슬 내봐야 할 것 같은데 여러모로 걱정되는 부분이다. 쉴땐 쉬더라도 중간에 포기하지만 말자..! (제발)