너비가 100 % 인 HTML 입력 텍스트 상자가 표 셀을 오버플로합니다.


106

너비가 100 % 인 입력 요소가 테이블의 셀 테두리를 넘는 이유를 아는 사람이 있습니까?

아래 입력 상자의 간단한 예에서 테이블의 셀 테두리를 넘어 가면 결과는 끔찍합니다. 이것은 테스트되었으며 Firefox, IE7 및 Safari에서 동일한 방식으로 발생합니다.

당신에게 의미가 있습니까? 내가 뭔가를 놓치고 있습니까? 가능한 해결책에 대해 알고 있습니까?

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">    
<html><head>    
   <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <!-- don't use closing slash in meta tag, it breaks HTML4.01 transitional -->
   <title>Test input text in table</title>
   <style type="text/css">      
      table {border-top: 1px solid #ff0000; border-left: 1px solid #ff0000;}
      table td {border-right: 1px solid #00ff00; border-bottom: 1px solid #00ff00;}
      input[type="text"] {width: 100%;} /* removing this would make input not to go over cells border, but they would be too short, I want them to fit cells size */
   </style>    
</head><body>

<table cellpadding="0" cellspacing="0">
   <tr>
      <td><p>column one hello babe babe babe</p></td>
      <td><p>column two hello babe more</p></td>
      <td><p>column three hello babe more and more</p></td>
   </tr>
   <tr>
      <td><input type="text" value="test"></td>
      <td><input type="text" value="test"></td>
      <td><input type="text" value="test"></td>
   </tr>
</table>

</body></html>

1
방금 입력을 제시하기위한 테이블을 사용하는 경우 나, 그 제안, 당신은 사용으로 전환 할 수 formlabel의와 input, 안쪽의 ulol. 즉, 적어도 약간 더 의미가 있습니다. 물론 그래도, 당신은을 사용한다 form당신이 함께 스틱을 할 경우에도 table.
다윗은 분석 재개 모니카 말한다

답변:


216

CSS3 box-sizing속성을 사용하여 외부 패딩 및 테두리를 포함 할 수 있습니다 .

input[type="text"] {
     width: 100%; 
     box-sizing: border-box;
     -webkit-box-sizing:border-box;
     -moz-box-sizing: border-box;
}

1
슬프지만 불행히도 IE 7은 상자 크기를 올바르게 처리하지 않습니다. IE 7에서 다음을 시도하십시오 ... css3.info/preview/box-sizing 또는 css-tricks.com/box-sizing
AnthonyVO

@AnthonyVO은 : 사실, IE7에 대한 유일한 해결 방법은 IE에게 조건부 주석 사용하여 특정 CSS를 추가하는 것입니다 <!--[if lt IE 8]>input[type="text"] {width:95%}
마르코 Demaio을

24

너비 값은 테두리 또는 패딩을 고려하지 않습니다.

http://www.htmldog.com/reference/cssproperties/width/

각면에 2px의 패딩과 각면에 1px의 테두리가 있습니다.
100 % + 2 * (2px + 1px) = 100 % + 6px, 부모 td가 가진 100 % 하위 콘텐츠보다 큽니다.

다음과 같은 옵션이 있습니다.

  • @pricco의 답변에box-sizing: border-box; 따라 설정하십시오 .
  • 또는 0 여백 및 패딩 사용 (추가 크기 방지).

Sr pts 답변에 더하여 패딩과 테두리를 0px로 설정하면 100 %가 작동합니다.
Mauro

실제로 td에 패딩을 설정하지 않아도 매우 잘 추가되었습니다.
ANeves

1
또한 패딩으로 인해 문제가 발생 text-indent하는 경우 텍스트 앞 가장자리 앞의 패딩과 line-height수직 패딩 을 시뮬레이션하는 데 사용할 수 있습니다 (수직 패딩을 유지해도 너비에 영향을주지 않음).
다윗은 분석 재개 모니카 말한다

14

이와 같은 문제 width:95%;는 넓고 유연한 레이아웃에서 제대로 보이지 않는다는 것입니다 (5 %는 30 픽셀과 같을 수 있기 때문입니다).

다음 솔루션은 저에게 매우 잘 작동합니다 (Firefox, IE 9, Safari에서 테스트 됨).

<table style="background-color: blue; width: 100%;" cellpadding="0" cellspacing="0">
<tr>
    <td style="background-color: red;   padding: 3px;">
        <div style="margin-right: 3px;">
            <div style="padding-right: 3px;">
                <input type="text" style="width:100%;">
            </div>
        </div>
    </td>
    <td style="background-color: purple;   padding: 3px;">
        <div style="margin-right: 3px;">
            <div style="padding-right: 3px;">
                <input type="text" style="width:100%;">
            </div>
        </div>
    </td>
    <td style="background-color: green;   padding: 3px;">
        <div style="margin-right: 3px;">
            <div style="padding-right: 3px;">
                <input type="text" style="width:100%;">
            </div>
        </div>
    </td>
</tr>
</table>

(올바른 패딩을 쉽게 알아볼 수 있도록 색상을 추가했습니다.)

트릭은 입력을 두 개의 div로 래핑하는 것입니다. 바깥쪽에는 3px 여백 (td보다 3px 더 작음)이 있고 안쪽에는 3px 패딩이 있습니다. 이것은 입력을 시작하려는 td보다 6px 더 작게 만듭니다.

나는 이것의 메커니즘에 대해 확신하지 못하지만 작동합니다.

이 간단한 예제에서는 오른쪽 여백이 6 인 단일 div에서도 작동합니다. 그러나 내 웹 응용 프로그램의 경우 위의 솔루션 만 작동합니다.

<table style="background-color: blue; width: 100%;" cellpadding="0" cellspacing="0">
<tr>
    <td style="background-color: red;   padding: 3px;">
        <div style="margin-right: 6px;">
                <input type="text" style="width:100%;">
        </div>
    </td>
    <td style="background-color: purple;   padding: 3px;">
        <div style="margin-right: 6px;">
                <input type="text" style="width:100%;">
        </div>
    </td>
    <td style="background-color: green;   padding: 3px;">
        <div style="margin-right: 6px;">
                <input type="text" style="width:100%;">
        </div>
    </td>
</tr>
</table>

작동합니다 (찬성 +1). 이상하게도 각 <input> 앞에 일부 텍스트를 삽입하고 "white-space : nowrap"을 추가하여 동일한 줄에 유지 한 다음 "white-space : nowrap"를 모두 제거하면 세 개의 <inputs>가 테이블 셀을 오버플로했습니다. 다시 작동합니다. 기묘한.
Jose Manuel Abarca Rodríguez

8

문제는 이전에 설명되었으므로 다시 반복하겠습니다. 너비는 테두리와 패딩을 고려하지 않습니다. 이것에 대한 한 가지 가능한 대답은 논의되지 않았지만 내가 찾은 많은 도움이 당신의 입력을 감싸는 것입니다. 다음은 코드이며, 이것이 어떻게 도움이되는지 잠시 후에 설명하겠습니다.

<table>
  <tr>
    <td><div style="overflow:hidden"><input style="width:100%" type="text" name="name" value="hello world" /></div></td>
  </tr>
</table>

INPUT을 감싸는 DIV에는 패딩도없고 테두리도 없습니다. 이것이 해결책입니다. DIV는 컨테이너의 크기로 확장되지만 테두리와 패딩도 고려합니다. 이제 INPUT은 테두리가없고 패드가 없기 때문에 컨테이너 크기로 확장하는 데 문제가 없습니다. 또한 DIV에는 오버플로가 숨김으로 설정되어 있습니다. 기본적으로 항목은 기본 오버플로가 표시되어 컨테이너 외부로 떨어질 수 있습니다. 이렇게하면 입력이 컨테이너 내부에 유지되고 뚫고 들어 가려고하지 않습니다.

나는 이것을 Chrome과 Fire Fox에서 테스트했습니다. 둘 다이 솔루션을 잘 존중하는 것 같습니다.

업데이트 : 방금 무작위 반대 투표를 받았기 때문에 오버플로를 처리하는 더 좋은 방법은 pricco가 설명하는 CSS3 box-sizing 속성을 사용하는 것이라고 말하고 싶습니다.

.myinput {
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -ms-box-sizing: border-box;
    -o-box-sizing: border-box;
    box-sizing: border-box;
}

이것은 주요 브라우저에서 꽤 잘 지원되는 것으로 보이며 오버플로 트릭처럼 "해키"되지 않습니다. 그러나이 방법을 사용하는 현재 브라우저에는 몇 가지 사소한 문제가 있습니다 ( http://caniuse.com/#search=box-sizing 알려진 문제 참조 ).


3
짧은 메모 : overflow: hidden;콘텐츠가 여전히 상자 외부로 똑같은 방식으로 '찌르는'상태이지만 표시되는 대신 잘려서 다른 콘텐츠와 겹치지 않습니다.
ANeves

2

나는이 질문이 3 년이라는 것을 알고 있지만 현재 브라우저에서 문제가 여전히 지속되고 사람들이 여전히 여기에오고 있습니다. 현재 해결책은 calc ()입니다 .

input {
    width: calc(100% - 12px); /* IE 9,10 , Chrome, Firefox */
    width: -webkit-calc(100% - 12px); /*For safari 6.0*/
}

대부분의 최신 브라우저에서 지원됩니다.


1

문제는 입력 요소 상자 모델 때문입니다. 최근에 모바일 장치에서 입력을 100 %로 유지하려고 할 때 문제에 대한 좋은 해결책을 찾았습니다.

입력을 다른 요소 (예 : div)로 래핑합니다. 그런 다음 입력에 원하는 스타일을 래퍼 div에 적용합니다. 예를 들면 :

<div class="input-wrapper">
 <input type="text" />
</div>

.input-wrapper {
    border-raius:5px;
    padding:10px;
}
.input-wrapper input[type=text] {
    width:100%;
    font-size:16px;
}

입력에 원하는대로 .input-wrapper 둥근 모서리 패딩 등을 제공 한 다음 입력 너비를 100 %로 지정합니다. 입력 내용이 테두리 등으로 멋지게 채워졌지만 성가신 오버플로가 없습니다!


1

@hallodom의 답변으로 시작 하여이 문제를 해결했습니다. 내 모든 입력은 li에 포함되어 있으므로 초과 입력 오버플로를 제거하기 위해 li overflow : hidden을 설정하기 만하면됩니다.

.ie7 form li {
  width:100%;
  overflow:hidden;
}

.ie7 input {
  width:100%;
}

1

이 마진 투쟁 대신 그냥

input{
    width:100%;
    background:transparent !important;
}

이렇게하면 셀 테두리가 표시되고 행 배경색을 제어 할 수 있습니다.


0

DOCTYPE 선언에서 "http://www.w3.org/TR/html4/loose.dtd"를 꺼내면 문제가 해결됩니다.

건배! :)


http://www.w3.org/TR/html4/strict.dtdStrict를 사용한다는 뜻 입니까? 심판. w3.org/QA/2002/04/valid-dtd-list.html 어쨌든 이것은 옵션이 아니므로 DOCTYPE을 변경하면 웹 페이지의 다른 많은 stuf 렌더링에 영향을 미칠 수 있습니다.
Marco Demaio 2011

0

일부 Javascript를 사용하면 포함하는 TD의 정확한 너비를 얻은 다음 입력 요소에 직접 할당 할 수 있습니다.

다음은 원시 자바 스크립트이지만 jQuery는 더 깨끗하게 만들 것입니다 ...

var inputs = document.getElementsByTagName('input');
for (var i = 0; i < inputs.length; i++)
{
    var el = inputs[i];
    if (el.style.width == '100%')
    {
        var pEl = el.parentNode;  // Assumes the parent node is the TD...
        el.style.width = pEl.offsetWidth;
    }
}

이 솔루션의 문제는 다음과 같습니다.

1) SPAN과 같은 다른 요소에 입력이 포함 된 경우 SPAN과 같은 요소가 입력을 래핑하고 TD의 크기로 제한되지 않고 크기를 표시하기 때문에 루프 업하고 TD를 찾아야합니다.

2) 패딩이나 여백이 다른 수준에 추가 된 경우 [pEl.offsetWidth]에서 명시 적으로 빼야 할 수 있습니다. 계산할 수있는 HTML 구조에 따라.

