CSS kullanarak bir girdinin içinde metin olup olmadığını tespit edin - ziyaret ettiğim ve kontrol etmediğim bir sayfada?


187

Bir girdinin içinde CSS aracılığıyla metin olup olmadığını tespit etmenin bir yolu var mı? Ben kullanarak denedim :emptysözde sınıfı, ben kullanarak denedim [value=""], ikisi de çalıştı. Buna tek bir çözüm bulamıyorum.

Ne için sözde sınıfları dikkate alınarak, bu mümkün olmalıdır hayal :checkedve :indeterminatenazik benzer şey, her ikisi de.

Lütfen dikkat: Bunu JavaScript kullanamayan bir "Şık" stil için yapıyorum .

Ayrıca, şıklığın kullanıcının kontrol etmediği sayfalarda kullanıldığını unutmayın.


Ben zaten (zaten anında güncellenmez) CSS ile bunu yapmak için bir yol emin değilim. Bununla birlikte, JavaScript ile bu kolaydır.
ralph.m

JavaScript kullanabileceğimi sanmıyorum. "Şık" bir tarz üzerinde çalışıyorum. Tamamen CSS ile yapılması gerektiğinden eminim. Kullanıcı metin girerken güncellenmezse, sanırım bu zaman kaybıdır. Bunu düşünmedim. Hmm. En azından bu stil için kritik değil, eklemeyi umduğum sadece güzel.
JacobTheDev

Yanıtlar:


66

Şık bunu yapamaz çünkü CSS bunu yapamaz. CSS'de <input>değer (ler) için hiç (sahte) seçici yoktur . Görmek:

