: değil (: boş) CSS seçici çalışmıyor?


97

Eklediğimde çalışmak istemeyen bu CSS seçici ile çok zaman geçiriyorum :not(:empty). Diğer seçicilerin herhangi bir kombinasyonu ile iyi çalışıyor gibi görünüyor:

input:not(:empty):not(:focus):invalid { border-color: #A22; box-shadow: none }

Parçayı çıkarırsam :not(:empty)gayet iyi çalışıyor. Seçiciyi değiştirsem bile, input:not(:empty)içine metin yazılan giriş alanlarını seçmeyecek. Bu bozuk mu yoksa :emptybir :not()seçici içinde kullanmama izin verilmiyor mu?

Aklıma gelen diğer tek şey, tarayıcıların hala elementin boş olduğunu çünkü alt öğesi olmadığını söylüyorlar, sadece bir "değer". Does :emptyseçici düzenli eleman karşı bir giriş elemanı için ayrı özelliğe sahip değil? Bu olası görünmüyor, çünkü :emptybir alanda kullanmak ve içine bir şey yazmak, alternatif efektlerin kaybolmasına neden olur (çünkü artık boş değildir).

Firefox 8 ve Chrome'da test edilmiştir.


İlgili kodu gönderebilir misiniz?
Virendra

2
Sana bir kısmını alıntı Can API referans :emptyseçicisi : "Diğer bazı elementler, diğer taraftan, tanımı gereği (yani hiçbir çocuk sahibi) boş şunlardır: <input>, <img>, <br>, ve <hr>, örneğin."
David, Monica'nın

@Virendra: İlgili kod bu, ancak ona gerçek CSS kurallarını ekledim. Öğesini kaldırırsam, :not(:empty)odakta olmayan ancak geçersiz bir giriş için kırmızı kenarlık beklendiği gibi çalışır.
animuson

Yanıtlar:


153

Bir olmak boşluk eleman , bir <input>eleman olarak kabul edilir boş tüm boşluk elemanların içerik modeli beri, "boş" HTML tanım gereği daima boş olduğunu . Dolayısıyla :empty, bir değeri olsun ya da olmasın, her zaman sözde sınıfla eşleşeceklerdir . Bu aynı zamanda, değerlerinin başlangıç ​​ve bitiş etiketleri içindeki metin içeriği yerine başlangıç ​​etiketindeki bir öznitelik ile temsil edilmesinin nedenidir.

Ayrıca, Seçiciler spesifikasyonundan :

:emptySözde sınıf hiç çocuk sahibi olmadığı bir öğesini temsil eder. Belge ağacı açısından, yalnızca verileri sıfır olmayan uzunlukta olan öğe düğümleri ve içerik düğümleri (DOM metin düğümleri, CDATA düğümleri ve varlık referansları gibi) boşluğu etkilediği düşünülmelidir;

Sonuç olarak, input:not(:empty)uygun bir HTML belgesindeki hiçbir şeyle asla eşleşmeyecektir. ( <input>Metin veya alt öğeleri kabul edebilen bir öğeyi tanımlayan varsayımsal bir XML belgesinde yine de çalışırdı .)

Boş <input>alanları dinamik olarak sadece CSS kullanarak biçimlendirebileceğinizi sanmıyorum (yani, bir alan boş olduğunda ve metin bir kez girilmediğinde geçerli olan kurallar). Boş bir özniteliğe sahiplerse ( ) veya öznitelikten tamamen yoksunlarsa ( ) başlangıçta boş alanlar seçebilirsiniz , ancak bu kadar.valueinput[value=""]input:not([value])


Hmm, efektlerin sadece input:empty. Belki de yanlış bir şeyler yazdım, kim bilir.
animuson

10
Cevabın son paragrafı input, requiredözniteliği HTML biçimlendirmesinde kullanabiliyorsanız , öğeler dinamik olarak (yeterince modern tarayıcılarda) biçimlendirilebilir. O zaman kullanabilirsin:valid:invalid , kontrolün boş değil ve boş değerini test etmek için ve CSS'de . Stackoverflow.com/questions/16952526/… sayfasına
Jukka K. Korpela

1
@ JukkaK.Korpela, ayrıca desen özelliğini kullanmıyorsanız.
WORMSS

2
input: not ([value = '']) değeri olan bir girdi seçecek;)
Chris Love

