5. position 속성     -바닥부터 시작하는 CSS-

 

5. position 속성

css를 이용해서 각각의 박스를 배치하는 방식에는 일반적인 상황에서 배치되는 Normal-flow 방식, 앞서 공부한 float 상태에서의 배치 방식, 그리고 position로 배치되는 방식, 이렇게 세 가지로 나눌 수 있습니다.

position 속성에 적용되는 값은 static, relative, absolute, fixed, inherit가 있습니다.

 

1) static

static값은 Position 속성 값으로 아무 것도 지정하지 않았을 때 default 값으로 사용됩니다. 이 경우 일반적인 normal-flow에 따라서 각각의 요소들을 배치하게 됩니다.

static을 사용하게 되면 자식 요소에 absolute를 적용한다 하더라도 원하는 대로 배치되지 않게 됩니다.

static을 사용하는 경우에는 top, left, right, bottom과 같은 속성에 값을 줘도 아무런 변화가 없습니다.

  1. 예 5-1
  2. <style>
  3. body {
  4. margin: 0;
  5. }
  6. div {
  7. width: 100px;
  8. height: 100px;
  9. }
  10. .div1 {
  11. background-color: pink;
  12. top: 30px;
  13. }
  14. .div2 {
  15. background-color: cyan;
  16. }
  17. </style>
  18. <body>
  19. <div class="div1">div1</div>
  20. <div class="div2">div2</div>
  21. </body>

<body>태그에 margin0으로 주면 브라우저에서 기본적으로 적용되는 마진 값을 없애서 화면에 출력되는 객체가 

브라우저 창의 , 상단에 딱 붙어서 출력됩니다.

position의 좌표 속성을 좀 더 정확히 확인하기 위해서 이렇게 margin 값을 0으로 지정했습니다.

div1div2는 특별한 position 값이 없으므로 기본 값인 static으로 지정됩니다.

static 이므로 top: 30px;를 적용했지만 아무런 영향이 없이 그냥 block 요소의 normal-flow대로 출력되어 버립니다.

 

2) absolute

absoluterelative와 마찬가지로 좌표 값을 사용하지만, absolute 값을 갖는 객체는 공중에 떠있는 부유 상태라서 다른 객체에는 영향을 끼치지 않고 단독적으로 위치를 잡을 수 있습니다.

  1. 예 5-2
  2. <style>
  3. body {
  4. margin: 0;
  5. }
  6. div {
  7. width: 100px;
  8. height: 100px;
  9. }
  10. .div1 {
  11. background: pink;
  12. position: absolute;
  13. top: 50px;
  14. left: 50px;
  15. }
  16. .div2 {
  17. background: cyan;
  18. }
  19. </style>
  20. <body>
  21. <div class="div1">absolute 속성의 div1</div>
  22. <div class="div2">div2</div>
  23. </body>

div2div1이 없는 것처럼 배치됩니다.

div1이 먼저 배치되었는데 div2의 위에 있는 이유는 div1position 속성이 static이고, 이 경우 z-index속성 값은 auto입니다.

auto는 부모의 z-index값을 상속받는데, 최상위 태그의 z-index값은 0 이고 이것을 물려받는 div2z-index값도 0이 됩니다.

position속성이 absolute인 경우 z-index 기본 값은 1이 됩니다. 따라서 div1z-index값이 1이 되어 div1보다 큰 값을 가지므로 div1div2를 덮게 됩니다.

 

absolute 값을 갖는 객체는 좌표 값에만 영향을 받으므로 float 속성을 선언해도 소용이 없습니다.

  1. 예 5-3
  2. <style>
  3. body {
  4. margin: 0;
  5. }
  6. div {
  7. width: 100px;
  8. height: 100px;
  9. }
  10. .div1 {
  11. background: pink;
  12. position: absolute;
  13. float: left;
  14. top: 50px;
  15. left: 50px;
  16. }
  17. .div2 {
  18. background: cyan;
  19. }
  20. </style>
  21. <body>
  22. <div class="div1">absolute 속성의 div1</div>
  23. <div class="div2">div2</div>
  24. </body>

 

