2. 컴퓨터 이야기/프로그래밍

CSS 를 이용한 수직 가운데 정렬, table 태그냐 div 태그냐..?

래빗 크리스 2009. 8. 2. 18:08

아래 코드를 사용하면 3개의 input 태그는 수직으로 가운데 정렬이 되는데,
나머지 img 태그는 위쪽으로 붙어 버린다.
img 태그에 padding 이나 margin 스타일을 먹여도 요지부동.
<div>
  <input type="text" name="name1" value="" size="3" readOnly> -
  <input type="text" name="name2" value="" size="3" readOnly>
  <input type="text" name="name3" value="">
  <img src="./btn_address.gif" onClick="">
</div>

역시 구관이 명관이라고, table 태그로 전환하면 해결이 되는데..
만약 td 태그 안에 여러 내용이 혼합되어 사용된다면 td 태그에 속성을 더 설정해 주어야 한다.
<table>
<tr>
  <td><input type="text" name="name1" value="" size="3" readOnly></td>
  <td>-</td>
  <td><input type="text" name="name2" value="" size="3" readOnly></td>
  <td><input type="text" name="name3" value=""></td>
  <td><img src="./btn_address.gif" onClick=""></td>
</tr>
</table>

아래와 같이 vAlign 속성을 middle 로 주거나, align 속성에 middle 을 주면 해결.
vAlign 에 middle 을 주거나 align 에 center 를 주는 것은 봤지만, align 에 middle 을 준다꼬..? 한번 해 보시라.
그런데, 코드가 복잡해 졌다.. 이거는 조금 곤란해 졌네.. 크윽.
<table>
<tr>
  <td align="middle"><input type="text" name="name1" value="" size="3" readOnly></td>
  <td align="middle">-</td>
  <td align="middle"><input type="text" name="name2" value="" size="3" readOnly></td>
  <td align="middle"><input type="text" name="name3" value=""></td>
  <td align="middle"><img src="./btn_address.gif" onClick=""></td>
</tr>
</table>

다시 div 형식으로 돌아와서, input 과 img 에 vertical-align:middle 스타일을 먹여 보자.
으음.. 이제는 수직으로 가운데 정렬이 되는 모습이다.
그런데 반복적인 태그가 가독성을 떨어뜨린다..
<div>
  <input type="text" name="name1" value="" size="3" readOnly style="vertical-align:middle"> -
  <input type="text" name="name2" value="" size="3" readOnly style="vertical-align:middle">
  <input type="text" name="name3" value="" style="vertical-align:middle">
  <img src="./btn_address.gif" onClick="" style="vertical-align:middle">
</div>

한눈에 코드가 들어오지 않는 것은 마찬가지.. 스타일을 위로 뽑아서 통합해 보자.
input 이나 img 에 세로정렬 스타일을 먹이든 먹이지 않든 어디에서나 비슷하게 적용될 것이기 때문에,
상기와 같은 코드로 가도 되겠다.
그런데, 만약 input 이나 img 가 동일 웹페이지의 다른 곳에도 사용되고, 다른 곳에서는 이런 스타일이 적용되면
안 되는 상황에서는 어떻게 해야 할까..?

<style>
input {vertical-align:middle}
img {vertical-align:middle}
</style>

<div>
  <input type="text" name="name1" value="" size="3" readOnly> -
  <input type="text" name="name2" value="" size="3" readOnly>
  <input type="text" name="name3" value="">
  <img src="./btn_address.gif" onClick="">
</div>


자, 아래와 같이 input 태그에서 class 속성값이 va 인 경우에만 vertical-align:middle 스타일이 먹게 하면 되겠다.
input.va 대신에 input#va 를 사용한다면 class 대신에 id 를 사용하면 되는데,
아래와 같은 경우에는 input 이 여러개 이므로, id 보다는 class 방식으로 처리하는 것이 무난하겠다.
input 이나 img 태그와 상관없이 vertical-align:middle 스타일이 먹게 하려면 어떻게 해야 할까..?
<style>
input.va {vertical-align:middle}
img.va {vertical-align:middle}
</style>

<div>
  <input class="va" type="text" name="name1" value="" size="3" readOnly> -
  <input class="va" type="text" name="name2" value="" size="3" readOnly>
  <input class="va" type="text" name="name3" value="">
  <img class="va" src="./btn_address.gif" onClick="">
</div>


아래와 같이 va Alias 앞에 '.' 만 찍으면 된다. 이때도, 만약 하나의 id 에만 스타일이 먹게 하려면 #.va 로 정의하면 된다.
<style>
.va {vertical-align:middle}
</style>

<div>
  <input class="va" type="text" name="name1" value="" size="3" readOnly> -
  <input class="va" type="text" name="name2" value="" size="3" readOnly>
  <input class="va" type="text" name="name3" value="">
  <img class="va" src="./btn_address.gif" onClick="">
</div>


아무튼, 기본적인 설정으로 기능만 맞추면 되지뭐, 이렇게 생각했다가,
다시 예쁘게 다듬으려니까 코드가 점점 복잡해진다..
그러나, 어쩌랴.. 예쁜 떡이 더 맛있는걸..