CSS에서 텍스트와 선택 상자를 같은 너비로 정렬 하시겠습니까?


81

좋아, 이것은 옳은 일이 불가능 해 보입니다. 텍스트 상자와 선택 상자가 있습니다. 왼쪽 여백과 오른쪽 여백에 정렬되도록 정확히 같은 너비를 원합니다.

<!DOCTYPE html>
<html>
    <head>
        <style type="text/css">
            input, select {
                width: 200px;
            }
        </style>
    </head>
    <body>
        <input type="text" value="ABC"><br>
        <select>
            <option>123</option>
        </select>
    </body>
</html>

그렇게 생각하면 되겠죠? 아니. 선택 상자는 Firefox에서 6px 더 짧습니다. 스크린 샷을 참조하십시오.Firefox의 스크린 샷

이제 코드를 편집하고 두 가지 스타일을 만들어 보겠습니다.

<style type="text/css">
    input {
        width: 200px;
    }
    select {
        width: 206px;
    }
</style>

작동합니다!

Firefox에서 수정 됨

잠깐, Chrome에서 더 나은 테스트 ...

크롬 스크린 샷

FFFFFFFUUUUUUUUUUUU

누군가가 모든 브라우저에서 이들을 정렬하는 방법을 말해 줄 수 있습니까? 너비 : 200px를 모두 할 수없는 이유는 무엇입니까? 모든 브라우저가 다르게 표시하는 이유는 무엇입니까? 또한 우리가 텍스트 상자와 선택 상자의 높이가 다른 이유는 무엇입니까? 어떻게 같은 높이로 만들까요? 높이와 선 높이를 시도했지만 아무 소용이 없습니다.


해결책:

좋아, 아래 답변에서 도움을 받아 해결책을 찾았습니다. 핵심은 box-sizing : border-box 속성을 사용 하여 테두리와 패딩 을 포함 하는 너비를 지정할 때 사용하는 것 입니다. 여기에서 훌륭한 설명을 참조 하십시오 . 그러면 브라우저는 그것을 채워 넣을 수 없습니다.

아래 코드는 상자의 높이를 같은 크기로 설정하고 상자 안의 텍스트를 들여 쓰기하여 정렬되도록했습니다. Chrome에는 정렬을 버리는 선택 상자에 사용하는 정말 이상한 테두리가 있으므로 테두리를 설정해야합니다. 이는 HTML5 사이트 (예 : IE9, Firefox, Chrome, Safari, Opera 등 지원)에서 작동합니다.

<!DOCTYPE html>
<html>
    <head>
        <style type="text/css">
            input, select {
                width: 200px;
                border: 1px solid #000;
                padding: 0;
                margin: 0;
                height: 22px;
                -moz-box-sizing: border-box;
                -webkit-box-sizing: border-box;
                box-sizing: border-box;
            }
            input {
                text-indent: 4px;
            }
        </style>
    </head>
    <body>
        <input type="text" value="ABC"><br>
        <select>
            <option>123</option>
            <option>123456789 123123123123</option>
            <option>123456789 123123123123 134213721381212</option>
        </select>
    </body>
</html>

마지막 경고는이 스타일링에 입력 버튼, 체크 박스 등이 포함되는 input:not([type='button'])것을 원하지 않을 수 있으므로를 사용하여 특정 유형에 적용하지 않거나 적용 할 유형 input[type='text'], input[type='password']을 지정 하는 데 사용하십시오.


3
이 정도의 정밀도를 가져야한다면 웹 디자이너로서 만족하지 못할 것입니다.
Scott Saunders 2012

2
예 CSS는 매일 @Scott을 미치게 만듭니다. :)
zuallauz

2
상자 크기 조정은 IE7 (사용자의 약 3 %)에서 지원되지 않습니다. 그리고 사용하지 않을 : 없습니다 -이 : 사용자의 20 % 인 LTE IE8에서 지원되지 않는
익명

상자 크기 IE8에서 작동합니다! 지난 몇 년 동안 저는 <select> 스타일링에 특정 너비를 추가했습니다 ...
GlennG 2013-10-30

상자 크기 조정 작업 수행
피에르

답변:


7

이는 <input type="text" />요소의 기본 스타일 이 요소와 약간 다르기 때문입니다 ( <select>예 : 테두리, 패딩 및 여백 값이 다를 수 있음).

이러한 기본 스타일은 Firefox 용 Firebug 또는 Chrome 용 내장 기능과 같은 요소 검사기를 통해 관찰 할 수 있습니다. 또한 이러한 기본 스타일 시트는 브라우저마다 다릅니다.

두 가지 옵션이 있습니다.

  1. 두 요소에 대해 테두리, 패딩 및 여백 값을 명시 적으로 설정합니다.
  2. 자신의 CSS 스타일 시트 앞에 포함될 CSS 재설정 스타일 시트

옵션 2는 많은 작업이 필요하고 불필요한 CSS가 많이 발생하기 때문에 옵션 1을 사용합니다. 그러나 일부 웹 개발자는 처음부터 시작하여 완전한 제어를 선호합니다.


2
CSS 재설정은 이와 같은 경우에 나쁜 생각이 아닙니다.
Remy

1
경량 CSS 재설정이 있지만 당연히 원하지 않는 부작용이있을 수 있습니다. CSS 재설정 스타일 시트로 디자인 을 시작 하면 이 옵션이 훨씬 더 매력적입니다.
Thomas Upton 2012