:emptySeçici tek çocuk düğümleri değil, girdi değerleri belirtmektedir.
[value=""] does işi; ama sadece başlangıç durumu için. Bunun nedeni, bir düğümün value özniteliğinin (CSS'nin gördüğü), düğümün value özelliğiyle aynı olmamasıdır (Kullanıcı veya DOM javascript tarafından değiştirilir ve form verileri olarak gönderilir).

Yalnızca başlangıç durumuna umurumda sürece, sen gerekir Bir userscript veya Greasemonkey komut dosyasını kullanın. Neyse ki bu zor değil. Aşağıdaki komut dosyası Chrome'da veya Greasemonkey veya Scriptish'in yüklü olduğu Firefox'ta veya kullanıcı metinlerini destekleyen herhangi bir tarayıcıda (IE hariç çoğu tarayıcıda) çalışır.

Bu jsBin sayfasında CSS sınırlarının artı javascript çözümünün demosuna bakın .

// ==UserScript==
// @name     _Dynamically style inputs based on whether they are blank.
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

var inpsToMonitor = document.querySelectorAll (
    "form[name='JustCSS'] input[name^='inp']"
);
for (var J = inpsToMonitor.length - 1;  J >= 0;  --J) {
    inpsToMonitor[J].addEventListener ("change",    adjustStyling, false);
    inpsToMonitor[J].addEventListener ("keyup",     adjustStyling, false);
    inpsToMonitor[J].addEventListener ("focus",     adjustStyling, false);
    inpsToMonitor[J].addEventListener ("blur",      adjustStyling, false);
    inpsToMonitor[J].addEventListener ("mousedown", adjustStyling, false);

    //-- Initial update. note that IE support is NOT needed.
    var evt = document.createEvent ("HTMLEvents");
    evt.initEvent ("change", false, true);
    inpsToMonitor[J].dispatchEvent (evt);
}

function adjustStyling (zEvent) {
    var inpVal  = zEvent.target.value;
    if (inpVal  &&  inpVal.replace (/^\s+|\s+$/g, "") )
        zEvent.target.style.background = "lime";
    else
        zEvent.target.style.background = "inherit";
}

Bu kullanıcı metni konusuna bakacağım. Teşekkürler.
JacobTheDev

@ MartinGottweis, OP'nin durumunda değil. Bu [şık] bir soru.
Brock Adams

1
@BrockAdams, op, javascript kullanamayacağını söylüyor, bu yüzden: geçerli seçenek bir yoludur. Bir şey mi kaçırıyorum?
Martin Gottweis

1
@MartinGottweis, :validopsiyon yeniden yazarak gerektirir - OP Şık ile ilgisi olmayan bir şeydir ve diğer cevapların hiçbiri göstermek hiç bir tarama bağlamında. Kullanıcının ziyaret ettiği sayfa üzerinde kontrolü yoktur.
Brock Adams

265

Her zamanki CSS uyarılarıyla ve HTML kodunun değiştirilip değiştirilemeyeceği mümkündür. Eklersenizrequired elemana niteliğini, daha sonra eleman maç olacak :invalidya :validkontrolün değer boş olup olmadığına göre. Elemanın bir valueniteliği yoksa (veya varsa value=""), kontrolün değeri başlangıçta boştur ve herhangi bir karakter (boşluk bile) girildiğinde boş kalır.

Misal:

<style>
#foo { background: yellow; }
#foo:valid { outline: solid blue 2px; }
#foo:invalid { outline: solid red 2px; }
</style>
<input id=foo required>

Sözde sınıf :valid ve :invalidyalnızca Çalışma Taslak düzeyi CSS belgelerinde tanımlanır, ancak IE'de IE 10 ile birlikte gelmesi dışında destek tarayıcılarda oldukça yaygındır.

“Boş” yalnızca boşluklardan oluşan değerleri dahil etmek istiyorsanız, özelliği ekleyebilirsiniz pattern=.*\S.*.

Bir giriş kontrolünün boş olmayan bir değere sahip olup olmadığını doğrudan tespit etmek için (şu anda) hiçbir CSS seçici yoktur, bu yüzden yukarıda açıklandığı gibi dolaylı olarak yapmamız gerekir.

Genel olarak, CSS seçicileri , kullanıcı eylemlerinden ziyade komut dosyası (set tarafı JavaScript) ile ayarlandığı gibi işaretleme veya bazı durumlarda öğe özelliklerine başvurur . Örneğin, :emptyöğeyi işaretlemede boş içerikle eşleştirir; tüm inputunsurlar bu anlamda kaçınılmaz olarak boştur. Seçici [value=""], öğenin valueişaretlemede özniteliğe sahip olup olmadığını ve değer olarak boş dizeye sahip olup olmadığını test eder . Ve :checkedve :indeterminatebenzeri şeylerdir. Gerçek kullanıcı girdilerinden etkilenmezler.


7
Bu, yalnızca ve her girdi gerekiyorsa harika bir çözümdür - değilse, geçersiz stilde etkilenmeyen boş ancak geçerli bir giriş alanınızın olduğu bir durumla karşılaşırsınız . JS muhtemelen bu çözümün galibi
AdamSchuld

7
Bu kirli ama harika akıllı. Soruya bir çözüm değil, ama benim için hile yaptı
Jan

1
Kirli çözelti. Bu
VEYA'ya

1
Anlamsal olarak bu yanlıştır. Önceki yorumlarda belirtildiği gibi, bazı girdiler isteğe bağlı olabilir ve requiredözellik formun gönderilmesini engelleyebilir.
zhenming

1
Bir kez doldurulduktan sonra alan boş olduğunda kırmızı ekran hakkında endişelenmemeniz novalidateiçin <form>öğeye özellik eklendi :<form ... novalidate> <input ... required /> </form>
Alcalyn

228

:placeholder-shownYalancı sınıfı kullanabilirsiniz . Teknik olarak bir yer tutucu gereklidir, ancak bunun yerine bir boşluk kullanabilirsiniz.

input:not(:placeholder-shown) {
  border-color: green;
}

input:placeholder-shown {
  border-color: red;
}
<input placeholder="Text is required" />
<input placeholder=" " value="This one is valid" />
<input placeholder=" " />


10
Ne yazık ki IE veya Firefox tarafından bu desteklenmiyor. Kaynak: caniuse.com/#feat=css-placeholder-shown
Sean Dawson

2
Müthiş cevap. Tarayıcı desteği berbat, ancak bir çoklu dolgu ortaya çıkarsa, :placeholder-shownbu kabul edilen cevap olmalıdır. requiredYöntem hesap saçak durumlarda dikkate almaz. Bir yer tutucusuna boşluk bırakabileceğiniz ve bu yöntemin yine de işe yarayacağı belirtilmelidir. Kudos.
corysimmons

5
Bunun diğer dezavantajı aslında bir yer tutucusuna sahip olmanız gerekiyor gibi görünüyor. Başka bir deyişle, değer olmasa bile input:not(:placeholder-shown)her zaman eşleşecektir <input/>.
redbmk

5
Benim için Chrome, Firefox ve Safari'de çalışıyor. IE11'de değil.
J0ANMM

1
@redbmk corysimmons'ın belirttiği gibi, bir yer tutucusuna bir boşluk geçirebileceğiniz ve bu yöntem hala işe yarayacağına dikkat edilmelidir.
Naeem Baghi

32
<input onkeyup="this.setAttribute('value', this.value);" />

ve

input[value=""]

çalışacak :-)

