컨테이너의 나머지 너비를 채우는 스타일 입력 요소


199

다음과 같은 HTML 스 니펫이 있다고 가정 해 봅시다.

<div style="width:300px;">
    <label for="MyInput">label text</label>
    <input type="text" id="MyInput" />
</div>

이것은 내 정확한 코드는 아니지만 중요한 것은 고정 너비 컨테이너의 동일한 줄에 레이블과 텍스트 입력이 있다는 것입니다. 줄 바꿈없이 레이블의 크기를 알지 않고 컨테이너의 나머지 너비를 채우도록 입력 스타일을 어떻게 지정할 수 있습니까?


나는 오래 전에 질문이 있었음을 알고 있지만 물론 구식이 아닌 좋은 솔루션을 추가 할 것입니다.
— danijar

답변:


138

모든 사람이 레이아웃을 위해 테이블을 싫어하는 것처럼 명시적인 테이블 태그를 사용하거나 display : table-cell을 사용하여 이와 같은 작업을 수행합니다.

<div style="width:300px; display:table">
    <label for="MyInput" style="display:table-cell; width:1px">label&nbsp;text</label>
    <input type="text" id="MyInput" style="display:table-cell; width:100%" />
</div>

이것이 IE6에서 작동합니까? 그렇지 않으면 실제로 이것을 위해 작은 테이블을 정의해야 할 수도 있습니다. (
— Joel Coehoorn

확실하지 않습니다, 나는 그들이 무엇을하는지 확인하기 위해 빠른 테스트를 하겠지만 IE에 쉽게 접근 할 수 없습니다
— cobbal

괜찮습니다. 이것은 작동하는 것을 가리 켰습니다.
— Joel Coehoorn

42
Joel을 공유 하시겠습니까?
— John

10
동의, 당신은 우리의 다른 사람들과 실제 솔루션을 공유 하고 그 대답을 대신 답변으로 표시해야합니다.
— BrainSlugs83

156

다음은 JavaScript 또는 테이블 레이아웃 해킹을 사용하지 않는 간단하고 깨끗한 솔루션입니다. 이 답변과 비슷합니다. 입력 텍스트 자동 너비가 다른 요소를 부동으로 100 % 채 웁니다.

입력 필드를 범위 인로 감싸는 것이 중요합니다 display:block. 다음은 버튼이 먼저오고 입력 필드가 두 번째로되어야한다는 것입니다.

그런 다음 버튼을 오른쪽으로 띄우면 입력 필드가 나머지 공간을 채 웁니다.

form {
    width: 500px;
    overflow: hidden;
    background-color: yellow;
}
input {
    width: 100%;
}
span {
    display: block;
    overflow: hidden;
    padding-right:10px;
}
button {
    float: right;
}
<form method="post">
     <button>Search</button>
     <span><input type="text" title="Search" /></span>
</form>

간단한 바이올린 : http://jsfiddle.net/v7YTT/90/

업데이트 1 : 귀하의 웹 사이트가 최신 브라우저만을 대상으로하는 경우 유연한 상자를 사용하는 것이 좋습니다 . 여기 에서 현재 지원을 확인할 수 있습니다 .

업데이트 2 : 입력 필드와 전체를 공유하는 여러 버튼 또는 기타 요소에서도 작동합니다. 여기 예가 있습니다.


그러나 이렇게하면 HTML이 변경됩니다. 마지막에 원하는 항목이 HTML의 첫 번째에 나열됩니다.
— Joel Coehoorn 1

@JoelCoehoorn, 맞습니다. 테이블을 사용하는 것보다 선호하는 것이 당신의 결정입니다.
— danijar

2
이것은 잘 작동합니다. 오른쪽 대신 float : left를 사용하여 페이스 북 스타일 태그 또는 이와 유사한 것을 만듭니다.
— hobberwickey

1
이것은 잘 작동합니다! 그러나 누군가 이것이 어떻게 작동하는지에 대한 논리를 설명 할 수 있습니까?!
— 셜록

1
이것은 나쁜 대답입니다. 당신이 그것을 한 눈에 보아도 효과가있는 것처럼 보이지만 바이올린을 사용해보십시오. 실제로 입력 상자의 절반이 잘리지 만 테스트를 시작하지 않으면 알 수 없습니다. 목표는 입력 상자를 표시 영역의 너비에 맞추고 자르지 않는 것입니다. 스타일링 (둥근 모서리, 테두리, 텍스트의 오른쪽 정렬)을 시도하면 완전히 실패합니다.
— Roger Hill

55

Flexbox를 사용하는 것이 좋습니다.

그래도 적절한 공급 업체 접두사를 추가하십시오!

form {
  width: 400px;
  border: 1px solid black;
  display: flex;
}

input {
  flex: 2;
}

input, label {
  margin: 5px;
}
<form method="post">
  <label for="myInput">Sample label</label>
  <input type="text" id="myInput" placeholder="Sample Input"/>
</form>


문제는 매우 오래된 것입니다. 아마도 이것이 오늘 제가하는 일일 것입니다. 시도해 볼 수 있고 필요한 모든 브라우저에서 작동하면 허용되는 답변을 업데이트합니다. 아마, 이것을 시도하기까지 오랜 시간이 걸릴 것입니다. 나는 지금 sys 관리 팀에 있습니다. 더 이상 웹 작업을하지 마십시오.
— Joel Coehoorn

label? 를 사용하여 예제를 제공 할 수 있습니까? 나는 원래 질문에서 HTML을 어떻게 레이아웃 할 수 있는지에 관심이있을 것이다 border-box.
— lacco

4
왜 flex: 2그렇지 flex: 1않습니까?
— Iulius Curt

42

이를 위해 flexbox를 사용하십시오. 자식을 한 줄로 묶을 컨테이너가 있습니다. 첫 아이는 필요에 따라 공간을 차지합니다. 두 번째는 나머지 공간을 모두 차지합니다.

<div style="display:flex;flex-direction:row">
    <label for="MyInput">label&nbsp;text</label>
    <input type="text" id="MyInput" style="flex:1" />
</div>


하이 파이브! :) 추가 할 가치가있는 한 가지는 (우리 중 많은 사람들이 여전히 플렉스 박스 모델을 새롭게 수용하는 상황에서) : INPUT은 FORM 일 것이고, 이는 결국 전체 플렉스 컨테이너에서 끝날 수 있습니다 (예 : 다른 비 형식의 것들). 플렉스 동작 은 직계 자손 (예 : 자식 요소) 에만 적용 되기 때문에 더 이상 작동하지 않습니다 . 따라서 FORM도 플렉스 제한 기 여야합니다!
— Sz.

