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


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.