3) 테이블 열의 크기가 동적으로 조정되는 경우 한 요소의 크기를 변경하면 일부 브라우저에서 테이블이 리플 로우되고 입력 크기를 순차적으로 "수정"할 때 단계별 효과를 얻을 수 있습니다. 해결책은 특정 너비를 백분율 또는 픽셀로 열에 할당하거나 새 너비를 수집하여 나중에 설정하는 것입니다. 아래 코드를 참조하십시오 ..

var inputs = document.getElementsByTagName('input');
var newSizes = [];
for (var i = 0; i < inputs.length; i++)
{
    var el = inputs[i];
    if (el.style.width == '100%')
    {
        var pEl = el.parentNode;  // Assumes the parent node is the TD...
        newSizes.push( { el: el, width: pEl.offsetWidth });
    }
}

// Set the sizes AFTER to avoid stepping...
for (var i = 0; i < newSizes.length; i++)
{
    newSizes[i].el.style.width = newSizes[i].width;
}

0

신청하여 문제를 해결했습니다 box-sizing:border-box. 입력 및 래퍼로 동일한 작업을 수행하는 것 외에도 테이블 셀 자체에.


0

이것을 사용하여 문제를 해결했습니다.

tr td input[type=text] {
  width: 100%;
  box-sizing: border-box;
  -webkit-box-sizing:border-box;
  -moz-box-sizing: border-box;
  background:transparent !important;
  border: 0px;
}

-1

이 문제를 해결하기 위해 일반적으로 입력 너비를 99 %로 설정합니다.

input {
    width: 99%;
}

기본 스타일을 제거 할 수도 있지만이 경우 텍스트 상자가 명확하지 않게됩니다. 그러나 어쨌든 이에 대한 코드를 보여줄 것입니다.

input {
    width: 100%;
    border-width: 0;
    margin: 0;
    padding: 0;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
}

Ad @ m


-2

문제는 border-width입력 요소에 있습니다. 곧 margin-left입력 요소의를로 설정해보십시오 -2px.

table input {
  margin-left: -2px;
}

그렇게 생각하지 마십시오. 그건 그냥 왼쪽에있는 상자를 이동하고 왼쪽 여백 파괴
젊은 CC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.