들어가기 전에
요소의 레이아웃을 설정하는 대표적인 속성은 position 속성입니다.
position은 요소의 위치를 원하는 곳으로 이동할 수 있게 합니다.
position을 사용하기 위해서는 요소를 이동시키기 위한 좌표 속성인 offset에 대해서도 알아야 합니다.
position과 offset 속성을 잘 활용하면 더 다양하고 화려한 레이아웃을 구현할 수 있습니다.
핵심키워드
- position
- offset
학습하기
들어가기 전에
요소의 레이아웃을 설정하는 대표적인 속성은 position 속성입니다.
position은 요소의 위치를 원하는 곳으로 이동할 수 있게 합니다.
position을 사용하기 위해서는 요소를 이동시키기 위한 좌표 속성인 offset에 대해서도 알아야 합니다.
position과 offset 속성을 잘 활용하면 더 다양하고 화려한 레이아웃을 구현할 수 있습니다.
핵심키워드
학습하기
position 속성
요소의 위치를 정하는 방법을 지정하는 속성입니다.
기본 값 : static
position: static | absolute | fixed | relative | sticky | initial | inherit;
< 속성 값 >
static | Normal-flow 에 따라 배치되며 offset 값이 적용되지 않는다. (기본값) |
absolute |
|
fixed |
|
relative |
|
offset(top/left/bottom/right)
top|bottom|left|right: auto|length|initial|inherit;
top: 50%;
left: 10px;
bottom: -10px;
right: auto;
코드실습
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>position</title>
<style>
.sibling {
padding: 5px;
background-color: #eee;
text-align: center;
}
.parent {
border: 1px dashed #aaa;
padding: 10px;
}
.child,
.child_offset {
width: 60px;
height: 60px;
padding: 20px;
background-color: #dc3636;
text-align: center;
color: #fff;
font-weight: bold;
border: 1px solid #333;
}
.child_offset {
background-color: #3677dc;
}
.static {
position: static;
}
.relative {
position: relative;
}
.static {
position: static;
}
.absolute {
position: absolute;
}
.fixed {
position: fixed;
}
</style>
</head>
<body>
<h1>position (Offset 미지정)</h1>
<h2>static (기본)</h2>
<div class="parent">
<div class="sibling">Sibling 1</div>
<div class="child static">static</div>
<div class="sibling">Sibling 2</div>
</div>
<h2>relative</h2>
<div class="parent">
<div class="sibling">Sibling 1</div>
<div class="child relative">relative</div>
<div class="sibling">Sibling 2</div>
</div>
<h2>absolute</h2>
<div class="parent">
<div class="sibling">Sibling 1</div>
<!-- absolute, fixed는 inline요소일때 display:block으로 변경시킴. inline-block 값을 임의 지정했을 때는 그 값을 유지함. -->
<span class="child absolute">absolute</span>
<div class="sibling">Sibling 2</div>
</div>
<h2>fixed</h2>
<div class="parent">
<div class="sibling">Sibling 1</div>
<!-- 현재 fixed는 offset값이 없어 뷰포트 밖으로 밀려나오면서 화면 아래로 사라짐 -->
<div class="child fixed">fixed</div>
<div class="sibling">Sibling 2</div>
</div>
<h1>position (Offset 지정)</h1>
<h2>static - </h2>
<div class="parent">
<div class="sibling">Sibling 1</div>
<div class="child_offset static" style="top: 40px; right: 40px;">static <br>top: 40, left: 40</div>
<div class="sibling">Sibling 2</div>
</div>
<h2>relative</h2>
<div class="parent">
<div class="sibling">Sibling 1</div>
<div class="child_offset relative" style="top: 40px; left: 40px;">relative <br>top: 40, left: 40</div>
<div class="sibling">Sibling 2</div>
</div>
<h2>absolute - parent relative</h2>
<div class="parent relative">
<div class="sibling">Sibling 1</div>
<div class="child_offset absolute" style="top: 40px; left: 80px;">absolute<br>top: 40, left: 80</div>
<div class="sibling">Sibling 2</div>
</div>
<h2>fixed</h2>
<!-- 부모가 fixed여도 별개로 위치함 -->
<div class="parent">
<div class="sibling">Sibling 1</div>
<div class="child_offset fixed" style="top:100px;left:80%;">fixed<br>top:100, left:80%</div>
<div class="sibling">Sibling 2</div>
</div>
</body>
</html>
생각해보기
참고자료
https://www.w3schools.com
https://developer.mozilla.org
comment
부모의 padding 영역안에서 container값을 갖는다.
absolute는 포지션값을 relative로 지정해준 부모가 없는 경우 offset을 활용하여 이동 시킬 수 없는건가요? 아니면 이럴경우문서 왼쪽 윗쪽 끝에서 시작점을 잡고 offset을 활용하여 움직여주는건가요?
이해가 쏙쏙되게 잘 설명 해주셔서 감사합니다.
position : absolute; 에서 조상 elements 모두가 포지션 값을 가지지 않는다면 <body> 태그를 기준으로 값을 정한다고 설명해주셨지만, viewport가 적절한 표현이라고 생각합니다. 제가 잘못 이해했다면 공부할 수 있게 댓글로 정정 부탁드립니다.
`position:absolute;`로 설정한 블록에 `bottom: 0; right: 0px;` 를 적용해보면 body 태그의 마지막에 요소가 있어야 할텐데, body의 맨끝이 아니라 viewport의 끝에 위치됩니다. 브라우저의 창 크기를 조절하면 렌더링이 업데이트 되면서 viewport의 우측하단을 따라 같이 움직입니다.
(아래 링크에 의하면) 부모 요소 중에 non-static(positined) 요소가 없다면 ICB(Initial Containing Block)을 기준으로 합니다. 링크 따라 w3c 문서 보면 ICB가 viewport라고 나와 있습니다. 제 생각에 absolute 속성 엘리먼트가 (부모 요소가 모두 static 요소라면) viewport를 참고해 위치를 결정하고, 스크롤할 땐 body 태그 따라서 움직인다고 이해했습니다.
참고 링크
https://stackoverflow.com/questions/53855904/why-position-absolute-and-bottom-0-not-being-at-bodys-bottom
https://developer.mozilla.org/en-US/docs/Web/CSS/position#Absolute_positioning
https://www.w3.org/TR/CSS2/visudet.html#containing-block-details
position:static;기본값
position:relative;상대위치. 부모틀에 갖혀 자리를 유지. 부모가 같는 영역패딩값부터 시작.
position:absolute;절대위치. 정상 흐름에서 벗어나 오프셋이동. 보무영향을 안받음. 자동으로 display:block으로 된다.
position:fixed; 고정위치, 뷰포인트상 오프셋이동. 장바구니 같이 따라다님. 스크롤
★중요!