düzenleme: http://jsfiddle.net/XwZR2/


24
Bu CSS mi? HTML ve Javascript gibi görünüyor (ama yanılmış olabilirim).
jww

Brook Adams şunu yazdı: [value = ""] işe yarıyor; ama sadece başlangıç ​​durumu için. Bunun nedeni, bir düğümün değer özelliğinin (CSS'nin gördüğü), düğümün değer özelliğiyle aynı olmamasıdır (Kullanıcı veya DOM javascript tarafından değiştirilir ve form verileri olarak gönderilir). -> Sihir, değişikliklerin değer niteliğini güncellemektir: jsfiddle.net/XwZR2
Tom D.

2
@ JánosWeisz hayır olmayacak. Bu işleyici, bir komut dosyasının bu öğeyi değiştirebilmesi için ayarlanır ve addEventListener ile eklenen işleyici boyunca çalışabilir.
Mart'ta Dinoboff

1
Açıkçası, onkeyup sadece klavye girişini halleder. Ancak farenizi kullanarak bir giriş kutusuna metin yapıştırabileceğinizi unutmayın. Deneyin: Bazı metni panonuza kopyalayın, ardından girişi sağ tıklayın ve Yapıştır'ı tıklayın. CSS'nin çalışmadığını izleyin. Farenizle giriş kutusuna metin sürükleyip bırakarak aynı.
beluga

4
input[value]:not([value=""])- daha iyi. Herkese teşekkürler. codepen.io/iegik/pen/ObZpqo
iegik

30

Temel olarak herkesin aradığı:

AZ:

input:focus:required{
    &:invalid{ color: red; border-color: red; box-shadow: 0 0 6px red;}
    &:valid,
    &:placeholder-shown{ border-color: green; box-shadow: 0 0 8px green;}
}

Saf CSS:

input:focus:required:invalid{ color: red; border-color: red; box-shadow: 0 0 6px red;}
input:focus:required:valid,
input:focus:required:placeholder-shown{ border-color: green; box-shadow: 0 0 8px green;}

1
Açıkça çalışma çözümünü kullandınız ve 0 oyunuz var mı?
Pro

5
Müthiş cevap. : Placeholder-gösterilen sözde sınıf IE veya Edge'de çalışmaz, bu yüzden tam bir çözüm değildir. Yine de çok lanetlendi ve Edge'i desteklemediğim için öldürmek istememi sağlıyor. IE Kabul edebilirdim ama Edge? Hadi Microsoft!
Aaron Martin-Colby


Teşekkür ederim efendim, içtenlikle bu yükselir umarım çünkü çoğu insanın gerçekten istediği budur.
sivi911

20

placeholderNumarayı yukarıda yazılı olmadan kullanabilirsinizrequired alanını .

İle ilgili sorun required şey yazdığınızda, daha sonra sildiğinizde - giriş artık HTML5 spesifikasyonunun bir parçası olarak her zaman kırmızı olacaktır - o zaman düzeltmek / geçersiz kılmak için yukarıda yazıldığı gibi bir CSS'ye ihtiyacınız olacaktır.

Basit bir şey yapmadan yapabilirsiniz required

<input type="text" placeholder="filter here" id="mytest" />

CSS

#mytest:placeholder-shown {
/* if placeholder is shown - meaning - no value in input */
  border: black 1px solid;
  color: black;
}
#mytest {
  /* placeholder isn't shown - we have a value in input */
  border: red 1px solid;
  color: red;
}

Kod kalemi: https://codepen.io/arlevi/pen/LBgXjZ


1
Bu yaklaşım benim kullanım durumum için mükemmel bir seçim oldu. Zaten yer tutucuları olan arama filtrelerim vardı ve bir değer bulunduğunda giriş kutusunun kenarlığının vurgulanmasını istedim.
Stephen Tuttlebee

9

Basit css:

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

Giriş doldurulursa bu kod sayfa yüklemesinde verilen css'yi uygulayacaktır.


9
Bu yalnızca sayfa yüklemesinde çalışır. Dinamik bir değer yazmak değil.
Ben Racicot

Bu yanıt için sayfa yükleme sorunu açıkça belirtilmelidir.
Bryce Snyder

