Mencocokkan kotak input kosong menggunakan CSS

141

Bagaimana cara menerapkan gaya ke kotak input kosong? Jika pengguna mengetikkan sesuatu di bidang input, gaya seharusnya tidak lagi diterapkan. Apakah ini dimungkinkan dalam CSS? Saya mencoba ini:

input[value=""]
Sjoerd
sumber

Jawaban:

159

Kalau saja bidangnya requiredbisa Anda ikutiinput: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>

Lihat langsung di jsFiddle

ATAU meniadakan penggunaan #foo-thing:invalid(kredit ke @SamGoody)

lukmdo
sumber
14
..atau meniadakan dengan menggunakan: invalid {} developer.mozilla.org/en-US/docs/Web/CSS/…
SamGoody
6
Saya menginginkan hal yang sama, tetapi bidang saya tidak diperlukan. adakah cara untuk melakukannya?
Zahidul Islam Ruhel
1
Itu brilian :)
kriskodzi
@ ZahidulIslamRuhel tentu saja, jawaban ini seharusnya tidak menjadi yang teratas. lihat jawaban di bawah ini stackoverflow.com/a/35593489/11293716
sijanec
150

Di browser modern, Anda dapat menggunakan :placeholder-shownuntuk menargetkan input kosong (jangan dikacaukan dengan ::placeholder).

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

Info lebih lanjut dan dukungan browser: https://css-tricks.com/almanac/selectors/p/placeholder-shown/

Berend
sumber
4
Itu hebat! Sangat membantu :)
buka
1
@TricksfortheWeb Tampaknya membutuhkan atribut placeholder (dengan nilai) untuk hadir di tag input. Diuji di Chrome - tidak yakin apakah ini diperhitungkan untuk semua browser.
Berend
9
Atribut Placeholder harus ditetapkan. Pokoknya kita bisa mengatur atribut placeholder sebagai spasi.
Barcelonczyk
2
@Amanpreet Menurut caniuse.com/#search=placeholder , ini tidak akan bekerja di IE 11 baik (atau Ujung).
Tim Malone
4
Tidak didukung di Microsoft browser sama sekali: caniuse.com/#feat=css-placeholder-shown
Lounge9
44

Tidak ada pemilih dalam CSS yang melakukan ini. Selektor atribut cocok dengan nilai atribut, bukan nilai yang dihitung.

Anda harus menggunakan JavaScript.

Quentin
sumber
3
Bagi siapa pun yang menemukan jawaban ini nanti: Quentin benar mengenai nilai yang dihitung, namun ada: pemilih kosong yang dapat digunakan di sini dan memiliki dukungan yang masuk akal (semua browser kecuali IE8 dan yang lebih lama menurut: w3schools.com/cssref/sel_empty.asp
Cohen
35
:emptypemilih hanya bekerja pada elemen kosong, artinya hanya pada elemen yang memiliki tag pembuka dan penutup yang kosong di antara, dan elemen tag tunggal yang dianggap selalu kosong, misalnya , sehingga tidak dapat digunakan pada elemen input kecualitextarea
am05mhz
7
Tidak benar. Lihat jawaban luko di bawah ini. Menggabungkan sttribute yang diperlukan dan: pemilih semu yang tidak valid: hanya mencapai ini.
voidstate
2
Ini adalah jawaban yang benar pada saat pertanyaan itu diajukan. Atribut yang diperlukan hanya tersedia di Chrome dan Firefox pada 2011, dan jawaban ini dari 2010. Namun kali telah berubah dan ini bukan lagi jawaban "terbaik", jadi saya telah menandainya sebagai diterima.
Sjoerd
18

Memperbarui nilai suatu bidang tidak memperbarui atribut nilainya di DOM sehingga itu sebabnya pemilih Anda selalu mencocokkan bidang, bahkan ketika itu sebenarnya tidak kosong.

Alih-alih menggunakan invalidpseudo-class untuk mencapai apa yang Anda inginkan, seperti:

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

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

Kasar
sumber
15

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

bekerja dengan:

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

Tetapi gaya tidak akan berubah segera setelah seseorang mulai mengetik (Anda perlu JS untuk itu).

Draco Ater
sumber
1
Tidak dapat diandalkan karena atribut nilai tidak berubah di DOM setelah edit bidang. Namun, trik yang bagus jika Anda tidak peduli dengan ini - dan berfungsi di Safari, Chrome, FF, dan IE terbaru ...
Dunc
9
Untuk mencocokkan yang pertama, Anda dapat menggunakan input[value=""], input:not([value]).
Skisma
10

Jika mendukung browser lawas tidak diperlukan, Anda bisa menggunakan kombinasi required, validdan invalid.

Hal yang baik tentang penggunaan ini adalah validdan invalidelemen pseudo bekerja dengan baik dengan atribut tipe dari bidang input. Sebagai contoh:

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="[email protected]" required />
<input type="url" name="website" placeholder="http://johndoe.com"/>
<input type="text" name="name" placeholder="John Doe" required/>

Untuk referensi, JSFiddle di sini: http://jsfiddle.net/0sf6m46j/

Stack Overfloweth saya
sumber
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');
    }
});

