Làm cách nào tôi có thể tạo chiều rộng 100% cho TextArea mà không bị tràn khi phần đệm có trong CSS?


426

Tôi có đoạn mã CSS và HTML sau đây được hiển thị.

textarea
{
  border:1px solid #999999;
  width:100%;
  margin:5px 0;
  padding:3px;
}
<div style="display: block;" id="rulesformitem" class="formitem">
  <label for="rules" id="ruleslabel">Rules:</label>
  <textarea cols="2" rows="10" id="rules"/>
</div>

Có phải vấn đề là khu vực văn bản kết thúc rộng hơn 8px (2px cho viền + 6px cho phần đệm) so với phần gốc. Có cách nào để tiếp tục sử dụng đường viền và phần đệm nhưng hạn chế tổng kích thước của textareachiều rộng của cha mẹ không?


Btw có một bài viết hay cho điều này của Jeffrey Way trên tutsplus tại đây: net.tutsplus.com/tutorials/html-css-t kỹ thuật / Có lẽ nó sẽ giúp được ai đó;)
Ai đó

Câu trả lời:


664

Tại sao không quên các bản hack và chỉ làm điều đó với CSS?

Một cái tôi sử dụng thường xuyên:

.boxsizingBorder {
    -webkit-box-sizing: border-box;
       -moz-box-sizing: border-box;
            box-sizing: border-box;
}

Xem hỗ trợ trình duyệt tại đây .


22
Tôi không thể tin rằng điều này đã làm việc. Nhưng nó đã làm. CSS không bao giờ dễ dàng như vậy. :-)
Chim Nate

1
Điều này đã trở thành một trong những điều tuyệt vời nhất mà tôi đã tìm thấy trong một thời gian. Cảm ơn bạn, có cơ hội nào để làm điều này trong IE7 không?
Jeremy A. West

47
Lưu ý rằng bạn vẫn sẽ muốn sử dụng chiều rộng: 100% kết hợp với hộp viền.
Tyler

3
Các phiên bản cũ của Internet Explorer không chỉ sử dụng hành vi hộp viền?
Peter Hedberg

3
ai đó có thể giải thích điều này xin vui lòng, lớp học này đi đâu? một div xung quanh textarea?
koolaang

81

Câu trả lời cho nhiều vấn đề định dạng CSS dường như là "thêm một <div>!"

Vì vậy, theo tinh thần đó, bạn đã thử thêm một div trình bao bọc mà đường viền / phần đệm được áp dụng và sau đó đặt textarea 100% chiều rộng bên trong đó chưa? Một cái gì đó như (chưa được kiểm tra):

textarea
{
  width:100%;
}
.textwrapper
{
  border:1px solid #999999;
  margin:5px 0;
  padding:3px;
}
<div style="display: block;" id="rulesformitem" class="formitem">
  <label for="rules" id="ruleslabel">Rules:</label>
  <div class="textwrapper"><textarea cols="2" rows="10" id="rules"/></div>
</div>


1
Tôi cuối cùng đã chuyển đi từ việc sử dụng% chiều rộng. Tôi tin rằng cách tiếp cận của bạn sẽ làm việc tốt như vậy mặc dù. Cảm ơn!
Eric Schoonover

5
Đừng quên thêm "." đến lớp textwrapper.
Chris Porter

3
@Chris: Cảm ơn và đã sửa. Tôi hơi ngạc nhiên khi phải mất gần một năm rưỡi để ai đó bắt được điều đó ...
Dave Sherohman

2
Thanh cuộn của textarea sẽ trông như thế nào trong trường hợp này?
Daniel LeCheminant

1
Trong chrome, khi bạn tập trung phần tử textarea, nó sẽ tự động được chiếu sáng và nếu bạn tạo phần đệm cho trình bao div, phần đệm này sẽ hiển thị và hai đường viền sẽ hiển thị vì điều đó. Một từ hightlighting và một từ viền .textwrapper: 1px solid # 999999;
Ai đó

22

hãy xem xét kết quả đầu ra cuối cùng được đưa ra cho người dùng về những gì chúng ta muốn đạt được: một vùng văn bản có đệm với cả đường viền và phần đệm, đặc điểm là khi được nhấp, chúng sẽ chuyển trọng tâm đến vùng văn bản của chúng ta và lợi thế của chiều rộng 100% tự động điển hình của các yếu tố khối.

