Căn chỉnh văn bản và chọn các hộp có cùng chiều rộng trong CSS?


81

Ok điều này dường như là không thể để có được đúng. Tôi có một hộp văn bản và một hộp chọn. Tôi muốn chúng có cùng chiều rộng chính xác để chúng xếp hàng ở lề trái và lề phải.

<!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>

Điều đó sẽ làm được bạn nghĩ, phải không? Không. Hộp chọn ngắn hơn 6px trong Firefox. Xem ảnh chụp màn hình.ảnh chụp màn hình trong firefox

Được rồi, hãy chỉnh sửa mã và tạo hai kiểu.

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

Được rồi!

Đã sửa trong Firefox

Chờ đã, kiểm tra tốt hơn trong Chrome ...

ảnh chụp màn hình chrome

FFFFFFFUUUUUUUUUUUU

Ai đó có thể cho tôi biết cách sắp xếp những thứ này trong tất cả các trình duyệt không? Tại sao tôi không thể chỉ làm width: 200px trên tất cả, tại sao tất cả các trình duyệt hiển thị nó khác nhau? Ngoài ra, trong khi chúng ta đang ở đó tại sao hộp văn bản và hộp chọn lại có chiều cao khác nhau? Làm thế nào để chúng ta có được chúng cùng chiều cao? Đã thử chiều cao và chiều cao dòng đều không có kết quả.


Giải pháp:

Ok, tôi đã tìm thấy giải pháp với một số trợ giúp từ các câu trả lời bên dưới. Điều quan trọng là sử dụng thuộc tính box-sizing: border-box để khi bạn chỉ định chiều rộng bao gồm đường viền và phần đệm. Xem giải thích xuất sắc ở đây . Sau đó, trình duyệt không thể tải nó lên.

Mã bên dưới, cũng đã đặt chiều cao của các hộp bằng cùng kích thước và thụt lề văn bản bên trong hộp để nó thẳng hàng. Bạn cũng cần đặt đường viền vì Chrome có một đường viền trông thực sự kỳ lạ mà nó sử dụng cho các hộp chọn lọc sẽ làm mất sự liên kết. Điều này sẽ hoạt động cho các trang web HTML5 (ví dụ: hỗ trợ IE9, Firefox, Chrome, Safari, Opera, v.v.).

<!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>

Chỉ một cảnh báo cuối cùng là bạn có thể không muốn các nút nhập, hộp kiểm, v.v. được đưa vào kiểu này, vì vậy hãy sử dụng input:not([type='button'])để không áp dụng nó cho một số kiểu nhất định hoặc sử dụng input[type='text'], input[type='password']để chỉ định những kiểu bạn muốn áp dụng.


3
Nếu bạn phải có mức độ chính xác này, bạn sẽ không hạnh phúc với tư cách là một nhà thiết kế web.
Scott Saunders

2
Vâng, CSS khiến tôi phát điên hàng ngày @Scott. :)
zuallauz

2
Lưu ý, kích thước hộp không được hỗ trợ trong IE7 (khoảng 3% người dùng). Và không bao giờ sử dụng: không phải - nó không được hỗ trợ trong IE8, tức là 20% người dùng :)
Anonymous

Box-sizing làm việc trên IE8! Tất cả những năm qua tôi đã bổ sung thêm độ rộng cụ thể để <select> tạo kiểu tóc ...
GlennG

box-sizing hoạt động
Pierre

Câu trả lời:


7

Điều này là do <input type="text" />phần tử có kiểu mặc định hơi khác so với <select>phần tử, ví dụ như giá trị đường viền, đệm và lề có thể khác nhau.

Bạn có thể quan sát các kiểu mặc định này thông qua trình kiểm tra phần tử như Firebug dành cho Firefox hoặc trình kiểm tra tích hợp dành cho Chrome. Hơn nữa, các bảng định kiểu mặc định này khác nhau giữa các trình duyệt.

Bạn có hai lựa chọn:

  1. Đặt giá trị đường viền, phần đệm và lề một cách rõ ràng cho cả hai phần tử
  2. Một biểu định kiểu đặt lại CSS sẽ được đưa vào trước biểu định kiểu CSS của riêng bạn

Tôi sẽ đi với tùy chọn 1. bởi vì tùy chọn 2. đòi hỏi rất nhiều công việc và bạn sẽ kết thúc với hàng tấn CSS không cần thiết. Nhưng một số nhà phát triển web thích bắt đầu từ đầu và có toàn quyền kiểm soát.


2
CSS được thiết lập lại là một ý tưởng không tồi trong trường hợp như thế này.
Remy

1
Các thiết lập lại CSS nhẹ vẫn tồn tại, nhưng tất nhiên có thể có các tác dụng phụ không mong muốn. Nếu bạn bắt đầu thiết kế với biểu định kiểu đặt lại CSS, tùy chọn đó sẽ trở nên hấp dẫn hơn rất nhiều.
Thomas Upton

