Kích thước đầu vào so với chiều rộng


231
<input name="txtId" type="text" size="20" />

hoặc là

<input name="txtId" type="text" style="width: 150px;" />

Cái nào là mã trình duyệt chéo tối ưu?

Tất nhiên nó phụ thuộc vào yêu cầu, nhưng tôi tò mò muốn biết mọi người quyết định như thế nào và dựa trên cơ sở nào.


17
Việc sử dụng "px" trên web thường là một ý tưởng tồi. Thay vào đó, bạn có thể cân nhắc sử dụng các đơn vị tương đối ("em", "%", v.v.).
kangax

37
@ Khangax Đó chỉ là một ý kiến; không có sự đồng thuận nào về việc sử dụng px
Kos

7
@Kos Đó là một sự đồng thuận. Không còn nữa (với IE và các trình duyệt cũ khác) qua đời.
kangax

9
@ Khangax Tôi không bao giờ có được bản ghi nhớ đó ... Tôi sử dụng px mọi lúc và luôn luôn có.
Andrew

Câu trả lời:


180

Bạn có thể sử dụng cả hai. Kiểu css sẽ ghi đè sizethuộc tính trong các trình duyệt hỗ trợ CSS và làm cho trường có độ rộng chính xác và đối với những trường hợp không có, nó sẽ trở về số lượng ký tự được chỉ định.

Chỉnh sửa: Tôi nên đã đề cập rằng sizethuộc tính không phải là một phương pháp định cỡ chính xác: theo đặc tả HTML , nó nên tham chiếu số lượng ký tự của phông chữ hiện tại mà đầu vào sẽ có thể hiển thị cùng một lúc.

Tuy nhiên, trừ khi phông chữ được chỉ định là phông chữ có chiều rộng / không gian cố định, điều này không đảm bảo rằng số lượng ký tự được chỉ định sẽ thực sự hiển thị; trong hầu hết các phông chữ, các ký tự khác nhau sẽ có chiều rộng khác nhau. Câu hỏi này có một số câu trả lời tốt liên quan đến vấn đề này.

Đoạn trích dưới đây thể hiện cả hai cách tiếp cận.

