레이아웃 할 때 중요한 부분이니 유의깊게 봐야한다!
position:relative
와 position:absolute
를 빼먹지 말것!static
에서는 적용되지 않는다.position:relative
와 position:absolute
가 필요하다.➡️ 숫자가 높은 순서대로 앞으로 지정된다.
block
으로 변경된다.➡️ 즉, display:block
를 하지 않아도 알아서 block
처리해준다.
<!-- z-index 예시 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="index.css">
</head>
<body>
<div class="parent">
<div class="circle circle1"></div>
<div class="circle circle2"></div>
<div class="circle circle3"></div>
<div class="circle circle4"></div>
<div class="circle circle5"></div>
</div>
</body>
</html>
.parent{
width: 500px;
height: 200px;
background-color: beige;
position: relative;
}
.circle{
border-radius: 50%;
width: 100px;
height: 100px;
position:absolute;
}
.circle1{
background-color: red;
left:0px;
z-index: 1;
}
.circle2{
background-color: orange;
left:50px;
z-index: 2;
}
.circle3{
background-color: yellow;
left:100px;
z-index: 3;
}
.circle4{
background-color: green;
left: 150px;
z-index: 2;
}
.circle5{
background-color: blue;
left: 200px;
z-index: 1;
}
<!-- 애벌레 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="ex_z-index2.css">
</head>
<body>
<!--구조를 잘 생각해서 하위구조로 넣을 수 있는건 넣자-->
<div class="parent">
<div class="circle circle1">
<div class = "eye-white">
<div class = "eye-black"></div>
</div>
</div>
<div class="circle circle2"></div>
<div class="circle circle3"></div>
<div class="circle circle4"></div>
<div class="circle circle5"></div>
<div class="circle circle6"></div>
<div class="circle circle7"></div>
<img src="grass.png" alt="잔디사진">
</div>
</body>
</html>
.parent{
position: relative;
}
.circle{
border-radius: 50%;
width: 100px;
height: 100px;
position: absolute;
}
.circle1{
left: 10px;
top:10px;
background-color: skyblue;
}
.eye-white{
border-radius: 50%;
/* 후손도 모두 따라오기 때문에 이땐, realative, absolute 상관없다. */
position: relative;
z-index: 5;
left:20px;
top:20px;
height: 35px;
width: 35px;
background-color: white;
}
.eye-black{
border-radius: 50%;
position: relative;
z-index: 6;
left: 1px;
top: 10px;
height: 15px;
width: 15px;
background-color: black;
}
.circle4{
z-index: 2;
background-color: rgb(79, 79, 237);
left:70px;
top:65px;
}
.circle5{
z-index: 3;
background-color: blue;
left: 130px;
top: 110px;
}
.circle6{
z-index: 4;
background-color: rgb(161, 161, 212);
left: 200px ;
top: 100px;
}
.circle7{
z-index: 5;
background-color: rgb(21, 80, 92);
left: 270px;
top:100px;
}
img{
z-index: 4;
border-radius: 40px;
top:110px;
position:relative;
}
transparent
: 투명함📍 background : linear-gradient()
• 색상1|색상2:상하로 색 2개 지정
• 방향|색상1|색상2 : 해당방향으로 색상 2개 지정(ex: 90deg blue red)
• 방향|색상1|색상1의 비중|색상2 : 색상1의 비중을 %로 지정
• 방향|색상1|색상2|색상3:색상 3개 사용
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>그라데이션</title>
<link rel="stylesheet" href="index2.css">
</head>
<body>
<div>
<div class = "grad grad-1"></div>
<div class = "grad grad-2"></div>
<div class = "grad grad-3"></div>
<div class = "grad grad-4"></div>
<div class = "grad grad-5"></div>
</div>
</body>
</html>
.grad{
width: 300px;
height: 300px;
margin-bottom: 30px;
}
.grad-1{
background: linear-gradient(gray, tomato);
}
.grad-2{
/* 90도 돌려서 보임 */
background: linear-gradient(90deg, gray, tomato);
}
.grad-3{
/* 영역비중을 설정할 수 있음 */
background: linear-gradient(90deg, gray,80%,tomato);
}
.grad-4{
/* 위에서부터 쭉 내려오는거 확인가능 */
background: linear-gradient(gray,tomato,yellow,pink);
}
.grad-5{
background: linear-gradient(217deg, rgba(255,0,0,.8), rgba(255,0,0,0) 70.71%),
linear-gradient(127deg, rgba(0,255,0,.8), rgba(0,255,0,0) 70.71%),
linear-gradient(336deg, rgba(0,0,255,.8), rgba(0,0,255,0) 70.71%);}
➡️ 코드 순으로 결과이다.
none
: 이미지 없음url("경로")
: 이미지 경로repeat
: 이미지를 수직, 수평 반복(기본값)repeat-x
: 이미지를 수평 반복repeat-y
: 이미지를 수직 반복no-repeat
: 반복 없음cover
와 contain
차이점<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="ex_background.css">
</head>
<body>
<div></div>
</body>
</html>
div{
/*background-image의 기본값은 이미지가 반복됌 */
background-color: orange;
background-image: url("https://item.kakaocdn.net/do/d84248170c2c52303db27306a00fb861f604e7b0e6900f9ac53a43965300eb9a");
/* 100%, 100vw하면 너비의 전체에 이미지가 다 보여짐. */
width: 100vw;
height: 500px;
background-repeat: no-repeat;
/* background-position : 배경 이미지 위치 설정 */
background-position: bottom right;
/* background-repeat : 배경이미지 반복에 대해 설정가능 */
/* background-repeat: repeat-x; */
background-size: cover;
/* background-attachment : 배경이미지 스크롤 설정 */
background-attachment: scroll;
}
(1) background-size: cover;
& background-attachment: scroll;
했을 경우
(2) background-size: contain;
& background-attachment: scroll;
경우
(3) background-size: contain;
& background-attachment: fixed ;
경우
➡️ 화면을 늘렸을 때 모습
➡️ 화면을 줄여도 라이언 전체 모습이 다 보임
(4) background-size: cover;
& background-attachment: fixed;
➡️ 뷰포트를 계속해서 움직였을때 더 넓은 너비에 맞추기 때문에 라이언이 다 보이지 않고 계속해서 움직인다.(뒤에 배경을 통해 계속 뷰포트의 크기를 변경했음을 확인할 수 있다.)
display:flex
를 써야 자식들이 정렬이 된다.(마치 inline-block처럼)
📌 flex
는 레이아웃을 구성할 때 매우! 중요한 요소이다. 완벽숙지를 해야할 필요가 있다.
display: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>
<link rel="stylesheet" href="prac_flex1.css">
</head>
<body>
<div class = "container">
<div class = "item1"></div>
<div class = "item2"></div>
<div class = "item3"></div>
</div>
</body>
</html>
.container{
background-color: bisque;
width: 500px;
height: 500px;
display: flex;
/* flex-direction : row가 기본값 */
/* 세로 방향에서 끝점을 기준으로 쌓이도록 설정 */
flex-direction: column-reverse;
/* 세로 방향에서 시작점을 기준으로 쌓이도록 설정 */
/* flex-direction: column; */
/* 가로 방향에서 끝점을 기준으로 쌓이도록 설정 */
/* flex-direction: row-reverse; */
}
.item1{
width: 100px;
height: 100px;
background-color: rebeccapurple;
}
.item2{
width: 100px;
height: 100px ;
background-color: aquamarine;
}
.item3{
width: 100px;
height: 100px;
background-color: burlywood;
}
flex-direction: column-reverse;
해당
wrap
을 하지 않으면 뷰포트를 줄였을 때, items의 형태가 망가지면서 의도하는 바와 다르게 된다.flex-wrap:wrap;
을 통해 줄바꿈을 하더라도 items의 형태가 변화가 없게 만들 때 쓰인다.justify-content: space-between;
: 양 끝에 여백 동일하게 해서 붙는다. (축의 정렬을 flex-direction과 헷갈리지 말것)justify-content: space-evenly;
: 여백이 완전히 균등하게 배분된다.justify-content: space-around;
: 각 flex item의 외부 여백을 균등하게 정렬한다.[주의]
📌 justify-content: flex-end;
: 이 방법은 끝점에 순서대로 뒤에 붙지만, flex-direction
에서 끝점을 기준으로 쌓으려면 reverse(row-reverse)
를 사용해야해서 순서가 뒤바뀐다(=시작점이 다름).
flex-start
는 기본값이다.flex-wrap:wrap;
을 같이 써야한다.align-items
과 align-content
는 둘 중 하나만 쓰는 것이다.<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="prac_display.css">
</head>
<body>
<div class = "container">
<div class = "item item1"></div>
<div class = "item item2"></div>
<div class = "item item3"></div>
<div class = "item item4"></div>
<div class = "item item5"></div>
<div class = "item item6"></div>
<div class = "item item7"></div>
<div class = "item item8"></div>
</div>
</body>
</html>
.container{
width: 500px;
height: 500px;
display: flex;
background-color: beige;
/* direction으로 방향설정, 공통 */
flex-direction: column;
justify-content: center;
/* 컨테이너 안에 한줄이 되도록 설정*/
/* flex-wrap:nowrap; */
/* align-items: center; */
/* justify-content: center; */
/* 컨테이너 안에 두줄이 되도록 설정 */
/* 하나로 뭉치기 */
/* align-content: center;
flex-wrap:wrap; */
/* 각각의 flex 줄에 적용 */
align-items: center;
flex-wrap: wrap;
}
.item{
width: 100px;
height: 100px;
/* border-color: black; */
border: 2px solid black;
}
.item1{
background-color: red;
}
.item2{
background-color: orange;
}
.item3{
background-color: yellow;
}
.item4{
background-color: green;
}
.item5{
background-color: blue;
}
.item6{
background-color: peru;
}
.item7{
background-color: palegreen;
}
.item8{
background-color: purple;
}
(1) 컨테이너 안에 한줄이 되도록 설정했을 경우(가로)
(2) 컨테이너 안에 한줄이 되도록 설정했을 경우(세로)
(3) 컨테이너 안에 두줄이 되도록 설정했을 경우(세로) & 각각의 flex줄에 정렬
(4) 컨테이너 안에 두줄이 되도록 설정했을 경우(가로) & 각각의 flex줄에 정렬
(5) 컨테이너 안에 두줄이 되도록 설정했을 경우(세로) & 해당 아이템을 하나로 뭉쳐서 정렬
(6) 컨테이너 안에 두줄이 되도록 설정했을 경우(가로) & 해당 아이템을 하나로 뭉쳐서 정렬
<!-- flex를 이용한 header만들기 실습 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>flex이용한 header만들기</title>
<link rel="stylesheet" href="flex_prac2.css">
</head>
<body>
<h3>Flex를 이용해 여러 종류의 Header를 만들어보자!</h3>
<div class = "container1">
<div class = "logo1">LOGO</div>
<div class = "menu1">
<div>MENU1</div>
<div>MENU2</div>
<div>MENU3</div>
</div>
</div>
<div class="container2">
<div class = "menu1">MENU1</div>
<div class = "menu2">MENU2</div>
<div class = "menu3">MENU3</div>
</div>
<div class="container3">
<div class = "logo2">LOGO</div>
<div class = "menu7">
<div>MENU1</div>
<div>MENU2</div>
<div>MENU3</div>
</div>
<div class = "logo3">LOGIN</div>
</div>
<div class = "head">
<div>header4는 선택입니다!</div>
</div>
<div class="container4">
<div class = "menu4">
<div>LOGO</div>
<div>MENU1</div>
<div>MENU2</div>
<div>MENU3</div>
</div>
<div class = "login4">
<div>LOGIN</div>
<div>SIGNUP</div>
</div>
</div>
</body>
</html>
body > div{
margin-left: 0px;
font-weight: bold;
}
h3{
text-align: center;
}
.container1{
background-color: rgb(207, 204, 204);
width: 100vw;
height: 50px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0px 10px;
}
.menu1{
/* 한줄(일자)로 만들 수 있음 */
display: flex;
}
.menu1 div:nth-child(2){
margin: 0px 10px;
}
.container2{
background-color: rgb(207, 204, 204);
width: 100vw;
height: 50px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0px 10px;
margin-top: 10px;
}
.container3{
background-color: rgb(207, 204, 204);
width: 100vw;
height: 50px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0px 10px;
margin-top: 10px;
}
.container3 .menu7{
display: flex;
}
.container3 div:nth-child(2){
margin:0px 10px;
}
.container4{
background-color: rgb(207, 204, 204);
width: 100vw;
height: 50px;
display: flex;
/* 양 옆으로 붙음 */
justify-content: space-between;
align-items: center;
/* 양쪽 끝에 padding값이 들어감 */
padding: 0px 10px;
margin-top: 10px;
}
.menu4{
display: flex;
}
.menu4 div:nth-child(2n){
margin:0px 10px;
}
.login4 div:first-child{
margin: 0px 10px;
}
.login4{
display:flex;
}
.head {
width: 100vw;
height: 25px;
display:flex;
justify-content: center;
background-color: pink;
align-items: center;
padding: 0px 10px;
margin-top: 10px;
}
➡️ position
을 쓰지 않고도 만들 수 있다.
➡️ 중간에 주석처리로 많이 설명해놨으니 꼭 참고하자.
css가 마무리 되어간다.. flex가 정말 많이 쓰인다고 들었다. 웹사이트를 하나 정해서 똑같이 만들어보는 연습을 시작할 수 있을 것 같다.