CSS : "div"안에 "라벨"과 "입력"을 수직으로 정렬하는 방법은 무엇입니까?


92

다음 코드를 고려하십시오 .

HTML :

<div>
    <label for='name'>Name:</label>
    <input type='text' id='name' />
</div>

CSS :

div {
    height: 50px;
    border: 1px solid blue;
}

풋하는 가장 쉬운 방법이 있을까요 label과을 input의 중간에 div(수직)?


1
내가 아는 한, 결론은 "당신은 할 수 없다"이고, 그 주위의 가장 게으른 방법은 간단한 것을 사용하고 그것 의 s에 <table>적용 valign='middle'하는 것 <td>입니다.
BeemerGuy 2010

답변:


97

div {
    display: table-cell;
    vertical-align: middle;
    height: 50px;
    border: 1px solid red;
}
<div>
    <label for='name'>Name:</label>
    <input type='text' id='name' />
</div>

이 방법의 장점은의 높이를 div변경하고 텍스트 필드의 높이를 변경하고 글꼴 크기를 변경할 수 있으며 모든 것이 항상 중간에 유지된다는 것입니다.

http://jsfiddle.net/53ALd/6/


1
우아해 보인다 :) 누구든지이 방법이 브라우저와 어떻게 호환되는지 알고 있습니까?
Zaven Nahapetyan 2010

1
IE의 경우 IE8 이상에서만 작동한다고 생각합니다. 다른 웹 브라우저의 경우 괜찮습니다.
Marc-François

1
나는 display: table-cell. 특정 브라우저에서 지원 되나요?
BeemerGuy 2010

7
@Misha 당신은 입력 / 레이블이 절대적으로 위치한다는 사실을 지정해야합니다. 그것은 질문의 상황을 완전히 바꿉니다. 마크에게 +1을주고 있습니다. 좋은 대답입니다.
jessegavin 2010

2
나는 jenson이 만들려고 한 요점 (그리고 분명히 말해야 함)은 display: table-cell동일한 라인에서 렌더링하는 후속 div와 같이 div가 작동하지 않는 방식으로 작동한다는 것입니다.
taswyn 2013

74

보다 현대적인 접근 방식은 CSS 플렉스 박스를 사용하는 것입니다.

div {
  height: 50px;
  background: grey;
  display: flex;
  align-items: center
}
<div>
  <label for='name'>Name:</label>
  <input type='text' id='name' />
</div>

더 복잡한 예 ... 플렉스 흐름에 여러 요소가있는 경우 align-self를 사용하여 단일 요소를 지정된 정렬과 다르게 정렬 할 수 있습니다.

div {
  display: flex;
  align-items: center
}

* {
  margin: 10px
}

label {
  align-self: flex-start
}
<div>
  <img src="https://de.gravatar.com/userimage/95932142/195b7f5651ad2d4662c3c0e0dccd003b.png?size=50" />
  <label>Text</label>
  <input placeholder="Text" type="text" />
</div>

또한 수평 및 수직으로 중앙에 쉽게 배치 할 수 있습니다.

div {
  position:absolute;
  top:0;left:0;right:0;bottom:0;
  background: grey;
  display: flex;
  align-items: center;
  justify-content:center
}
<div>
  <label for='name'>Name:</label>
  <input type='text' id='name' />
</div>


라벨에 이미지와 텍스트가있을 때 이것이 작동하기를 바랍니다. 작은 아이콘 뒤에 텍스트가 있지만 텍스트가 움직이지 않습니다.
케빈 Scharnhorst

너무 당신의 lable가의 인 flexbox 당신의 메이크업 경우는 ... 레이블과 텍스트는 별도의 요소가있는 경우 작동, 또는
홀거 윌

display:flex호환성이 낮고 크롬 29 이상

14

이것은 브라우저간에 작동하고 더 많은 접근성을 제공하며 마크 업이 적습니다. 사업부를 버리십시오. 라벨 포장

label{
     display: block; 
     height: 35px; 
     line-height: 35px; 
     border: 1px solid #000; 
}

input{margin-top:15px; height:20px}

<label for="name">Name: <input type="text" id="name" /></label>

3
이것은 분명히 두 줄 레이블에서 작동하지 않습니다. 그리고 라벨이 항상 한 줄이라는 것을 확신한다면, 수백만 개의 다른 대안이 있습니다.
Lashae apr

16
질문은 한 줄 레이블에 관한 것이었고 그에 따라 대답했습니다. 여기서 당신의 요점이나 의도는 확실하지 않지만 x가 너무 분명하다면 백만 가지 예를 만들어야합니다. 적어도 내 대답에 찬사를 보내고 백만 번의 승리의 힘을 느낄 수 있습니다. 브라보.
albert

2
이것은 한 줄 레이블에 대한 최상의 답변입니다. 사양에 따르면 "for 속성이 지정되지 않았지만 레이블 요소에 레이블 가능한 양식 관련 요소 하위 항목이있는 경우 트리 순서에서 이러한 첫 번째 하위 요소는 레이블 요소의 레이블이 지정된 컨트롤입니다." 따라서 이것은 최대한의 단순성을 위해 forid속성을 생략 할 수있는 유일한 방법 입니다.
의회

8

이 질문이 2 년 전에 요청되었다는 것을 알고 있지만 최근 시청자의 경우 Marc-François의 솔루션보다 몇 가지 장점이있는 대체 솔루션이 있습니다.

div {
    height: 50px;
    border: 1px solid blue;
    line-height: 50px;
}

여기 line-height에서는 div의 높이와 동일한 값만 추가합니다 . 장점은 inline-block예를 들어 div의 표시 속성 을 예를 들어 적합하다고 생각되면 변경할 수 있으며 내용이 세로 중앙에 유지된다는 것입니다. 허용되는 솔루션을 사용하려면 div를 테이블 셀로 취급해야합니다. 브라우저 간 완벽하게 작동합니다.

유일한 다른 장점은 두 개가 아닌 하나의 CSS 규칙이라는 것입니다. :)

건배!


6

사용 padding상의 div( 상단 및 하단 )와 vertical-align:middle상의 label하고 input.

http://jsfiddle.net/VLFeV/1/의


jsfiddle에서는 작동하지 않습니다. 높이를 변경 div했는데 내용물이 전혀 움직이지 않았습니다. 내가 뭔가를 놓치고 있습니까?
BeemerGuy 2010

제 생각에는 레이아웃의 픽셀 높이가 고정되어서는 안됩니다. 레이아웃은 콘텐츠 주위에 유동적으로 흐르어야합니다. 그러나 나는 브라우저가 확대 및 축소 할 때 텍스트 크기를 조정하는 날과 시간에서 왔습니다. 최근 브라우저는 실제로 전체 페이지의 크기를 조정하므로 픽셀 높이 설정이 조금 더 잘 작동합니다. 그러나 픽셀 높이 설정을 피해야하는 완전히 새로운 이유가 있습니다. 예를 들어 반응 형 레이아웃 기술입니다. 이것이 제가 선호하는 방법 인 이유입니다.
thirdender

3

레이블과 입력을 정의 된 높이로 다른 div에 래핑합니다. 8 미만의 IE 버전에서는 작동하지 않을 수 있습니다.

position:absolute; 
top:0; bottom:0; left:0; right:0;
margin:auto;

0

display: table-cell다음 코드와 같이 속성을 사용할 수 있습니다 .

div {
     height: 100%;
     display: table-cell; 
     vertical-align: middle;
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.