Tôi đã thử thiết lập rõ ràng padding:0; margin:0; border:1px solid #000;để có được chiều rộng của các hộp văn bản / hộp chọn được sắp xếp đẹp mắt. Tuy nhiên, nếu bạn nhìn vào văn bản bên trong hai hộp, bạn sẽ nhận thấy rằng văn bản trong hộp chọn được thêm vào. Hầu như cần phải thêm một input { padding-left: 5px; }phong cách cụ thể khác sau cái đầu tiên để sửa chữa. Có ý kiến ​​gì không? Tôi đã sử dụng thiết lập lại CSS trong trang web mà tôi đang xây dựng trước khi tạo mã thử nghiệm cơ bản này nhưng sự cố vẫn xuất hiện ở đó. Thiết lập lại CSS rõ ràng không khắc phục được vấn đề về chiều rộng hộp chọn / văn bản cụ thể này.
zuallauz

1
Hãy thử input {text-indent: 5px;}PS, <select>thẻ rất cứng nhắc và hệ điều hành cụ thể - nó sẽ bỏ qua rất nhiều CSS.
Chris Cannon

Vâng, thụt lề văn bản hoạt động nếu bạn thêm kiểu bổ sung đó ... nhưng chỉ cho một trình duyệt. Sau đó, nó được thụt vào một lượng khác trong Chrome để giảm thêm 2-3 pixel! Có lẽ cần phải đặt lại thụt lề cho vùng chọn và văn bản bằng cách nào đó?
zuallauz

3

Điều này sẽ giúp bạn đến gần, nhưng mức độ chính xác gần như không thể.

<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

Các trình duyệt khác nhau áp dụng các kiểu khác nhau theo mặc định. Tôi nhận thấy rằng việc đặt lại cả lề và đệm thành 0 làm cho cả hai phần tử có chiều rộng bằng nhau trong cả Firefox và 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>

Cá nhân tôi thích sử dụng một biểu định kiểu đặt lại CSS tối thiểu như YUI CSS Reset trước khi cố gắng làm cho một thiết kế trông tuyệt vời trên nhiều trình duyệt.


2
Trong IE, vùng chọn vẫn có độ dài ngắn hơn một vài pixel. Vì vậy, trong khi không có giải pháp hoàn hảo, chúng ta có thể đến khá gần =)
chào

1
À, IE. Có vẻ như nó thích được độc nhất. Tôi không có bất kỳ phiên bản IE nào để thử nghiệm, nhưng nó có khác ngay cả trong các phiên bản sau này, như 9 hoặc 10 không?
Thomas Upton

1
Tôi đã thử nghiệm với IE9 và nó vẫn có sự chênh lệch 2px về chiều rộng.
hạ cánh

Nếu bạn nhìn vào văn bản bên trong hai hộp, bạn sẽ nhận thấy rằng văn bản trong hộp chọn được thêm vào. Hầu như cần phải thêm một cụ thể input { padding-left: 5px; }. Đó có phải là cách làm đúng? Tôi đã sử dụng thiết lập lại CSS trong trang web mà tôi đang xây dựng trước khi tạo mã thử nghiệm cơ bản này nhưng sự cố vẫn xuất hiện ở đó. Thiết lập lại CSS không khắc phục được sự cố chiều rộng hộp chọn / văn bản cụ thể này.
zuallauz

1
Đặt đệm bên trái cho đầu vào là cách tôi cố gắng sắp xếp văn bản trong hai phần tử này, nếu đó là yêu cầu. Đừng quên rằng các yếu tố này trông khác nhau trong các hệ điều hành khác nhau. Tôi không chắc rằng việc cố gắng sắp xếp văn bản của inputselectcác phần tử là một việc đáng làm, tất cả mọi thứ đều được xem xét. Làm cho các cạnh bên ngoài của các yếu tố này thẳng hàng trông khá đẹp, về mặt thẩm mỹ.
Thomas Upton

2

Thêm một lớp vào cả thẻ chọn và thẻ nhập được đề cập, tức là:

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

sau đó sửa đổi css bên dưới để phù hợp với thiết kế của bạn:

.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 đây là một bản sửa lỗi cho các trình duyệt hỗ trợ


0

Nếu bạn sử dụng bảng 4 đầu vào, bạn có thể sử dụng giải pháp sau - cũng có thể tương thích với 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>

Bằng cách đó, chiều rộng ô bảng sẽ được cố định với chiều rộng của đầu vào,

Và theo cách đó vùng chọn sẽ luôn lấy chiều rộng còn lại và hoàn toàn thẳng hàng với đầu vào d.


Đó là rất nhiều HTML bổ sung. Đây là một vấn đề CSS với một giải pháp CSS.
GlennG

0

Thử xóa các đường viền mặc định khỏi cả hai phần tử:

select, input {
 border:0;
}

0

Vâng, bực bội vô cùng. Tuy nhiên, tôi chưa bao giờ gặp vấn đề với điều đó 'cho đến khi tôi đặt thẻ "<! DOCTYPE html>" ở đầu trang HTML của mình. Trang web của tôi hiển thị đúng trên tất cả các nền tảng mà tôi có thể kiểm tra cho đến khi tôi đặt thẻ đó ở đầu tài liệu của mình.

Mặc dù đó là "thông số kỹ thuật chính hãng", nó có vẻ là nguồn gốc của những vấn đề về căn chỉnh này. FWIW, tôi đang sử dụng các phần tử HTML5, CSS nội dòng, v.v., tất cả đều không có thẻ đó để chỉ định HTML5. YMMV.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.