Theo tôi, cách tiếp cận tốt nhất là sử dụng các giải pháp cấp thấp nhất có thể, để đạt được sự hỗ trợ tối đa của trình duyệt. Trong trường hợp này, HTML duy nhất có thể hoạt động tốt, tránh sử dụng Javascript (dù sao đi nữa chúng ta đều yêu thích).

Thẻ LABEL có trong trợ giúp của chúng tôi vì có hành vi như vậy và được phép chứa các yếu tố đầu vào mà nó phải xử lý. Kiểu mặc định của nó là một trong các thành phần nội tuyến, do đó, tạo cho nhãn một kiểu hiển thị khối, chúng ta có thể tự sử dụng chiều rộng 100% tự động bao gồm phần đệm và viền, trong khi văn bản bên trong không có viền, không có phần đệm và chiều rộng 100% .

Nhìn vào các đặc điểm cụ thể của W3C, chúng tôi có thể nhận thấy là:

  • không cần thuộc tính "for": khi thẻ LABEL chứa đầu vào đích, nó sẽ tự động tập trung vào đầu vào con khi được nhấp;
  • nếu một nhãn bên ngoài cho vùng văn bản đã được thiết kế, sẽ không có xung đột xảy ra, vì một đầu vào nhất định có thể có một hoặc nhiều nhãn.

Xem chi tiết cụ thể của W3C để biết thêm thông tin chi tiết.

Ví dụ đơn giản:

.container { 
  width: 400px; 
  border: 3px 
  solid #f7c; 
  }
.textareaContainer {
	display: block;
	border: 3px solid #38c;
	padding: 10px;
  }
textarea { 
  width: 100%; 
  margin: 0; 
  padding: 0; 
  border-width: 0; 
  }
<body>
<div class="container">
	I am the container
	<label class="textareaContainer">
		<textarea name="text">I am the padded textarea with a styled border...</textarea>
	</label>
</div>
</body>

Phần đệm và đường viền của các phần tử .textareaContainer là phần tử chúng tôi muốn cung cấp cho textarea. Hãy thử chỉnh sửa chúng để tạo kiểu theo ý muốn. Tôi đã đưa phần đệm lớn và có thể nhìn thấy và viền cho phần tử .textareaContainer để cho bạn thấy hành vi của chúng khi nhấp vào.


Không chắc những gì trình duyệt chéo gotchas ẩn nấp ở đây, nhưng tôi thích cách tiếp cận này. +1
HRJ

15

Nếu bạn không quá bận tâm về chiều rộng của phần đệm, giải pháp này thực sự sẽ giữ phần đệm theo tỷ lệ phần trăm ..

textarea
{
    border:1px solid #999999;
    width:98%;
    margin:5px 0;
    padding:1%;
}

Không hoàn hảo, nhưng bạn sẽ nhận được một số phần đệm và chiều rộng tăng thêm 100% vì vậy tất cả đều tốt


12

Tôi đã tìm thấy một giải pháp khác ở đây rất đơn giản: thêm phần đệm - ngay vào hộp chứa của textarea. Điều này giữ cho lề, đường viền và phần đệm trên vùng văn bản, điều này tránh được vấn đề mà Beck đã chỉ ra về điểm nhấn trọng tâm mà chrome và safari đặt xung quanh vùng văn bản.

Bên phải của bộ đệm phải là tổng của lề, đường viền và phần đệm hiệu quả ở cả hai bên của vùng văn bản, cộng với bất kỳ phần đệm nào bạn có thể muốn cho vùng chứa. Vì vậy, đối với trường hợp trong câu hỏi ban đầu:

textarea{
    border:1px solid #999999;
    width:100%;
    margin:5px 0;
    padding:3px;
}
.textareacontainer{
    padding-right: 8px; /* 1 + 3 + 3 + 1 */
}

<div class="textareacontainer">
    <textarea></textarea>
</div>

1
+1 Điều này sẽ hoạt động trong nhiều trình duyệt hơn các câu lệnh CSS3. Một sự thật đáng tiếc là thế giới vẫn cần divs bao bọc.
BenSwayne

Tôi thực sự thích câu trả lời này. Nó làm cho textarea snap phù hợp mà không có bất kỳ số phần trăm ma thuật nào dưới 100%. Bạn có thể sử dụng phần đệm ở tất cả các mặt trong trình bao bọc để buộc vùng văn bản di chuyển vào và vẫn ở bên trong cha mẹ. Chiều cao và chiều cao tối thiểu cũng cần phải là 100% trên trình bao bọc. Textarea sau đó có thể được đặt thành 100% với cùng một phần đệm để làm cho mọi thứ hoàn toàn phù hợp.
justdan23