6

Yer input[type=text]tutucuyu şekillendirerek girdinin metne sahip olup olmamasına bağlı olarak farklı stil uygulayabilirsiniz. Bu, bu noktada resmi bir standart değildir, ancak farklı ön eklerle birlikte geniş tarayıcı desteğine sahiptir:

input[type=text] {
    color: red;
}
input[type=text]:-moz-placeholder {
    color: green;
}
input[type=text]::-moz-placeholder {
    color: green;
}
input[type=text]:-ms-input-placeholder {
    color: green;
}
input[type=text]::-webkit-input-placeholder {
    color: green;
}

Örnek: http://fiddlesalad.com/scss/input-placeholder-css


FYI, bu, yer tutucuyu güvenilir bir şekilde biçimlendirir, ancak yalnızca yer tutucunun kendisini oluşturur. Bu size metin rengini değiştirme yanılsaması verir, ancak varsayılan olarak sadece gri ve siyah renkte durum böyledir.
John Weisz

Tüm CSS ucuz bir yanılsamadır, sadece gerçek içeriği etkilemeden görünümleri değiştirirsiniz :-)
vbraun

Tam da ihtiyacım olan şey bu. Yer tutucunun tasarımı giriş stilinden farklı olduğu için metin varsa, girişin stilleri değiştirmesini istedim. Mükemmel!
Christopher Marshall

Bu arka planlar için çalışır, ancak sınırlar için değildir. Yine de sınırı değiştirmeye çalışmak için çok derin kazmadım.
majinnaibu

5

JS ve CSS kullanma: yalancı sınıf değil

 input {
        font-size: 13px;
        padding: 5px;
        width: 100px;
    }

    input[value=""] {
        border: 2px solid #fa0000;
    }

    input:not([value=""]) {
        border: 2px solid #fafa00;
    }
<input type="text" onkeyup="this.setAttribute('value', this.value);" value="" />

   


4

Yer tutucudan yararlanabilir ve şunları kullanabilirsiniz:

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

3

Geçerli selektör hile olacaktır.

<input type="text" class="myText" required="required" />

.myText {
    //default style of input
}
.myText:valid {
    //style when input has text
}

1

JQuery ve CSS ile Basit Hile Şöyle:

JQuery:

$('input[value=""]').addClass('empty');
        $('input').keyup(function(){
            if( $(this).val() == ""){
                $(this).addClass("empty");
            }else{
                $(this).removeClass("empty");
            }
        });

CSS:

input.empty:valid{
        box-shadow: none;
        background-image: none;
        border: 1px solid #000;
    }

    input:invalid,
    input:required {
        box-shadow: 3px 1px 5px rgba(200, 0, 0, 0.85);
        border: 1px solid rgb(200,0,0);
    }




    input:valid{
        box-shadow: none;
        border: 1px solid #0f0;
    }

1

HTML bölümünde böyle yapın:

<input type="text" name="Example" placeholder="Example" required/>

Gerekli parametre, geçerli olması için giriş alanında metin olmasını gerektirir.


Bu, girişin içinde soru olan CSS ile metin olup olmadığını tespit etmeye yardımcı olmaz.
Jukka K. Korpela

Üzgünüm, aslında yardımcı oluyor ... Cevabımda açıklandığı gibi sözde sınıfları kullanmayı mümkün kılıyor.
Jukka K. Korpela

1
Bu Şık bir sorudur - yani OP hedef sayfayı kontrol edemez veya değiştiremez. Yalnızca sayfayı müşteri tarafında görür.
Brock Adams

3
Bu çok yardımcı oldu, işte Xedret'in neden bahsettiğine bir örnek: codepen.io/tolmark12/pen/LsBvf
tolmark

****** <giriş gerekli> && giriş: geçerli {...} ******
FremyCompany

0

Evet! bunu değer seçicili basit temel özellik ile yapabilirsiniz.

Boş değerli öznitelik seçiciyi kullanma ve özellikleri uygulama input[value='']

input[value=''] {
    background: red;
}

-6

Bu css ile mümkün değildir. Bunu uygulamak için JavaScript kullanmanız gerekir (örn. $("#input").val() == "").


2
Bunu nasıl yapacağımı biliyorum, CSS ile yapmam gerek. Lütfen orijinal yayındaki yorumları okuyun. Bildiğim kadarıyla JavaScript kullanamayan bir "Şık" stil oluşturuyorum.
JacobTheDev
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.