입력 옆에 레이블을 형태로 정렬


136

입력 옆에 레이블을 올바르게 정렬 해야하는 매우 기본적이고 알려진 형식의 시나리오가 있습니다. 그러나 나는 그것을하는 방법을 모른다.

내 목표는 라벨이 오른쪽 입력 옆에 정렬되는 것입니다. 다음은 원하는 결과의 예입니다.

여기에 이미지 설명을 입력하십시오

나는 당신의 편의를 위해 바이올린을 만들었고 지금 가지고있는 것을 분명히하기 위해 http://jsfiddle.net/WX58z/

단편:

<div class="block">
    <label>Simple label</label>
    <input type="text" />
</div>
<div class="block">
    <label>Label with more text</label>
    <input type="text" />
</div>
<div class="block">
    <label>Short</label>
    <input type="text" />
</div>

답변:


189

하나의 가능한 해결책 :

  • 레이블을 제공하십시오 display: inline-block;
  • 그들에게 고정 폭을 줘
  • 텍스트를 오른쪽으로 정렬

그건:

label {
  display: inline-block;
  width: 140px;
  text-align: right;
}​
<div class="block">
    <label>Simple label</label>
    <input type="text" />
</div>
<div class="block">
    <label>Label with more text</label>
    <input type="text" />
</div>
<div class="block">
    <label>Short</label>
    <input type="text" />
</div>

JSFiddle


4
일부 레이블이 확인란 또는 라디오 단추 인 경우 어떻게 작동합니까? 이러한 요소의 레이블은 원하지 않는 텍스트 상자 레이블과 동일한 고정 너비로 ​​끝납니다. 레이블에 고정 너비 없이이 작업을 수행 할 수 있습니까?
Rebecca Meritz

@RebeccaMeritz 마크 업에 확인란이 먼저 표시되고 레이블이 나중에 표시되는 것을 의미합니까? 둘 다에 클래스를 추가하고 별도로 스타일을 지정할 수 있습니다. 아마도 당신은 그것에 대해 새로운 질문 을해야 합니다.
bfavaretto

2
이것을 반응 적으로 만드는 방법? 그리고 i18n에 대처하는 방법? 텍스트 레이블의 길이가 언어마다 다르므로 텍스트가 긴 경우 고정 너비 채우기를 설정해도 작동하지 않을까 걱정됩니다.
방위각

@Azimuth 요즘에는 CSS 그리드를 대신 사용하고 싶을 수도 있습니다.
bfavaretto

1
이것은 고정 너비로 ​​표시되며 최대 레이블 너비를 기준으로 동적이어야합니다.
Samyak Jain

27

여기에 솔루션을 사용할 수 있지만 더 나은 솔루션이라고 생각하는 최신 기술이 만들어졌습니다. CSS 그리드 레이아웃을 사용하면보다 우아한 솔루션을 구성 할 수 있습니다.

아래 CSS는 2 열 "설정"구조를 제공합니다. 첫 번째 열은 오른쪽 정렬 레이블이되고 두 번째 열의 일부 내용이 뒤 따릅니다. 더 복잡한 내용은 <div>로 감싸서 두 번째 열에 표시 할 수 있습니다.

[부수적으로 : CSS를 사용하여 각 레이블을 뒤 따르는 ':'을 추가합니다. 이는 스타일 요소이기 때문에 선호합니다.]

/* CSS */

div.settings {
    display:grid;
    grid-template-columns: max-content max-content;
    grid-gap:5px;
}
div.settings label       { text-align:right; }
div.settings label:after { content: ":"; }
<!-- HTML -->

<div class="settings">
    <label>Label #1</label>
    <input type="text" />

    <label>Long Label #2</label>
    <span>Display content</span>

    <label>Label #3</label>
    <input type="text" />
</div>


1
이봐, 바이올린 좀주세요
Stan

예, 스 니펫을 사용하도록 답변을 업데이트했습니다.
David Rutherford

어떤 Chrome 버전과 플랫폼에 문제가 있습니까?
David Rutherford

1
최적의 솔루션! Chrome 73
Philipp Michalski