9

Mã này hoạt động với tôi với IE8 và Firefox

<td>
    <textarea style="width:100%" rows=3 name="abc">Modify width:% accordingly</textarea>
</td>

Làm việc trong Chrome cũng vậy.
Sanjeev

5

Bạn có thể sử dụng thuộc tính kích thước hộp, nó được hỗ trợ bởi tất cả các trình duyệt tuân thủ tiêu chuẩn chính và IE8 +. Bạn vẫn sẽ cần một cách giải quyết cho IE7. Đọc thêm ở đây .


@DavidJohnstone: Và vì bạn không phát triển trang web cho IE7 trở lên nữa, đây là giải pháp :)
Jonatan Littke

2

Không, bạn không thể làm điều đó với CSS. Đó là lý do ban đầu Microsoft giới thiệu một mô hình hộp khác và có thể thực tế hơn . Mô hình hộp cuối cùng đã giành chiến thắng, làm cho nó không thực tế để trộn tỷ lệ phần trăm và đơn vị.

Tôi không nghĩ bạn đồng ý với việc thể hiện phần đệm và độ rộng đường viền theo tỷ lệ phần trăm của phụ huynh.


2

Tôi đang tìm kiếm một giải pháp tạo kiểu nội tuyến thay vì giải pháp CSS và đây là giải pháp tốt nhất tôi có thể tìm kiếm cho một textarea đáp ứng:

<div style="width: 100%; max-width: 500px;">
  <textarea style="width: 100%;"></textarea>
</div>

1

Nếu bạn đệm và bù nó như thế này:

textarea
{
    border:1px solid #999999;
    width:100%;
    padding: 7px 0 7px 7px; 
    position:relative; left:-8px; /* 1px border, too */
}

phía bên phải của textarea hoàn toàn thẳng hàng với bên phải của container văn bản bên trong textarea thẳng hàng hoàn hảo với văn bản cơ thể trong container ... và bên trái của textarea 'nhô ra' một chút. đôi khi nó đẹp hơn



1

Đối với những người sử dụng Bootstrap, textarea.form-control cũng có thể dẫn đến các vấn đề về kích thước của textarea. Chrome và Firefox dường như sử dụng các độ cao khác nhau với CSS Bootstrap sau:

textarea.form-conrtol{
    height:auto;
}

1

Tôi thường khắc phục vấn đề đó với calc(). Bạn chỉ cần cung cấp cho textarea chiều rộng 100% và một số lượng đệm nhất định, nhưng bạn phải trừ tổng số phần đệm bên trái và bên phải của chiều rộng 100% mà bạn đã cung cấp cho textarea:

textarea {
    border: 0px;
    width: calc(100% -10px);
    padding: 5px; 
}

Hoặc nếu bạn muốn cung cấp cho vùng văn bản một đường viền:

textarea {
    border: 1px;
    width: calc(100% -12px); /* plus the total left and right border */
    padding: 5px; 
}

0

Làm thế nào về lợi nhuận âm?

textarea {
    border:1px solid #999999;
    width:100%;
    margin:5px -4px; /* 4px = border+padding on one side */
    padding:3px;
}

0

* {
    box-sizing: border-box;
}

.container {
    border-radius: 5px;
    background-color: #f2f2f2;
    padding: 20px;
}

/* Clear floats after the columns */
.row:after {
    content: "";
    display: table;
    clear: both;
}

input[type=text], select, textarea{
    width: 100%;
    padding: 12px;
    border: 1px solid #ccc;
    border-radius: 4px;
    box-sizing: border-box;
    resize: vertical;
}
<div class="container">
  <div class="row">
    <label for="name">Name</label>
    <input type="text" id="name" name="name" placeholder="Your name..">
  </div>
  <div class="row">
    <label for="country">Country</label>
    <select id="country" name="country">
      <option value="australia">UK</option>
      <option value="canada">USA</option>
      <option value="usa">RU</option>
    </select>
  </div>    
  <div class="row">
    <label for="subject">Subject</label>
    <textarea id="subject" name="subject" placeholder="Write something.." style="height:200px"></textarea>
  </div>
</div>

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.