absolute 값을 갖는 객체는 자신의 부모 객체가 static이 아닌 값을 가진 경우, relative, absolute, fixed 값을 가진 

부모 객체의 위치를 기준으로 삼습니다.

  1. 예 5-4
  2. <style>
  3. body {
  4. margin: 0;
  5. }
  6. div {
  7. width: 100px;
  8. height: 100px;
  9. }
  10. .container1 {
  11. width: 150px;
  12. height: 150px;
  13. background: pink;
  14. position: absolute;
  15. top: 10px;
  16. left: 10px;
  17. }
  18. .container2 {
  19. width: 150px;
  20. height: 150px;
  21. background: lime;
  22. position: relative;
  23. top: 10px;
  24. left: 170px;
  25. }
  26. .container3 {
  27. width: 150px;
  28. height: 150px;
  29. background: cyan;
  30. position: fixed;
  31. top: 10px;
  32. left: 330px;
  33. }
  34. .div1 {
  35. background: yellow;
  36. position: absolute;
  37. top: 30px;
  38. left: 25px;
  39. }
  40. </style>
  41. <body>
  42. <div class="container1">
  43. <div class="div1">absolute 속성의 div1</div>
  44. absolute; container1</div>
  45. <div class="container2">
  46. <div class="div1">absolute 속성의 div1</div>
  47. relative; container2</div>
  48. <div class="container3">
  49. <div class="div1">absolute 속성의 div1</div>
  50. fixed; container3</div>
  51. </body>

 

부모 객체가 static이라면 조상 객체를 거슬러 올라가 static이 아닌 조상 객체를 찾아 좌표의 기준으로 삼고, 없다면 

브라우저 창이 기준이 됩니다.

  1. 예 5-5
  2. <style>
  3. body {
  4. margin: 0;
  5. }
  6. div {
  7. width: 100px;
  8. height: 100px;
  9. }
  10. .container1 {
  11. width: 250px;
  12. height: 250px;
  13. background: pink;
  14. position: absolute;
  15. }
  16. .container2 {
  17. width: 200px;
  18. height: 200px;
  19. background: lime;
  20. }
  21. .container3 {
  22. width: 150px;
  23. height: 150px;
  24. background: cyan;
  25. }
  26. .div1 {
  27. border: 1px solid red;
  28. position: absolute;
  29. top: 30px;
  30. left: 30px;
  31. padding: 30px 0;
  32. color: red;
  33. }
  34. </style>
  35. <body>
  36. <div class="container1">absolute; container1
  37. <div class="container2">static; container2
  38. <div class="container3">static; container3
  39. <div class="div1">absolute 속성의 div1</div>
  40. </div>
  41. </div>
  42. </div>
  43. </body>

빨간 선으로 표시된 div1의 영역이 static 속성 값을 가진 container1container2를 무시하고 absolute 값을 가진 

container1의 좌 상단을 기준으로 지정한 값만큼 떨어진 곳에 출력됩니다,

 

 

3) relative

position 속성relative가 지정된 박스의 경우는 부모의 position속성과 상관없이 Normal-flow에 따라 배치됩니다.

top, left, right, bottom속성 값을 지정해서 상대적 위치를 지정할 수 있습니다.

하지만 다음에 오는 박스에는 아무런 영향도 주질 않기 때문에 전체적인 흐름에는 변화를 주지 않습니다.

기본적으로 float 속성을 통해 객체를 정렬했다면, position: relative를 이용해서 세밀한 조정을 하는 것이 일반적입니다.

  1. 예 5-6
  2. <style>
  3. body {
  4. margin: 0;
  5. }
  6. div {
  7. width: 100px;
  8. height: 100px;
  9. text-align: center;
  10. }
  11. .div1 {
  12. background: cyan;
  13. }
  14. .div2 {
  15. background: yellow;
  16. position: relative;
  17. left: 110px;
  18. }
  19. .div3 {
  20. background: pink;
  21. }
  22. </style>
  23. <body>
  24. <div class="div1">
  25. div1 영역
  26. </div>
  27. <div class="div2">
  28. div2 영역
  29. </div>
  30. <div class="div3">
  31. div3 영역
  32. </div>
  33. </body>