대박! 위의 열 정의를로 바꾸면 grid-template-columns: max-content 1fr;두 번째 열은 나머지 모든 너비를 사용합니다. 이것은 열이나 내용 너비를 지정하지 않아야하고 모든 것이 사용 가능한 공간에 자동으로 자동으로 맞는 레이아웃의 성배입니다.
jeff-h

12

전에 이와 같은 질문에 대답하면 결과를 살펴볼 수 있습니다.

필드와 텍스트를 나란히 배치하는 양식 만들기-의미 론적 방법은 무엇입니까?

따라서 동일한 규칙을 바이올린에 적용하려면 다음과 display:inline-block같이 레이블과 입력 그룹을 나란히 표시 하는 데 사용할 수 있습니다 .

CSS

input {
    margin-top: 5px;
    margin-bottom: 5px;
    display:inline-block;
    *display: inline;     /* for IE7*/
    zoom:1;              /* for IE7*/
    vertical-align:middle;
    margin-left:20px
}

label {
    display:inline-block;
    *display: inline;     /* for IE7*/
    zoom:1;              /* for IE7*/
    float: left;
    padding-top: 5px;
    text-align: right;
    width: 140px;
}

바이올린 업데이트


이것은 레이블 너비를 하드 코딩해야한다는 사실을 제외하고는 매우 훌륭한 솔루션입니다. 새 레이블이 너무 길면 레이아웃이 끊어집니다. 더 강력한 솔루션이 있어야합니까?
mattstuehler

8

나는 이것과 비슷한 것을 사용한다 :

<div class="form-element">
  <label for="foo">Long Label</label>
  <input type="text" name="foo" id="foo" />
</div>

스타일:

.form-element label {
    display: inline-block;
    width: 150px;
}

4

flex-box를 사용해 볼 수도 있습니다.

<head><style>
body {
    color:white;
    font-family:arial;
    font-size:1.2em;
}
form {
    margin:0 auto;
    padding:20px;
    background:#444;
}
.input-group {
    margin-top:10px;
    width:60%;
    display:flex;
    justify-content:space-between;
    flex-wrap:wrap;
}
label, input {
    flex-basis:100px;
}
</style></head>
<body>

<form>
    <div class="wrapper">
        <div class="input-group">
            <label for="user_name">name:</label>
            <input type="text" id="user_name">
        </div>
        <div class="input-group">
            <label for="user_pass">Password:</label>
            <input type="password" id="user_pass">
        </div>
    </div>
</form>

</body>
</html>

그것은 예쁘지 만 그가 요구 한 것은 아닙니다. 영업 이익 그림 참조
phorgan1

3

나는 이것이 오래된 스레드라는 것을 알고 있지만 더 쉬운 해결책은 다음과 같이 레이블 내에 입력을 포함시키는 것입니다.

<label>Label one: <input id="input1" type="text"></label>


나는 이것에 대한 해결책을 찾고 있었지만 (라벨 안에 입력 포함) 정렬 된 텍스트
Natim

0

다음은 모든 양식 레이블의 일반 레이블 너비입니다. 고정 너비가 없습니다.

모든 레이블이있는 setLabelWidth 계산기를 호출하십시오. 이 기능은 UI에 모든 레이블을로드하고 최대 레이블 너비를 찾습니다. 아래 함수의 반환 값을 모든 레이블에 적용하십시오.

     this.setLabelWidth = function (labels) {
            var d = labels.join('<br>'),
                dummyelm = jQuery("#lblWidthCalcHolder"),
                width;
            dummyelm.empty().html(d);
            width = Math.ceil(dummyelm[0].getBoundingClientRect().width);
            width = width > 0 ? width + 5: width;
            //this.resetLabels(); //to reset labels.
            var element = angular.element("#lblWidthCalcHolder")[0];
            element.style.visibility = "hidden";
            //Removing all the lables from the element as width is calculated and the element is hidden
            element.innerHTML = "";
            return {
                width: width,
                validWidth: width !== 0
            };

        };

0

다음과 같이 할 수 있습니다 :

HTML :

<div class='div'>
<label>Something</label>
<input type='text' class='input'/>
<div>

CSS :

.div{
      margin-bottom: 10px;
      display: grid;
      grid-template-columns: 1fr 4fr;
}

.input{
       width: 50%;
}

도움이 되었기를 바랍니다 ! :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.