@Chris Love: Bir başlangıç (sayfa yüklemede) değeri ile girişler .
BoltClock

48

Satır içi javascript onkeyup="this.setAttribute('value', this.value);"& ile mümkündürinput:not([value=""]):not(:focus):invalid

Demo: http://jsfiddle.net/mhsyfvv9/

input:not([value=""]):not(:focus):invalid{
  background-color: tomato;
}
<input 
  type="email" 
  value="" 
  placeholder="valid mail" 
  onchange="this.setAttribute('value', this.value);" />


onchangeBu durumda olay daha iyi değil mi? Giriş değerlerini de düzenleyebildiğiniz Right click > Cutiçin (örneğin). Test edildi: iyi çalışıyor.
Derk Jan Speelman

45

Kullanmayı deneyebilirsiniz: yer tutucuda gösterilen ...

input {
  padding: 10px 15px;
  font-size: 16px;
  border-radius: 5px;
  border: 2px solid lightblue;
  outline: 0;
  font-weight:bold;
  transition: border-color 200ms;
  font-family: sans-serif;
}

.validation {
  opacity: 0;
  font-size: 12px;
  font-family: sans-serif;
  color: crimson;
  transition: opacity;
}

input:required:valid {
  border-color: forestgreen;
}

input:required:invalid:not(:placeholder-shown) {
  border-color: crimson;
}

input:required:invalid:not(:placeholder-shown) + .validation {
  opacity: 1;
}

  
<input type="email" placeholder="e-mail" required>
<div class="validation">Not valid</span>

yine de büyük bir destek yok ... caniuse


2
gerçi ... oldukça iyi destek caniuse
Reggie Pinkham

Eski güzel Internet Explorer (Y)
rorymorris89

@ EDGE rorymorris89 bile son sürümü :-( desteklemez
Mo

14

.floating-label-input {
  position: relative;
  height:60px;
}
.floating-label-input input {
  width: 100%;
  height: 100%;
  position: relative;
  background: transparent;
  border: 0 none;
  outline: none;
  vertical-align: middle;
  font-size: 20px;
  font-weight: bold;
  padding-top: 10px;
}
.floating-label-input label {
  position: absolute;
  top: calc(50% - 5px);
  font-size: 22px;
  left: 0;
  color: #000;
  transition: all 0.3s;
}
.floating-label-input input:focus ~ label, .floating-label-input input:focus ~ label, .floating-label-input input:valid ~ label {
  top: 0;
  font-size: 15px;
  color: #33bb55;
}
.floating-label-input .line {
  position: absolute;
  height: 1px;
  width: 100%;
  bottom: 0;
  background: #000;
  left: 0;
}
.floating-label-input .line:after {
  content: "";
  display: block;
  width: 0;
  background: #33bb55;
  height: 1px;
  transition: all 0.5s;
}
.floating-label-input input:focus ~ .line:after, .floating-label-input input:focus ~ .line:after, .floating-label-input input:valid ~ .line:after {
  width: 100%;
}
<div class="floating-label-input">
      <input type="text" id="id" required/>
      <label for="id" >User ID</label>
      <span class="line"></span>
</div>


7

Buna farklı bir şekilde yaklaşabilirsiniz; :emptysözde sınıfın kullanımını atlayın ve inputolayları, <input>alandaki önemli bir değeri tespit etmek ve buna göre biçimlendirmek için kullanın :

var inputs = document.getElementsByTagName('input');

for (var i = 0; i < inputs.length; i++) {
  var input = inputs[i];
  input.addEventListener('input', function() {
    var bg = this.value ? 'green' : 'red';
    this.style.backgroundColor = bg;
  });
}
body {
  padding: 40px;
}
#inputList li {
  list-style-type: none;
  padding-bottom: 1.5em;
}
#inputList li input,
#inputList li label {
  float: left;
  width: 10em;
}
#inputList li input {
  color: white;
  background-color: red;
}
#inputList li label {
  text-align: right;
  padding-right: 1em;
}
<ul id="inputList">
  <li>
    <label for="username">Enter User Name:</label>
    <input type="text" id="username" />
  </li>
  <li>
    <label for="password">Enter Password:</label>
    <input type="password" id="password" />
  </li>
