Khớp một hộp đầu vào trống bằng CSS


141

Làm cách nào để áp dụng kiểu cho hộp nhập trống? Nếu người dùng nhập một cái gì đó trong trường đầu vào, kiểu sẽ không còn được áp dụng. Điều này có thể có trong CSS không? Tôi đã thử điều này:

input[value=""]

Câu trả lời:


159

Nếu chỉ có lĩnh vực là requiredbạn có thể đi vớiinput:valid

#foo-thing:valid + .msg { visibility: visible!important; }      
 <input type="text" id="foo-thing" required="required">
 <span class="msg" style="visibility: hidden;">Yay not empty</span>

Xem trực tiếp trên jsFiddle

HOẶC phủ nhận bằng cách sử dụng #foo-thing:invalid(tín dụng cho @Samoody)


14
.. hoặc phủ nhận bằng cách sử dụng: không hợp lệ {} developer.mozilla.org/en-US/docs/Web/CSS/
mẹo

6
Tôi muốn điều tương tự, nhưng lĩnh vực của tôi không bắt buộc. Có cách nào để làm như vậy?
Zahidul Hồi giáo Ruhel

1
Thật tuyệt vời :)
kriskodzi 17/07/19

@ZahidulIslamRuhel tất nhiên, câu trả lời này không nên là câu trả lời hàng đầu. xem câu trả lời dưới đây stackoverflow.com/a/35593361/11293716
sijanec

150

Trong các trình duyệt hiện đại, bạn có thể sử dụng :placeholder-shownđể nhắm mục tiêu đầu vào trống (không bị nhầm lẫn với ::placeholder).

input:placeholder-shown {
    border: 1px solid red; /* Red border only if the input is empty */
}

Thêm thông tin và hỗ trợ trình duyệt: https://css-tricks.com/almanac/selector/p/placeholder-shown/


4
Điều đó thật tuyệt! Rất hữu ích :)
vỡ

1
@TricksfortheWeb Dường như yêu cầu một thuộc tính giữ chỗ (có giá trị) phải có trong thẻ đầu vào. Đã thử nghiệm trong Chrome - không chắc chắn nếu điều này được tính cho tất cả các trình duyệt.
Berend

9
Thuộc tính giữ chỗ phải được đặt. Dù sao, chúng ta có thể đặt thuộc tính giữ chỗ là khoảng trắng.
Barcelona

2
@Amanpreet Theo caniuse.com/#search=placeholder , điều này sẽ không hoạt động trong IE 11 (hoặc Edge).
Tim Malone


44

Không có bộ chọn trong CSS nào thực hiện điều này. Bộ chọn thuộc tính khớp với các giá trị thuộc tính, không tính giá trị.

Bạn sẽ phải sử dụng JavaScript.


