CSS(Cascading Style Sheets)에서 레이아웃을 만드는데 다양한 방법이 있지만, 이번에는 position 프로퍼티(property) 레이아웃 방법에 대해 알아보고자 한다.
position 프로퍼티에는 레이아웃에 대한 다양한 값을 설정할 수 있는데, 크게는 다섯가지 값을 설정할 수 있다.
▶static position (정적 위치) 지정 방식
▶relative position (상대 위치) 지정 방식
▶fixed position (고정 위치) 지정 방식
▶absolute position (절대 위치) 지정 방식
▶sticky
static position(정적 위치) 지정 방식은 HTML 요소의 위치를 결정하는 가장 기본적인 방식이다
top, right, bottom, left 속성값에 영향을 받지 않는다.
특별한 엘리먼트 속성을 받지 않는다
▶ position:static; 설정
<style>
div.static {
border: 3px solid #73Ad21;
position: static;
top: 10px; // 속성값의 영향을 안받음
}
</style>
▶ static으로 설정된 레이아웃
relative는 별도의 프로퍼티를 지정하지 않는 이상 static과 동일하게 레이아웃을 동작한다. 하지만 상대적으로 위치를 기준을 잡아서 자신의 위치를 지정할 수 있다. 지정할 때는 별도의 프로퍼티를 값을 설정한다.
별도의 프로퍼티를 설정하기 위해서는 top, right, bottom, left 프로퍼티를 사용하여 레이아웃을 이동할 수 있다.
▶ position:relative; 설정
<head>
<meta charset="UTF-8">
<title>CSS Position</title>
<style>
div.static {
border: 2px solid #B8860B;
position: static;
}
div.relative {
border: 2px solid #CD5C5C;
position: relative;
left: 30px;
}
</style>
</head>
<body>
<h1>상대 위치(relative position) 지정 방식</h1>
<div class="static">이 요소는 정적 위치 지정 방식으로 위치를 설정하였습니다.</div><br>
<div class="relative">이 요소는 상대 위치 지정 방식으로 위치를 설정한 후, left 속성값을 30px로 설정하였습니다.</div><br>
<p>상대 위치는 해당 HTML 요소의 정적 위치(static position)에 따라 위치를 재조정하는 방식입니다!</p>
</body>
▶ 결과
fiexd는 말그대로 고정으로 뷰포트(viewport) 즉, 보여지는 웹페이지상의 화면 중 설정한 값에 위치한다.
별도의 프로퍼티를 지정하여 개발자가 원하는 위치에 레이아웃이 가능하다.
▶ position:fixed; 설정
<head>
<meta charset="UTF-8">
<title>CSS Position</title>
<style>
div.fixed {
border: 2px solid #B8860B;
width: 450px;
position: fixed;
top: 0;
right: 0;
}
</style>
</head>
<body>
<h1>고정 위치(fixed position) 지정 방식</h1>
<div class="fixed">이 요소는 고정 위치 지정 방식으로 위치를 설정하였습니다.</div>
<h2>제목 1</h2>
<p>첫 번째 단락</p>
<h2>제목 2</h2>
<p>두 번째 단락</p>
<h2>제목 3</h2>
<p>세 번째 단락</p>
<h2>제목 4</h2>
<p>세 번째 단락</p>
<h2>제목 5</h2>
<p>세 번째 단락</p>
<h2>제목 6</h2>
<p>세 번째 단락</p>
<h2>제목 7</h2>
<p>세 번째 단락</p>
</body>
▶ 결과
fixed는 뷰포트에서 상대적으로 고정 위치로 레이아웃하였다면, absoulute 속성은 가장 가까운 곳에 위치한 엘리먼트(element) 즉, 부모나 조상 엘리먼트에 상속하여 고정 위치로 레이아웃하게 된다.
만약 부모/조상 엘리먼트가 없을 시 문서본문(document body)를 기준으로 삼고, 페이지 스크롤에 따라 움직이게 된다.
▶ position:absolute;설정
<head>
<meta charset="UTF-8">
<title>CSS Position</title>
<style>
div.relative {
border: 2px solid #B8860B;
width: 500px;
height: 200px;
position: relative;
}
div.absolute {
border: 2px solid #006400;
width: 200px;
height: 100px;
position: absolute;
top: 50px;
right: 0;
}
</style>
</head>
<body>
<h1>절대 위치(absolute position) 지정 방식</h1>
<div class="relative">이 요소는 상대 위치 지정 방식으로 위치를 설정하였습니다.
<div class="absolute">이 요소는 절대 위치 지정 방식으로 위치를 설정한 후, top 속성값을 50px로 설정하였습니다.</div>
</div>
<div class="absolute">이 요소는 절대 위치 지정 방식으로 위치를 설정한 후, top 속성값을 50px로 설정하였습니다.</div>
<p>절대 위치는 해당 요소의 바로 상위의 위치가 설정된 조상(ancestor) 요소에 따라 위치를 재조정하는 방식입니다!</p>
</body>
▶ 결과
▶ 소스
<head>
<meta charset="UTF-8">
<title>CSS Position</title>
<style>
.container {
border: 3px solid red;
width: 100%;
height: 1000px;
position: relative;
}
.position {
width: 150px;
height: 50px;
top: 100px;
left: 120px;
}
.static {
border: 3px solid black;
position: static;
}
.relative {
border: 3px solid green;
position: relative;
}
.fixed {
border: 3px solid orange;
position: fixed;
}
.absolute {
border: 3px solid blue;
position: absolute;
}
</style>
</head>
<body>
<h1>정적 위치(static position) 지정 방식의 특징</h1>
<div class="container">
<div class="static position">정적 위치(static position)</div>
<div class="relative position">상대 위치(relative position)</div>
<div class="fixed position">고정 위치(fixed position)</div>
<div class="absolute position">절대 위치(absolute position)</div>
</div>
</body>
▶ 결과
display 속성은 요소를 어떻게 보여줄지 그리고 영역을 어떻게 차지할지를 결정한다.
주로 4가지 속성값이 쓰이는데, 속성마다 사용할 수 있는 태그(tag)가 다르다.
▶ block (블록)
▶ inline (인라인)
▶ inline-block (인라인-블록)
▶ none
block 속성값은 기본적으로 가로영역을 모두 채우며, block요소 다음에 오는 태그는 줄바꿈이 된 것처럼 보인다.
width, height 속성을 지정 할 수 있으나 block요소 뒤에 즉, 다음 문단에 레이아웃하게 된다.
block속성에 해당되는 대표적인 태그 :
,
<head>
<style>
span {
display: block;
}
</style>
</head>
<body>
<span> A display property with a value of "block" results in</span> <span>a line
break between the two elements.</span>
</body>
▶ 결과 : inline속성인 태그에 display 속성을 block을 주어 'in'다음 영역에 block 표시
inline 속성값은 width와 height를 지정할 수 없다. 흔히 word문서 내용상에서 글자나 문장에 효과를 주기 위해 존재하는 단위라고 할 수 있다.
inline속성에 해당되는 대표태그 : , , , , 등
▶ display:inline; 설정
<head>
<style>
li {
display: inline;
}
</style>
</head>
<body>
<p>Display a list of links as a horizontal menu:</p>
<ul>
<li><a href="/html/default.asp" target="_blank">HTML</a></li>
<li><a href="/css/default.asp" target="_blank">CSS</a></li>
<li><a href="/js/default.asp" target="_blank">JavaScript</a></li>
</ul>
</body>
▶ 결과 : block 속성인
비록 block태그지만 inline속성 처럼 해당되는 태그를 효과를 줄 수 있다.
따라서 width와 height 등의 레이아웃 속성을 적용할 수 있으며, 해당 태그가 다음문단에 표시되는 것이 아니라 바로 적용 및 표시할 수 있다.
▶ display:inline-block; 설정
<head>
<style>
.inline-block1 {
display: inline-block;
background: #09c;
height: 45px;
/* 원래 inline 요소의 높이는 원래 글자(폰트)의 높이로 설정되어 있지만, display:inline-block
를 사용하면 임의로 높이 또한 설정할 수 있다. */
}
.inline-block2 {
display: inline-block;
width: 200px;
border: 3px solid #999;
}
</style>
</head>
<body>
<p>
Lorem ipsum dolor sit amet, <span class="inline-block1">consectetur adipiscing elit</span>,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in <span class="inline-block2">reprehenderit</span>
in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
</body>
▶ 결과 : .inline-block1의 height와 backgroun속성도 받고
태그 안에 태그가 inline 효과 적용
none 속성값은 렌더링하지 않도록 설정한다.
visibility 프로퍼티를 hidden속성값으로으로 설정하는 것과 달리, 영역도 차지하지 않는다.
▶ display:none; 설정
<head>
<style>
.display-none {
display: none;
}
.invisible {
visibility: hidden;
}
</style>
</head>
<body>
<div class="display-none">1</div>
<div>2</div>
<div class="invisible">3</div>
<div>4</div>
</body>
▶ 결과 : 2와 4 사이에 빈 공간(영역X)
float라는 단어는 원래 '뜨다'라는 의미로 웹페이지에서 이미지를 어떻게 띄워서 텍스트와 함께 배치할 것인가 속성이다. float은 다음 같은 속성값을 가진다.
▶ inherit : 부모 요소에서 상속
▶ left : 왼쪽에 부유하는 블록 박스 생성. 페이지 내용은 박스 오른쪽에 위치하며, 위에서 아래로 흐름.
▶ right : 오른쪽에 부유하는 블록 박스 생성. 페이지 내용은 박스 왼쪽에 위치하며, 위에서 아래로 흐름.
이후 요소에 clear 속성이 있으면 페이지 흐름이 달라짐. none이 아니라면 display속성은 무시됨.
▶ none : 요소를 부유시키지 않음
▶ float 설정
<head>
<meta charset="UTF-8">
<title>CSS Float</title>
<style>
img {
float: left;
margin-right: 20px;
}
</style>
</head>
<body>
<h1>float 속성을 이용한 위치 설정</h1>
<p><img src="/examples/images/img_flower.png" alt="flower" width="245" height="185">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam ornare sapien suscipit tincidunt ullamcorper. Cras ac sem sed mauris maximus rhoncus vel in metus. Nam pharetra arcu sit amet dolor interdum, eget scelerisque libero finibus. Phasellus quis vulputate ante. Fusce sit amet viverra justo. Donec id elementum mauris. Nam id porttitor nisl, et suscipit nunc. Vestibulum sit amet volutpat quam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis placerat sem eu facilisis ultricies.
Nulla et elit placerat, malesuada massa sit amet, dictum quam. Duis eu turpis non sapien molestie luctus nec a tortor. Nunc non est eget elit suscipit interdum. Maecenas iaculis lobortis lorem et dignissim. Nullam dapibus, arcu vel malesuada egestas, nisi mi accumsan tellus, at rhoncus dolor nisi in tortor. Donec at aliquam lectus, ac egestas odio. Proin convallis sapien id consectetur egestas. Sed at varius libero, ut ultricies eros. Suspendisse potenti. Vivamus non posuere mauris. Maecenas luctus elementum justo, non tempor nisl blandit id. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</body>
▶ 결과
float 속성이 적용된 이후 나타나는 요소들의 동작을 조절해주는 역할
컨테이너에 float속성이 적용되면, 그 이후에 등장하는 모든 요소들은 정확한 위치를 설정하기 힘들어짐
▶ 소스예제#1
<head>
<meta charset="UTF-8">
<title>CSS Float</title>
<style>
.left {
background-color: #FF8C00;
width: 150px;
height: 50px;
float: left;
}
.right {
background-color: #9932CC;
width: 150px;
height: 50px;
float: right;
}
</style>
</head>
<body>
<h1>clear 속성을 이용한 위치 조정</h1>
<div>
<div class="left">왼쪽 끝에 위치하고 싶은 요소</div>
<div class="right">오른쪽 끝에 위치하고 싶은 요소</div>
</div>
<p>이 글자를 아래쪽에 제대로 출력하고 싶어요!</p>
</body>
▶ 결과#1
따라서
태그의 내용을 다음 요소에 잘 배치를 하려면,
태그에 clear 속성을 별도로 적용하여 다른 요소들과 구분해주어야 한다
▶ 소스예제#2
<head>
<meta charset="UTF-8">
<title>CSS Float</title>
<style>
.left {
background-color: #FF8C00;
width: 150px;
height: 50px;
float: left;
}
.right {
background-color: #9932CC;
width: 150px;
height: 50px;
float: right;
}
p { clear: both; }
</style>
</head>
<body>
<h1>clear 속성을 이용한 위치 조정</h1>
<div>
<div class="left">왼쪽 끝에 위치하고 싶은 요소</div>
<div class="right">오른쪽 끝에 위치하고 싶은 요소</div>
</div>
<p>이 글자를 아래쪽에 제대로 출력하고 싶어요!</p>
</body>
▶ 결과#2
▶ 소스
<head>
<meta charset="UTF-8">
<title>CSS Float</title>
<style>
div.page {
border: 3px solid #CD5C5C;
overflow: auto;
}
h2 { text-align: center; }
header{ border: 3px solid #FFD700; }
nav {
border: 3px solid #FF1493;
width: 150px;
float: left;
}
section {
border: 3px solid #00BFFF;
margin-left: 156px;
}
footer{ border: 3px solid #00FA9A; }
</style>
</head>
<body>
<h1>float 속성을 이용한 레이아웃</h1>
<div class="page">
<header>
<h2>header 영역</h2>
</header>
<nav>
<h2>nav 영역</h2>
<p>여기에는 보통 메뉴가 들어갑니다.</p>
</nav>
<section>
<h2>section 영역</h2>
<p>여기에는 페이지에 해당하는 내용이 들어갑니다.<br>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam ornare sapien suscipit tincidunt ullamcorper. Cras ac sem sed mauris maximus rhoncus vel in metus. Nam pharetra arcu sit amet dolor interdum, eget scelerisque libero finibus. Phasellus quis vulputate ante. Fusce sit amet viverra justo. Donec id elementum mauris. Nam id porttitor nisl, et suscipit nunc. Vestibulum sit amet volutpat quam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis placerat sem eu facilisis ultricies.
</p>
</section>
<footer>
<h2>footer 영역</h2>
</footer>
</div>
</body>
▶ 결과