di jQuery. Saya menambahkan kelas dan ditata dengan css.

.empty { background:none; }
Israel Morales
sumber
6

Ini bekerja untuk saya:

Untuk HTML, tambahkan requiredatribut ke elemen input

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

Untuk CSS, gunakan :invalidpemilih untuk menargetkan input kosong

input.my-input-element:invalid {

}

Catatan:

  • Tentang requireddari w3Schools.com : "Saat ini, ini menentukan bahwa bidang input harus diisi sebelum mengirimkan formulir."
Ariella
sumber
2

Pertanyaan ini mungkin telah ditanyakan beberapa waktu yang lalu, tetapi karena saya baru-baru ini mendarat di topik ini mencari validasi formulir sisi klien, dan karena :placeholder-shown dukungannya semakin baik, saya pikir yang berikut ini mungkin membantu orang lain.

Menggunakan ide Berend tentang menggunakan pseudo-class CSS4 ini, saya dapat membuat validasi formulir yang dipicu setelah pengguna selesai mengisinya.

Berikut adalah ademo dan penjelasan tentang CodePen: https://codepen.io/johanmouchet/pen/PKNxKQ

Johan M.
sumber
1

Jika Anda senang tidak mendukung IE atau pra-Chromium Edge (yang mungkin baik jika Anda menggunakan ini untuk peningkatan progresif), Anda dapat menggunakan :placeholder-shownseperti yang dikatakan Berend. Perhatikan bahwa untuk Chrome dan Safari Anda benar-benar membutuhkan tempat penampung yang tidak kosong agar ini berfungsi, meskipun sebuah ruang berfungsi.

*,
 ::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>

Sora2455
sumber
1

Ini berhasil bagi saya untuk menambahkan nama kelas ke input dan kemudian menerapkan aturan CSS untuk itu:

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

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

Saya heran dengan jawaban yang kami miliki atribut yang jelas untuk mendapatkan kotak input kosong, lihat kode ini

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

MEMPERBARUI

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

Terlebih lagi karena memiliki tampilan yang bagus dalam validasi

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

    &[aria-invalid="false"], &.valid {
        border-color: green !important;
    }
}
Nasser Hadjloo
sumber
7
:emptyhanya berlaku untuk elemen yang tidak memiliki anak. Input tidak dapat memiliki simpul anak sama sekali sehingga input Anda akan selalu dengan batas merah. Lihat juga komentar ini
Zhegan
2
@NasserHadjloo sudahkah Anda menguji ini? Mengubah valuetidak mengubah jumlah node anak.
jcuenod
@ jcuenod apa yang Anda maksud dengan jumlah node anak? Saya tidak mengerti maksud Anda
Nasser Hadjloo
Dalam struktur xml, node bersarang (yaitu <parent><child></child></parent>). Anda baru saja <input></input>dan saat Anda mengetik apa yang berubah bukanlah <value>simpul di dalamnya <input>tetapi atribut nilai :<input value='stuff you type'></input>
jcuenod
2
Tapi bukan itu yang ingin dicapai OP.
jcuenod
0

Saya menyadari ini adalah utas yang sangat lama, tetapi banyak hal telah berubah sejak itu dan itu memang membantu saya menemukan kombinasi yang tepat dari hal-hal yang saya butuhkan untuk menyelesaikan masalah saya. Jadi saya pikir saya akan membagikan apa yang saya lakukan.

Masalahnya adalah saya nedded untuk memiliki css yang sama diterapkan untuk input opsional jika diisi, seperti yang saya miliki untuk diisi diperlukan. Css menggunakan kelas psuedo: valid yang menerapkan css pada input opsional juga saat tidak diisi.

Beginilah cara saya memperbaikinya;

HTML

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

CSS

input:required:valid {
    ....
}
input:optional::not(:placeholder-shown){
    ....
}
jessica
sumber