@font-face {
    font-family: 'Diplomata';
    font-style: normal;
    font-weight: 400;
    src: local('Diplomata'), local('Diplomata-Regular'), url(https://fonts.gstatic.com/s/diplomata/v8/8UgOK_RUxkBbV-q561I6kFtXRa8TVwTICgirnJhmVJw.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
@font-face {
    font-family: 'Open Sans Condensed';
    font-style: normal;
    font-weight: 300;
    src: local('Open Sans Condensed Light'), local('OpenSansCondensed-Light'), url(https://fonts.gstatic.com/s/opensanscondensed/v11/gk5FxslNkTTHtojXrkp-xBEur64QvLD-0IbiAdTUNXE.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
p {
  margin: 0 0 10px 0;
}
input {
  font-size: 20px;
}
.narrow-font {
  font-family: 'Open Sans Condensed', sans-serif;
}
.wide-font {
  font-family: 'Diplomata', cursive;
}
.set-width {
  width: 220px;
}
<p>
  <input type="text" size="10" class="narrow-font" value="0123456789" />
</p>
<p>
  <input type="text" size="10" class="wide-font" value="0123456789" />
</p>
<p>
  <input type="text" size="10" class="narrow-font set-width" value="0123456789" />
</p>
<p>
  <input type="text" size="10" class="wide-font set-width" value="0123456789" />
</p>


2
@Mark B. Cảm ơn câu trả lời của bạn. Tôi đã sử dụng phong cách nội tuyến để đặt câu hỏi ở đây.
rajakvk

Đừng lo lắng - tôi nghĩ bạn có thể có, nhưng tôi chỉ nêu ra trong trường hợp.
Đánh dấu

Hầu hết các phông chữ không phải là chiều rộng đơn sắc. Về "số lượng ký tự mà trường sẽ có thể hiển thị cùng một lúc" .... Ý bạn là nhân vật nào?
Pacerier

@Pacerier Số lượng ký tự trong bất kỳ phông chữ nào mà đầu vào đang sử dụng: jsbin.com/zimako/1
Mark Bell

1
@jbyrd Vâng, đó là trường hợp của nhưng nhưng câu trả lời là đúng theo đặc tả HTML. Tôi đã chỉnh sửa câu trả lời ngay bây giờ để làm rõ mọi thứ một chút.
Mark Bell

49

Tôi đề nghị, có lẽ cách tốt nhất là đặt độ rộng của kiểu theo đơn vị em :) Vì vậy, đối với kích thước đầu vào là 20 ký tự, hãy đặt style='width:20em':)


4
Điểm thú vị, tuy nhiên trong chiều rộng thử nghiệm của tôi: 20em làm cho đầu vào lớn hơn nhiều 20 ký tự.
Barshe

32
"Em" là thước đo chiều cao của ký tự 'M', đó là lý do tại sao hộp quá lớn.
humbads

9
Trong CSS, em có liên quan đến kích thước phông chữ của cha mẹ trực tiếp hoặc gần nhất của nó. Một ví dụ: nếu kích thước phông chữ được kế thừa của một phần tử là 16px và bạn đặt kích thước phông chữ là 2em, kích thước kết quả sẽ là 32px (16px * 2em). Đơn vị "em" không phải là số lượng ký tự. Thêm: w3.org/TR/css3-values/#font-relative-lengthskyleschaeffer.com/development/css-font-size-em-vs-px-vs-pt-vsj.eremy.net/ -about-rem-and-em
delroh

1
@humbads không có nghĩa là bạn đo chiều rộng của ký tự 'M'?
Jess

5
@Jess, câu hỏi hay. Trong kiểu chữ , 'em' được sử dụng có nghĩa là chiều rộng của ký tự 'M'. Trong một thời gian dài, tôi tin điều tương tự. Tuy nhiên, trong CSS và kiểu chữ kỹ thuật số, 'em' bằng chiều cao của phông chữ theo điểm. Điều này là để chứa các bộ ký tự không có ký tự 'M' hoặc trong đó 'M' không phải là chiều cao hoặc chiều rộng đầy đủ của phông chữ.
humbads

21

size không nhất quán trên các trình duyệt khác nhau và cài đặt phông chữ có thể có của chúng.

Các widthphong cách thiết lập trong px sẽ ít nhất phải nhất quán, modulo vấn đề ô-sizing . Bạn cũng có thể muốn đặt kiểu trong 'em' nếu bạn muốn đặt kích thước của nó tương ứng với phông chữ (mặc dù vậy, điều này sẽ không nhất quán trừ khi bạn đặt fontgia đình và kích thước của đầu vào một cách rõ ràng) hoặc '%' nếu bạn đang tạo hình thức bố trí chất lỏng. Dù bằng cách nào, một bản định kiểu có lẽ thích hợp hơn với stylethuộc tính nội tuyến .

Bạn vẫn cần phải sizecho <select multiple>để có được chiều cao xếp hàng với các tùy chọn đúng. Nhưng tôi không sử dụng nó trên <input>.


13

Tôi muốn nói điều này đi ngược lại với "sự khôn ngoan thông thường", nhưng tôi thường thích sử dụng kích thước. Lý do cho điều này chính xác là lý do mà nhiều người nói không phải: độ rộng của trường sẽ thay đổi tùy theo trình duyệt, tùy thuộc vào kích thước phông chữ. Cụ thể, nó sẽ luôn đủ lớn để hiển thị số lượng ký tự được chỉ định, bất kể cài đặt trình duyệt.

Ví dụ: nếu tôi có trường ngày, tôi thường muốn trường đủ rộng để hiển thị 8 hoặc 10 ký tự (hai chữ số tháng và ngày và hai hoặc bốn chữ số năm, có dấu phân cách). Đặt thuộc tính kích thước về cơ bản đảm bảo với tôi rằng toàn bộ ngày sẽ hiển thị, với không gian lãng phí tối thiểu. Tương tự cho hầu hết các số - Tôi biết phạm vi giá trị dự kiến, vì vậy tôi sẽ đặt thuộc tính kích thước thành số chữ số thích hợp, cộng với dấu thập phân nếu có.

Theo như tôi có thể nói, không có thuộc tính CSS nào làm điều này. Chẳng hạn, đặt chiều rộng cho em dựa trên chiều cao chứ không phải chiều rộng và do đó không chính xác lắm nếu bạn muốn hiển thị một số ký tự đã biết.

Tất nhiên, logic này không phải lúc nào cũng được áp dụng - ví dụ, trường nhập tên có thể chứa bất kỳ số lượng ký tự nào. Trong những trường hợp đó, tôi sẽ quay trở lại các thuộc tính chiều rộng CSS, điển hình là px. Tuy nhiên, tôi sẽ nói rằng phần lớn các trường tôi tạo có một số loại nội dung đã biết và bằng cách chỉ định thuộc tính kích thước, tôi có thể đảm bảo rằng hầu hết nội dung, trong hầu hết các trường hợp, được hiển thị mà không bị cắt.


Bạn cũng có thể sử dụng exđơn vị cho việc này, mặc dù sử dụng kích thước vẫn đơn giản hóa hầu hết các trường hợp bằng cách không có hàng tá id / lớp trong css của bạn cho chiều rộng.
Bốn mươi

@Forty Thật ra, bạn không thể. exchiều cao của một ký tự (cụ thể là "X"), không phải chiều rộng - giống như em. Vì không có mối quan hệ cố định giữa chiều cao và chiều rộng của ký tự (x hoặc cách khác), không có lý do nào để tin rằng việc sử dụng chiều cao của ký tự để đặt chiều rộng của trường sẽ làm cho trường có chiều rộng phù hợp để hiển thị bất kỳ số lượng ký tự cho trước. Nó có thể rộng hơn hoặc hẹp hơn, tùy thuộc vào phông chữ. Bây giờ chđơn vị có vẻ đầy hứa hẹn, nhưng không được hỗ trợ trong IE dưới 9, điều này sẽ là một vấn đề khi tôi viết bài này.
ibrewster

Có, nhưng chiều cao của x thường không bao giờ nhỏ hơn chiều rộng, hầu hết thời gian thực sự cao hơn một chút hoặc gần như nhau, vì vậy nó khá gần nhau. chthật không may là tốt hơn, một số số không mỏng và nó có thể không đo được toàn bộ không gian nhân vật ...
Bốn mươi

@Forty Đúng, do đó củng cố quan điểm ban đầu của tôi rằng không có thuộc tính CSS tốt để đặt độ rộng của trường đầu vào thành một số ký tự cụ thể, trong khi sizethuộc tính cố gắng thực hiện chính xác điều đó. Bạn có thể đúng đó exlà một lựa chọn hợp lý, nhưng thực tế vẫn là thuộc tính chiều cao, không phải thuộc tính chiều rộng. sizelà một thuộc tính chiều rộng, chỉ không css.
ibrewster

Nó đủ gần để sử dụng, chỉ không thực tế cho trường hợp này :)
Bốn mươi

4

Tôi vừa mới chiến đấu với một cái bàn mà tôi không thể làm cho nhỏ hơn bất kể yếu tố nào tôi cố làm cho nhỏ hơn chiều rộng của bàn vẫn giữ nguyên. Tôi đã tìm kiếm bằng cách sử dụng fireorms nhưng không thể tìm thấy phần tử nào đặt chiều rộng quá cao.

Cuối cùng tôi đã thử thay đổi thuộc tính kích thước của các thành phần văn bản đầu vào và nó đã sửa nó. Vì một số lý do, thuộc tính kích thước vượt quá độ rộng css. Tôi đã sử dụng jQuery để tự động thêm các hàng vào một bảng và chính các hàng này chứa các đầu vào. Vì vậy, có lẽ khi nói đến việc thêm động các đầu vào bằng cách sử dụng hàm appendTo (), có lẽ tốt hơn là đặt thuộc tính kích thước cùng với chiều rộng.


1

Bạn sẽ có được sự nhất quán hơn nếu bạn sử dụng chiều rộng (ví dụ thứ hai của bạn).


1

Bạn có thể thay đổi kích thước bằng cách sử dụng kiểu và chiều rộng để thay đổi kích thước hộp văn bản. Đây là mã cho nó.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

</head>
<body>
<div align="center">

    <form method="post">
          <div class="w3-row w3-section">
            <div class="w3-rest" align = "center">
                <input name="lastName" type="text" id="myInput" style="width: 50%">
            </div>
        </div>
    </form>
</div>
</body>
</html>

Sử dụng căn chỉnh để căn giữa hộp văn bản.


1

Cả sizethuộc tính trong HTML và thuộc widthtính trong CSS sẽ đặt chiều rộng của một <input>. Nếu bạn muốn đặt chiều rộng thành thứ gì đó gần với chiều rộng của mỗi ký tự, hãy sử dụng **ch**đơn vị như trong:

input {
    width: 10ch;
}

0

HTML kiểm soát ý nghĩa ngữ nghĩa của các yếu tố. CSS kiểm soát bố cục / phong cách của trang. Sử dụng CSS khi bạn đang kiểm soát bố cục của mình.

Nói tóm lại, không bao giờ sử dụng size = ""


Kích thước có thể được vốn có trong ý nghĩa của các yếu tố; ví dụ, một chữ cái đầu có một ký tự đơn. Tên đầu tiên, OTOH, không có giới hạn kích thước vốn có - trừ khi bạn có tên trong cơ sở dữ liệu của mình.
derobert

4
@derobert: Tôi có thể bị nhầm nhưng thông thường bạn thể hiện rằng sử dụng thuộc tính maxlength cho đầu vào [type = text | password] chứ không phải với thuộc tính size.
Horst Gutmann

2
@Horst: Chà, tôi sẽ thể hiện chữ cái đầu giữa với cả hai (vì giới hạn đó có ý nghĩa với người dùng) và cơ sở dữ liệu giới hạn chỉ một với maxlength.
derobert
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.