div1normal-flow에 따라 맨 위에 일반적으로 배치되고 div2relative이면서 left: 110px값을 지정했으므로 원래 위치의 왼쪽에서 110px만큼 떨어진 위치에 배치됩니다.

그리고 div3는 원래 div1이 있어야 하는 위치에서 normal-flow에 따라 그 아래에 배치됩니다.

 

4) fixed

fixedabsolute와 마찬가지로 부유 객체이고 브라우저의 창을 기준으로 top, left등으로 지정한 상대 위치에 객체를 배치하며 

부모 요소가 있더라도 독립적으로 자리를 잡습니다.

가장 큰 특징은 화면이 스크롤되더라도 항상 화면의 정해진 위치에 출력이 되므로 화면의 특정 위치에 항상 보여주고 싶은 경우 사용합니다.

  1. 예 5-7
  2. <style>
  3. body {
  4. margin: 0;
  5. }
  6. div {
  7. width: 100px;
  8. height: 100px;
  9. }
  10. .div1 {
  11. background-color: pink;
  12. position: relative;
  13. }
  14. .div2 {
  15. background-color: cyan;
  16. }
  17. p {
  18. position: fixed;
  19. top: 10px;
  20. left: 10px;
  21. }
  22. </style>
  23. <body>
  24. <div class="div1">
  25. <p>
  26. div1 영역</p>
  27. </div>
  28. <div class="div2">
  29. <p>
  30. div2 영역
  31. </p>
  32. </div>
  33. </body>

 

<p>태그 position 속성을 fixed로 지정하였고. 부모 객체인 div1relative, div2static으로 지정된 상태입니다.

부모 객체의 position속성 값이 뭐든지 간에 <p>태그의 출력은 모두 동일한 곳에 위치합니다.

브라우저의 창을 위, 아래로 스크롤해보아도 동일한 위치에 있음을 알 수 있습니다.

5) inherit

부모 elementposition속성을 상속합니다. (IE7까지는 지원하지 않음)

 

: positionabsolute fixed로 설정 시 가로 크기가 100%가 되는 block 태그의 특징이 사라지며 inline-box처럼 

크기에 맞게 딱 붙게 됩니다.

  1. 5-8
  2. <style>
  3. body {
  4. margin: 0;
  5. }
  6. .div1 {
  7. background: pink;
  8. }
  9. .div2 {
  10. background: coral;
  11. position: absolute;
  12. top: 50px;
  13. }
  14. .div3 {
  15. background: cyan;
  16. position: fixed;
  17. top: 100px;
  18. }
  19. </style>
  20. <body>
  21. <div class="div1">
  22. div1 static
  23. </div>
  24. <div class="div2">
  25. div2 absolute
  26. </div>
  27. <div class="div3">
  28. div2 fixed
  29. </div>
  30. </body>

div1block 요소의 일반적인 특징으로 배치되어 가로 길이의 100%를 차지하지만 div2div3는 안에 있는 콘텐츠의 크기만큼의 길이를 가집니다.

 

여기까지 CSS에서 레이아웃을 만드는데 가장 중요한 display, float, position을 공부했습니다

부족한 게 많다고 생각되지만 여기서 빠진 내용들은 다른 것들을 공부하면서 더 설명하기로 하고 오늘은 여기서 끝입니다.

Posted by star story :

Snippet :: Code View :: "+location.href+'
'+b+"

");top.consoleRef.document.close()}$(".snippet-container").each(function(b){$(this).find("a.snippet-text").click(function(){var d=$(this).parents(".snippet-wrap").find(".snippet-formatted");var c=$(this).parents(".snippet-wrap").find(".snippet-textonly");d.toggle();c.toggle();if(c.is(":visible")){$(this).html("html")}else{$(this).html("text")}return false});$(this).find("a.snippet-window").click(function(){var c=$(this).parents(".snippet-wrap").find(".snippet-textonly").html();a(c);$(this).blur();return false})});$(".snippet-toggle").each(function(b){$(this).click(function(){$(this).parents(".snippet-container").find(".snippet-wrap").toggle()})})});