flex-direction은 row기본적으로 이미 지정되어 있으므로 지정할 필요가 없습니다.
— Fabian Picone

승리를위한 유연성 (다시); 2019 년 매우 관련있는 답변
— secretwep

17

이를 달성하는 가장 쉬운 방법은 다음과 같습니다.

CSS :

label{ float: left; }

span
{
    display: block;
    overflow: hidden;
    padding-right: 5px;
    padding-left: 10px;
}

span > input{ width: 100%; }

HTML :

<fieldset>
    <label>label</label><span><input type="text" /></span>
    <label>longer label</label><span><input type="text" /></span>
</fieldset>

다음과 같이 보입니다 : http://jsfiddle.net/JwfRX/


이것은 나를 위해 잘 작동합니다. 오버플로는 물건을 감싸지 않도록하고, 패딩 오른쪽은 오른쪽이 잘리지 않도록합니다.
— Von Lemongargle 교수님

추신 : 현대 브라우저를 사용하여 leishman이 위에서 설명한대로 flex-box를 사용하는 것이 좋습니다 ...
— lange

4

매우 쉬운 트릭은 CSS calc수식을 사용하는 것 입니다. 모든 최신 브라우저, IE9 및 광범위한 모바일 브라우저가이를 지원해야합니다.

<div style='white-space:nowrap'>
  <span style='display:inline-block;width:80px;font-weight:bold'>
    <label for='field1'>Field1</label>
  </span>
  <input id='field1' name='field1' type='text' value='Some text' size='30' style='width:calc(100% - 80px)' />
</div>

4
이것은 당신이 레이블의 정확한 너비를 알고 있거나 여분의 공간을 기꺼이 참을 것이라고 가정합니다.
— Nelson Rothermel

2

당신은 이것을 시도 할 수 있습니다 :

div#panel {
    border:solid;
    width:500px;
    height:300px;
}
div#content {
	height:90%;
	background-color:#1ea8d1; /*light blue*/
}
div#panel input {
	width:100%;
	height:10%;
	/*make input doesnt overflow inside div*/
	-webkit-box-sizing: border-box;
       -moz-box-sizing: border-box;
            box-sizing: border-box;
	/*make input doesnt overflow inside div*/
}
<div id="panel">
  <div id="content"></div>
  <input type="text" placeholder="write here..."/>
</div>


오늘 가장 좋은 방법
— yota

0

부트 스트랩 4를 사용하는 경우 :

<form class="d-flex">
  <label for="myInput" class="align-items-center">Sample label</label>
  <input type="text" id="myInput" placeholder="Sample Input" class="flex-grow-1"/>
</form>

더 나은 방법은 Bootstrap에 내장 된 것을 사용하는 것입니다.

  <form>
    <div class="input-group">
      <div class="input-group-prepend">
        <label for="myInput" class="input-group-text">Default</label>
      </div>
      <input type="text" class="form-control" id="myInput">
    </div>
  </form>

https://jsfiddle.net/nap1ykbr/

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