우선, css에서 빠질 수 없는게 단위
라고 생각한다.
아래에서 꼭 숙지하고 공부해보자!
px(픽셀)
: 스크린 상에서의 한 점을 기준으로 한 단위이다.cm
: 실제 센티미터를 기준으로 한다. 인쇄할 때 유용하다.mm
: 실제 밀리미터를 기준으로 한다.in(인치)
: 실제 인치를 기준으로 한다. 1인치는 96px.pt(포인트)
: 인쇄업계에서 사용하는 단위로, 1인치의 1/72pc(파이카)
: 1파이카는 12포인트와 동일하다.em
: 현재 요소의 font-size를 기준으로 한다.rem (루트 em)
: HTML의 루트 요소(html)의 font-size를 기준으로 한다.vw (뷰포트 너비)
: 뷰포트(스크린)의 너비(가로)의 1%에 해당한다.vh (뷰포트 높이)
: 뷰포트의 높이의 1%에 해당한다.vmin (뷰포트의 최소 크기)
: 뷰포트의 너비와 높이 중 더 작은 쪽의 1%에 해당한다.vmax (뷰포트의 최대 크기)
: 뷰포트의 너비와 높이 중 더 큰 쪽의 1%에 해당한다.%(백분율)
: 상위요소의 크기(너비)를 기준으로 한 백분율이다.➡️ rem
, %
, vh
, vw
가 많이 쓰이기도 하고 좀 더 중요하니 많이 써보는게 중요할 것 같다.
font
에도 적용 가능하다.세로 중앙 정렬 효과
를 가지고 있다.<!-- 실습 : calc및 line-height 사용하기 -->
<!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="css_prac1.css">
</head>
<body>
<div class = "kdt" >KDT</div>
</body>
</html>
/* 실습 : calc및 line-height 사용하기 */
body{
/* 기본body가 8px정도를 기본으로 가지고 있어서 0으로 초기화 */
margin: 0px;
background-color: beige;
/* 100vh가 전체를 나타냄 */
height: 100vh;
}
.kdt{
background-color: blue;
/* 스크린 화면 자체에서 가로너비가 vw, 세로가 vh */
width: 10vw;
height: 10vw;
color: white;
text-align: center;
margin: auto;
/* 뷰 포인트(화면) 높이의 50%에서 정확히 가운데로 와야하기 떄문에 뷰포트 가로 크기의 1/20(5%)을 뺀 값 */
margin-top: calc(50vh - (100vw / 20));
/* margin-top: 50vh; -> 이렇게 해도 되긴하지만 정확히 가운데에 오지 않을 수 있음*/
/* text가 가운데로 오려면 width, height의 값이랑 같게 하면됌 */
line-height: 10vw;
}
➡️ 화면 넓이의 1/10인 길이를 변으로 하기 위해 10vw를 사용했다. (화면 가로 너비의 10%)
(1) border-width
: 요소 테두리 선의 두께
(2) border-width
단축속성은 시계방향 순서이다!
(3) border-style
: 요소 테두리 선의 종류
border-width
순서와 동일하다.(4) border-color
: 요소 테두리 선의 색상을 지정하는 단축 속성
border-width
순서와 동일하다.(5) 방향 속성을 이용해서 일일히 나타낼 수 있다.
border-방향
or border-방향-속성
으로 표현된다.
➡️ 이런식으로 가능하다.
(6) border-radius
: 요소의 모서리를 둥글게 깎음
px
,em
,vw
등이 있border-width
과 같이 쭉 쓰면된다.<!-- border 예시 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>border예시</title>
<link rel="stylesheet" href="index2_border.css">
</head>
<body>
<div class = "box">border</div>
<div class = "box">border</div>
<!-- 이렇게 두개를 다써버리게 되면 의도와 다르게
박스끼리 겹쳐지는 부분들이 6px이 될 수 있음.(주의해야함)
이럴때는 띄어쓰기를 하거나 방향속성 이용해서 그 부분만 1.5px이렇게 해주면 해결가능-->
</body>
</body>
</html>
.box{
width: 300px;
height: 300px;
background-color: aquamarine;
/* border의 단축속성 */
/* border: 2px solid #ff0000; */
/* 이렇게 따로따로 개별속성으로도 가능함, 그대신 너비, 종류, 컬러 다 넣어줘야함 */
border-width: 3px;
border-style: ridge;
border-color: blueviolet;
/* border-radius : 모서리 변경 */
/* border-radius: 10px; */
/* border-radius: 0 20px 0 10px; */
/* border-bottom-right-radius: 50px; */
/* border-top-left-radius: 20px; */
/*한번에 시계방향 순서대로 작성가능 */
border-radius: 10px 20px 30px 40px;
/* 원 만들 수 있음 */
/* border-radius: 50%; */
}
➡️ border-radius: 50%;
를 이용하면 원을 만들 수 있다.
만약, border-radius: 50%;
주석처리 그대로 해놓고, 이대로 실행시켜보면,
➡️ 이런 모양이 나온다.
✏️ 위의 예시코드 주석에서 말한 것처럼, style을 solid
로 하게 되면 겹쳐보여서 원하는 바 보다 두껍게 나올 수 있다.
➡️ 이를 해결하기 위해선 띄어쓰기를 하면 해결 가능하다. (border-bottom:0px; 이렇게 해서 해결할 수도 있지만 radius가 적용된 상태에서는 안되고 square 모양에서만 가능한 것 같다... 더 알아봐야겠다. )
content-box
: 요소의 내용으로 크기 계산한다.border-box
: 요소의 내용 + padding + border로 크기를 계산한다.<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>box-sizing 실습</title>
<link rel="stylesheet" href="exam_boxsizing.css">
</head>
<body>
<div class="contentbox"></div><br />
<div class="borderbox"></div>
</body>
</html>
div{
width: 100px;
height: 100px;
padding: 20px;
border: 15px solid red;
background-color: orange;
}
/* 말그대로 안에 있는 박스 content에다가 적용됌 */
.contentbox{
box-sizing: content-box;
}
/* width는 border까지 다 더한게 100px이 되는 것 */
.borderbox{
box-sizing: border-box;
}
➡️ content-box
로 했을 때 컨텐츠의 검사를 보면,
➡️ 안의 컨텐츠의 width
과 height
가 각각 100px인 것을 확인할 수 있다.
➡️ border-box
로 했을 때 컨텐츠의 검사를 보면,
➡️ 안의 컨텐츠의 width
+ padding
+ border
의 값이 총 100px인 것을 확인할 수 있다.
➡️ 다 합해서 설정된 width
값을 맞추기 위해 컨텐츠의 크기가 자동으로 줄었다.
border-box
, content-box
모두 css 작업에서 매우 많이 쓰인다. 어떤식으로 쓰여야하는지 목적을 확실하게 파악하고 진행해야한다.나중에 변경하려면 너무 힘듦 ㅠ
➡️ 유저들에게 보이면 안되는 요소도 분명 필요하기 때문에 중요한 속성이다.
1
: 불투명0~1
: 0부터 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="index3_opacity.css">
</head>
<body>
<div class="square">original</div>
<!-- 클래스가 두개씩 들어간 것 -->
<div class="square d-none">d-none</div>
<div class="square invisible">invisible</div>
<div class="square opacity-0">opacity-0</div>
<div class="square">original</div>
</body>
</html>
/* 투명도 실습 + 예시 */
.square{
width: 200px;
height: 200px;
background-color: blue;
border: solid 1px black;
display: inline-block;
}
.d-none {
display: none;
background-color: red;
}
.invisible {
/* 보이지는 않지만 자리는 차지함, 속성도 사라지긴함 */
opacity: 0;
visibility: hidden;
background-color: orangered;
}
.opacity-0 {
/* 보이지는 않지만 자리는 차지함 */
opacity: 0;
background-color: tomato;
}
/* 해당 div에 마우스가 올라가면 요소가 사라지도록 만듦 */
div:hover{
opacity: 0;
}
➡️ square를 5개를 만들었지만, 보이는건 2개밖에 없다.
➡️ d-none
class의 자리는 아예 사라졌고, 나머지 invisible
& opacity
의 자리는 남아있다.
➡️ css 파일 맨 마지막 코드에 hover
를 이용해서 사라지게 해보는 실습까지 진행해보았다.
<!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_overflow.css">
</head>
<body>
<div class="main">
<p>
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.
Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable.
</p>
</div>
</body>
</html>
.main{
width: 200px;
height: 200px;
background-color: aqua;
/*여기선 예시 때문에 모든 경우를 다 쓴 것이고, 필요에 따라 원하는 것만 작성하면 된다. */
overflow:hidden
overflow: scroll;
overflow: auto;
overflow-x: auto;
overflow-y: scroll;
}
➡️ overflow:hidden;
: 설정된 크기를 벗어나면 잘라버린다.
➡️ overflow:scroll;
: 넘친내용은 스크롤로 내려서 볼 수 있다. x,y축 모두 무조건 스크롤이 생긴다.
➡️ 참고로 x축의 스크롤이 생기는건 추가적인 tag가 필요하다고 한다. 개념상 x,y축 스크롤이 생기는 건 맞다!
➡️ overflow: auto;
: 부모 영역을 넘어 가는 경우에만 스크롤을 만든다.
auto
& scroll
차이점 ?auto
는 정해진 크기를 넘어가는 경우에만 스크롤을 만들고, x축만 넘으면 x축의 스크롤만 만들고, y축만 넘으면 y축의 스크롤만 만든다.scroll
의 경우엔, 내용이 정해져있던 크기보다 넘치게 되면, 무조건 x,y축 모두 다 스크롤이 생긴다.➡️ overflow-x: auto;
& overflow-y: scroll;
: 따로따로 설정이 가능하다.
요소 자기 자신
을 기준으로 배치된다.위치 상 부모 요소
를 기준으로 배치된다.따라서,
➡️ 반드시, position:relative
를 부모요소에 지정해줘야 겹치지 않고 제대로 배치가 된다.
만약, 부모요소를 <body>
에 지정하게되면,
➡️ 뜻하지 않은 결과가 나오게 된다.
top:30px
, right:30px
위치에 배치하는 것이다.<!-- position 예시 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Position예시</title>
<link rel="stylesheet" href="ex_position.css">
</head>
<body>
<div class="parent">
<div class="box1"></div>
<div class="box2"></div>
<div class="box3"></div>
</div>
</body>
</html>
.parent{
background-color: beige;
width: 300px;
height: 300px;
}
.box1{
background-color: teal;
width: 100px;
height: 80px;
}
.box2{
background-color: blueviolet;
width: 120px;
height: 100px;
/*position:relative;*/
top: 30px;
left: 30px;}
.box3{
background-color: goldenrod;
width: 100px;
height: 150px;
}
➡️ position
을 지정안해주면 위치는 지정되지 않는다.
➡️ 주석표시된 position:relative;
를 같이 실행해줘야지 위와 같이 그림이 움직인다.
.parent{
background-color: beige;
width: 300px;
height: 300px;
margin-top: 50px;
position:relative;
}
.box1{
background-color: teal;
width: 100px;
height: 80px;
}
.box2{
background-color: blueviolet;
width: 120px;
height: 100px;
/* position:absolute -> 이것만 하게 되면 브라우저(body)를 기준으로
위치를 이동하기 때문에 붕 뜰 수 있음 .
이걸 해결하기 위해선 부모요소에 position = realative; 해줘야 붕뜨지 않음
고정되어 있지만 부모 따라다니면서 위치가 움직임*/
position:absolute;
top: 30px;
left: 30px;
}
.box3{
background-color: goldenrod;
width: 100px;
height: 150px;
}
➡️ 부모요소에 지정을 잘 해줘야 붕뜨지 않고 잘 위치할 수 있다.
만약, 지정을 하지 않았다면,
➡️ 이렇게 브라우저에 기준을 두게 되어 어긋나게 된다.
<!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="position_prac3.css">
</head>
<body>
<div class="container">
<div class="item1"></div>
<div class="item2"></div>
<div class="item3"></div>
</div>
</body>
</html>
.container{
width: 500px;
height: 500px;
background-color: bisque;
position: relative;
}
.container > div{
width: 50px;
height: 50px;
}
.item1{
position: relative;
left: 50px;
top: 30px;
background-color: red;
}
.item2{
/* 하위 구조인 걸 확인하고 부모인걸 기준으로 잡게됌 */
position:absolute;
right:30px;
bottom: 100px;
background-color: orange;
}
.item3{
position: fixed;
right:10px;
top: 100px;
background-color: blue;
}
➡️ item1은 자기 자신의 요소의 위치이므로 맞게 위치되었다.
➡️ item2는 컨테이너 = 부모 를 기준으로 잡아야하기 때문에 position:absolute;
를 사용하였다.
📌 item1에 있는 position: relative;
을 부모로 보지 않는 이유는, html에 부모로 나와있는 클래스를 부모요소로 자동으로 보기 때문에 동일한 코드가 쓰여있어도 문제 없다!
오늘은 제일 양이 많은 것 같다... 언제 보아도 이해하기 편하게 예시도 많이 첨부하였다. 나뿐만 아니라 모두에게 도움이 되었으면 좋겠다:)
그림 출처 | 코딩온x포스코 교안