</ul>

İlişkili


Yasal Uyarı: notu o inputolaylar halen deneyseldir ve muhtemelen yaygın desteklenmemektedir.


4

Yer tutucu girişte kaybolduğundan, şunları kullanabilirsiniz:

input:placeholder-shown{
    //rules for not empty input
}

2

saf css çözümü

input::-webkit-input-placeholder {
    opacity: 1;
    -webkit-transition: opacity 0s;
    transition: opacity 0s;
    text-align: right;
}
/* Chrome <=56, Safari < 10 */
input:-moz-placeholder {
    opacity: 1;
    -moz-transition: opacity 0s;
    transition: opacity 0s;
    text-align: right;
}
/* FF 4-18 */
input::-moz-placeholder {
    opacity: 1;
    -moz-transition: opacity 0s;
    transition: opacity 0s;
    text-align: right;
}
/* FF 19-51 */
input:-ms-input-placeholder {
    opacity: 1;
    -ms-transition: opacity 0s;
    transition: opacity 0s;
    text-align: right;
}
/* IE 10+ */
input::placeholder {
    opacity: 1;
    transition: opacity 0s;
    text-align: right;
}
/* Modern Browsers */

*:focus::-webkit-input-placeholder {
   opacity: 0;
   text-align: left;
}
/* Chrome <=56, Safari < 10 */
*:focus:-moz-placeholder {
    opacity: 0;
    text-align: left;
}
/* FF 4-18 */
*:focus::-moz-placeholder {
    opacity: 0;
    text-align: left;
}
/* FF 19-50 */
*:focus:-ms-input-placeholder {
    opacity: 0;
    text-align: left;
}
/* IE 10+ */
*:focus::placeholder {
    opacity: 0;
    text-align: left;
}
/* Modern Browsers */

input:focus {
    text-align: left;
}

0

Başka bir saf CSS çözümü

.form{
  position:relative;
  display:inline-block;
}
.form input{
  margin-top:10px;
}
.form label{
    position:absolute;
    left:0;
    top:0;
    opacity:0;
    transition:all 1s ease;
}
input:not(:placeholder-shown) + label{
    top:-10px;
    opacity:1;
}
<div class="form">
    <input type="text" id="inputFName" placeholder="Firstname">
    <label class="label" for="inputFName">Firstname</label>
</div>
<div class="form">
    <input type="text" id="inputLName" placeholder="Lastname">
    <label class="label" for="inputLName">Lastname</label>
</div>


-1

Bu, modern tarayıcılarda çalışmalıdır:

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

Değer özniteliğine sahip tüm girdileri seçer ve ardından aralarında boş olmayan değeri olan girdileri seçer.


10
Yine de bu dinamik olmazdı. Yalnızca özniteliği olarak tanımlanan girdi öğelerini seçer value="". Kutuya bir şey yazmak / kaldırmak herhangi bir değişikliğe neden olmaz.
animuson

-1
input:not([value=""])

Bu işe yarar çünkü girdiyi yalnızca boş bir dizge olmadığında seçiyoruz.


-1
input:not(:invalid){
 border: 1px red solid;
}

// or 

input:not(:focus):not(:invalid){
 border: 1px red solid;
}

1
On tane mevcut cevabı olan on bir yaşındaki bir soruya bir cevap eklerken, cevabınızın nasıl ve niçin işe yaradığına dair bir açıklama eklemek ve cevabınızın hangi yeni yönüne işaret etmek gerçekten önemlidir. Cevap, soru sorulduğundan beri değişen bir şeye bağlıysa, buna da dikkat edin.
Jason Aller
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.