3
Đối với bất kỳ ai tìm thấy câu trả lời này sau: Quentin đúng về các giá trị được tính toán, tuy nhiên, có: bộ chọn trống có thể được sử dụng ở đây và có hỗ trợ hợp lý (tất cả các trình duyệt trừ IE8 trở lên theo: w3schools.com/cssref/sel_empty.asp
Cohen

35
:emptyselector chỉ làm việc trên các yếu tố rỗng, nghĩa là chỉ trên các yếu tố có mở và thẻ đóng đó là trống rỗng ở giữa, và các yếu tố thẻ duy nhất mà coi luôn trống rỗng, ví dụ , vì vậy nó không thể được sử dụng trên các yếu tố đầu vào, trừtextarea
am05mhz

7
Không đúng. Xem câu trả lời của lukmo dưới đây. Kết hợp sttribution cần thiết và các bộ chọn giả hợp lệ: hợp lệ hoặc: không hợp lệ đạt được điều này.
voidstate

2
Đây là câu trả lời đúng tại thời điểm câu hỏi được hỏi. Thuộc tính bắt buộc chỉ có sẵn trong Chrome và Firefox vào năm 2011 và câu trả lời này là từ năm 2010. Tuy nhiên thời gian đã thay đổi và đây không còn là câu trả lời "tốt nhất", vì vậy tôi đã bỏ đánh dấu nó là chấp nhận.
Sjoerd

18

Cập nhật giá trị của một trường không cập nhật thuộc tính giá trị của nó trong DOM vì vậy đó là lý do tại sao bộ chọn của bạn luôn khớp với một trường, ngay cả khi nó không thực sự trống.

Thay vào đó, hãy sử dụng lớp invalidgiả để đạt được những gì bạn muốn, như vậy:

input:required {
  border: 1px solid green;
}
input:required:invalid {
  border: 1px solid red;
}
<input required type="text" value="">

<input required type="text" value="Value">


15

input[value=""], input:not([value])

làm việc với:

<input type="text" />
<input type="text" value="" />

Nhưng kiểu sẽ không thay đổi ngay khi ai đó bắt đầu nhập (bạn cần JS cho điều đó).


1
Không đáng tin cậy vì thuộc tính giá trị không bị thay đổi trong DOM sau khi chỉnh sửa trường. Tuy nhiên, mẹo hay nếu bạn không quan tâm đến điều này - và hoạt động trong Safari, Chrome, FF và IE mới nhất ...
Dunc

9
Để phù hợp với trước đây, bạn có thể sử dụng input[value=""], input:not([value]).
Schism

10

Nếu hỗ trợ trình duyệt cũ là không cần thiết, bạn có thể sử dụng kết hợp required, validinvalid.

Điểm hay của việc sử dụng này là các phần tử giả validinvalidhoạt động tốt với các thuộc tính loại của các trường đầu vào. Ví dụ:

input:invalid, textarea:invalid { 
    box-shadow: 0 0 5px #d45252;
    border-color: #b03535
}

input:valid, textarea:valid {
    box-shadow: 0 0 5px #5cd053;
    border-color: #28921f;
}
<input type="email" name="email" placeholder="john_doe@example.com" required />
<input type="url" name="website" placeholder="http://johndoe.com"/>
<input type="text" name="name" placeholder="John Doe" required/>

Để tham khảo, JSFiddle tại đây: http://jsfiddle.net/0sf6m46j/


7
$('input#edit-keys-1').blur(function(){
    tmpval = $(this).val();
    if(tmpval == '') {
        $(this).addClass('empty');
        $(this).removeClass('not-empty');
    } else {
        $(this).addClass('not-empty');
        $(this).removeClass('empty');
    }
});

trong jQuery. Tôi đã thêm một lớp và tạo kiểu với css.

.empty { background:none; }

6

Điều này làm việc cho tôi:

Đối với HTML, thêm requiredthuộc tính vào thành phần đầu vào

<input class="my-input-element" type="text" placeholder="" required />

Đối với CSS, sử dụng :invalidbộ chọn để nhắm mục tiêu đầu vào trống

input.my-input-element:invalid {

}

Ghi chú:

  • Giới thiệu requiredtừ w3Schools.com : "Khi có mặt, nó chỉ định rằng một trường đầu vào phải được điền trước khi gửi biểu mẫu."

2

Câu hỏi này có thể đã được hỏi cách đây một thời gian, nhưng gần đây tôi đã tìm đến chủ đề này để tìm kiếm xác nhận mẫu phía khách hàng và vì sự :placeholder-shown hỗ trợ đang trở nên tốt hơn, tôi nghĩ những điều sau đây có thể giúp đỡ người khác.

Sử dụng ý tưởng Berend về việc sử dụng lớp giả CSS4 này, tôi có thể tạo xác thực mẫu chỉ được kích hoạt sau khi người dùng hoàn tất điền nó.

Dưới đây là ademo và giải thích về CodePen: https://codepen.io/johanmouchet/pen/PKNxKQ


1

Nếu bạn không hài lòng khi không hỗ trợ IE hoặc tiền Chromium Edge (có thể sẽ ổn nếu bạn đang sử dụng tính năng này để cải tiến lũy tiến), bạn có thể sử dụng :placeholder-shownnhư Berend đã nói. Lưu ý rằng đối với Chrome và Safari, bạn thực sự cần một trình giữ chỗ không trống để làm việc này, mặc dù một không gian hoạt động.

*,
 ::after,
 ::before {
  box-sizing: border-box;
}

label.floating-label {
  display: block;
  position: relative;
  height: 2.2em;
  margin-bottom: 1em;
}

label.floating-label input {
  font-size: 1em;
  height: 2.2em;
  padding-top: 0.7em;
  line-height: 1.5;
  color: #495057;
  background-color: #fff;
  background-clip: padding-box;
  border: 1px solid #ced4da;
  border-radius: 0.25rem;
  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}

label.floating-label input:focus {
  color: #495057;
  background-color: #fff;
  border-color: #80bdff;
  outline: 0;
  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}

label.floating-label input+span {
  position: absolute;
  top: 0em;
  left: 0;
  display: block;
  width: 100%;
  font-size: 0.66em;
  line-height: 1.5;
  color: #495057;
  border: 1px solid transparent;
  border-radius: 0.25rem;
  transition: font-size 0.1s ease-in-out, top 0.1s ease-in-out;
}

label.floating-label input:placeholder-shown {
  padding-top: 0;
  font-size: 1em;
}

label.floating-label input:placeholder-shown+span {
  top: 0.3em;
  font-size: 1em;
}
<fieldset>
  <legend>
    Floating labels example (no-JS)
  </legend>
  <label class="floating-label">
    <input type="text" placeholder=" ">
    <span>Username</span>
  </label>
  <label class="floating-label">
    <input type="Password" placeholder=" ">
    <span>Password</span>
  </label>
</fieldset>
<p>
  Inspired by Bootstrap's <a href="https://getbootstrap.com/docs/4.0/examples/floating-labels/">floating labels</a>.
</p>


1

Tôi đã thêm một tên lớp vào đầu vào và sau đó áp dụng các quy tắc CSS cho nó:

<input type="text" name="product" class="product" />

<style>
input[value=""].product {
    display: none;
}
</style>

0

Tôi tự hỏi bởi câu trả lời chúng tôi có thuộc tính rõ ràng để có được hộp đầu vào trống, hãy xem mã này

/*empty input*/
input:empty{
    border-color: red;
}
/*input with value*/
input:not(:empty){
    border-color: black;
}

CẬP NHẬT

input, select, textarea {
    border-color: @green;
    &:empty {
        border-color: @red;
    }
}

Hơn nữa để có một cái nhìn tuyệt vời trong xác nhận

 input, select, textarea {
    &[aria-invalid="true"] {
        border-color: amber !important;
    }

    &[aria-invalid="false"], &.valid {
        border-color: green !important;
    }
}

7
:emptychỉ áp dụng cho các yếu tố không có con. Đầu vào không thể có các nút con, vì vậy đầu vào của bạn sẽ luôn có viền đỏ. Cũng xem bình luận này
Zhegan

2
@NasserHadjloo bạn đã thử nghiệm điều này? Thay đổi valuekhông thay đổi số lượng nút con.
jcuenod

@jcuenod Ý bạn là gì về số lượng nút con? Tôi không hiểu ý của bạn
Nasser Hadjloo

Trong cấu trúc xml, các nút được lồng nhau (tức là <parent><child></child></parent>). Bạn chỉ cần có <input></input>và khi bạn nhập những gì thay đổi không phải là một <value>nút bên trong <input>mà là một thuộc tính giá trị :<input value='stuff you type'></input>
jcuenod

2
Nhưng đó không phải là những gì OP đang cố gắng đạt được.
jcuenod

0

Tôi nhận ra đây là một chủ đề rất cũ, nhưng mọi thứ đã thay đổi một chút kể từ đó và nó đã giúp tôi tìm ra sự kết hợp đúng đắn của những thứ tôi cần để khắc phục vấn đề của mình. Vì vậy, tôi nghĩ rằng tôi muốn chia sẻ những gì tôi đã làm.

Vấn đề là tôi đã phải xử lý cùng một css được áp dụng cho một đầu vào tùy chọn nếu nó được điền, như tôi đã có cho một yêu cầu điền. Css đã sử dụng lớp psuedo: hợp lệ, áp dụng css trên đầu vào tùy chọn khi không được điền.

Đây là cách tôi sửa nó;

HTML

<input type="text" required="required">
<input type="text" placeholder="">

CSS

input:required:valid {
    ....
}
input:optional::not(:placeholder-shown){
    ....
}
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.