padding:0; margin:0; border:1px solid #000;텍스트 / 선택 상자의 너비를 멋지게 정렬하는 명시 적 설정을 시도했습니다 . 그러나 두 개의 상자 안의 텍스트를 보면 선택 상자의 텍스트가 더 채워져 있음을 알 수 있습니다. input { padding-left: 5px; }수정할 첫 번째 스타일 이후 에 다른 특정 스타일 을 추가해야합니다 . 어떤 아이디어? 이 기본 테스트 코드를 만들기 전에 구축 한 사이트에서 CSS 재설정을 사용했지만 문제는 여전히 존재합니다. CSS 재설정은이 특정 텍스트 / 선택 상자 너비 문제를 분명히 해결하지 못했습니다.
zuallauz 2012

1
input {text-indent: 5px;}PS를 사용해보십시오 . <select>태그는 매우 견고하고 운영 체제마다 다릅니다. 많은 CSS를 무시합니다.
Chris Cannon

예, 추가 스타일을 추가하면 텍스트 들여 쓰기가 작동하지만 브라우저는 하나뿐입니다. 그런 다음 Chrome에서 다른 양으로 들여 쓰기되어 2-3 픽셀 더 많이 추가됩니다! 선택 및 텍스트에 대한 들여 쓰기를 어떻게 든 재설정해야할까요?
zuallauz 2012

3

이렇게하면 가까이 다가 갈 수 있지만 그 정도의 정밀도는 거의 불가능합니다.

<div style="width: 200px"><input type="text" style="width: 100%; margin: 0; padding: 0" /></div>
<div style="width: 200px">
    <select id="Select1" style="width: 100%; margin: 0; padding: 0">
        <option>1</option>
    </select>
</div>

3

기본적으로 브라우저마다 다른 스타일이 적용됩니다. 여백과 패딩을 모두 0으로 재설정하면 Firefox와 Chrome에서 두 요소의 너비가 동일 해집니다.

<html>
    <head>
        <title>Test</title>
        <style type="text/css">
            input, select {
                margin: 0;
                padding: 0;
                width: 200px;
            }
        </style>
    </head>
    <body>
        <input type="text" value="ABC"><br />
        <select>
            <option>123</option>
        </select>
    </body>
</html>

개인적 으로 여러 브라우저에서 디자인을 멋지게 보이게하기 전에 YUI CSS Reset 과 같은 최소 CSS 재설정 스타일 시트를 사용하고 싶습니다 .


2
IE에서 선택은 여전히 ​​길이가 몇 픽셀 더 짧습니다. 그래서 완벽한 해결책은 없지만 우리는 꽤 가까이 다가 갈 수 있습니다. =)
saluce

1
아, IE. 거의 독특함을 즐기는 것 같습니다. 테스트 할 IE 버전이 없지만 9 또는 10과 같은 이후 버전에서도 다른가요?
Thomas Upton 2012

1
IE9로 테스트했는데 여전히 너비가 2px 차이가 있습니다.
saluce 2011

두 상자 안의 텍스트를 보면 선택 상자의 텍스트가 더 채워져 있음을 알 수 있습니다. 특정 input { padding-left: 5px; }. 그게 올바른 방법입니까? 이 기본 테스트 코드를 만들기 전에 구축 한 사이트에서 CSS 재설정을 사용했지만 문제는 여전히 존재합니다. CSS 재설정은이 특정 텍스트 / 선택 상자 너비 문제를 해결하지 못했습니다.
zuallauz 2012

1
입력에 왼쪽 패딩을 제공하는 것은 요구 사항 인 경우이 두 요소의 텍스트를 정렬하는 방법입니다. 이러한 요소는 운영 체제에 따라 다르게 보입니다. 텍스트 inputselect요소 를 정렬하려는 시도가 모든 것을 고려하여 할 가치가있는 일인지 잘 모르겠습니다 . 이러한 요소의 바깥 쪽 가장자리를 정렬하는 것은 미학적으로 꽤 좋아 보입니다.
Thomas Upton

2

문제의 선택 및 입력 태그 모두에 클래스를 추가합니다.

<input class='custom-input'/>
<select class='custom-input'></select>

그런 다음 디자인에 맞게 아래 CSS를 수정하십시오.

.custom-input {
        width:140px;
        border:1px solid #ccc;
        margin:1px;
        padding:3px;
        box-sizing: border-box;
        -moz-box-sizing: border-box;
        -webkit-box-sizing: border-box;
        -ms-box-sizing:content-box;
        -moz-box-sizing:content-box;
        -webkit-box-sizing:content-box;
        box-sizing:content-box;
    }

obvs 이것은 브라우저 지원을위한 수정입니다.


0

표 4 입력을 사용하는 경우 u는 다음 솔루션을 사용할 수 있습니다-또한 ie7과 호환됩니다.

<tr style="width:1px;"><td style="width:inherit;position:relative;">
    <select style="width:100%;"> 
    </select> 
</td></tr>
<tr><td>
    <input type="text" style="width:150px;"/>
</td></tr>

이렇게하면 테이블 셀 너비가 입력 너비에 고정됩니다.

따라서 선택은 항상 나머지 너비를 취하고 d 입력과 완벽하게 정렬됩니다.


그것은 많은 추가 HTML입니다. 이것은 CSS 솔루션의 CSS 문제입니다.
GlennG 2013 년


0

예, 매우 실망 스럽습니다. 그러나 HTML 페이지 상단에 "<! DOCTYPE html>"태그를 삽입하기 전까지는 문제가 없었습니다. 내 웹 페이지는 문서 상단에 태그를 추가 할 때까지 테스트 할 수있는 모든 플랫폼에서 제대로 렌더링되었습니다.

이것이 "정품 사양"이지만 이러한 정렬 문제의 원인 인 것 같습니다. FWIW, 저는 HTML5를 지정하는 태그없이 HTML5 요소, 인라인 CSS 등을 모두 사용하고 있습니다. YMMV.

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