: नहीं (: खाली) सीएसएस चयनकर्ता काम नहीं कर रहा है?


93

मैं इस विशेष सीएसएस चयनकर्ता के साथ एक समय की ऊँचाई पर चल रहा हूँ, जब मैं :not(:empty)इसे जोड़ने के लिए काम नहीं करना चाहता । यह अन्य चयनकर्ताओं के किसी भी संयोजन के साथ ठीक काम करता है:

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

अगर मैं :not(:empty)हिस्सा निकालता हूं , तो यह ठीक काम करता है। यहां तक ​​कि अगर मैं चयनकर्ता को बदल देता हूं, input:not(:empty)तब भी उन इनपुट फ़ील्ड का चयन नहीं करेगा, जिनमें टेक्स्ट टाइप किया गया है। क्या यह टूटी हुई है या मुझे सिर्फ :emptyएक :not()चयनकर्ता के भीतर उपयोग करने की अनुमति नहीं है ?

केवल एक और चीज जो मैं सोच सकता हूं, वह यह है कि ब्राउज़र अभी भी कह रहे हैं कि तत्व खाली है क्योंकि इसके कोई बच्चे नहीं हैं, बस प्रति "मूल्य" है। करता है:empty चयनकर्ता के पास एक नियमित तत्व बनाम इनपुट तत्व के लिए अलग कार्यक्षमता नहीं है? हालांकि यह संभव नहीं लगता है क्योंकि :emptyकिसी क्षेत्र पर उपयोग करने और उसमें कुछ टाइप करने के कारण वैकल्पिक प्रभाव हट जाएगा (क्योंकि यह खाली नहीं है)।

फ़ायरफ़ॉक्स 8 और क्रोम में परीक्षण किया गया।


क्या आप संबंधित कोड पोस्ट कर सकते हैं?
वीरेंद्र

2
मैं तुम्हें का हिस्सा उद्धृत कर सकते हैं के लिए API संदर्भ :emptyचयनकर्ता : ", कुछ अन्य तत्वों दूसरे हाथ पर, खाली हैं (यानी कोई बच्चे हैं) परिभाषा के द्वारा: <input>, <img>, <br>, और <hr>उदाहरण के लिए, के लिए।"
डेविड का कहना है कि मोनिका

@ वीरेंद्र: यह प्रासंगिक कोड है, लेकिन मैंने इसमें वास्तविक सीएसएस नियम जोड़ दिए हैं। यदि मैं हटाता हूं :not(:empty), तो लाल बॉर्डर एक इनपुट के लिए अपेक्षित के रूप में काम करता है जो फोकस में नहीं है लेकिन अमान्य है।
animuson

जवाबों:


151

शून्य तत्व होने के नाते , एक <input>तत्व को "खाली" की HTML परिभाषा द्वारा खाली माना जाता है , क्योंकि सभी शून्य तत्वों का सामग्री मॉडल हमेशा खाली होता है । इसलिए वे हमेशा :emptyछद्म श्रेणी से मेल खाएंगे , चाहे उनका मूल्य हो या न हो। यही कारण है कि उनके मूल्य को प्रारंभ टैग में एक विशेषता द्वारा दर्शाया जाता है, न कि प्रारंभ और अंत टैग के भीतर पाठ सामग्री के बजाय।

इसके अलावा, चयनकर्ता कल्पना से :

:emptyछद्म वर्ग एक तत्व सभी में कोई बच्चे हैं कि प्रतिनिधित्व करता है। दस्तावेज़ के पेड़ के संदर्भ में, केवल तत्व नोड्स और सामग्री नोड्स (जैसे डोम टेक्स्ट नोड्स, सीडीएटीए नोड्स, और इकाई संदर्भ) जिनके डेटा में गैर-शून्य लंबाई है, को शून्यता को प्रभावित करने के रूप में माना जाना चाहिए;

नतीजतन, input:not(:empty)एक उचित HTML दस्तावेज़ में कुछ भी मेल नहीं खाएगा। (यह अभी भी एक काल्पनिक एक्सएमएल दस्तावेज़ में काम करेगा जो एक <input>तत्व को परिभाषित करता है जो पाठ या बाल तत्वों को स्वीकार कर सकता है।)

मुझे नहीं लगता है कि आप <input>केवल सीएसएस (यानी जब भी कोई फ़ील्ड खाली हो, लागू हो और एक बार पाठ दर्ज न हो) का उपयोग करके गतिशील रूप से खाली फ़ील्ड शैली कर सकते हैं । आप शुरू में खाली खेतों का चयन कर सकते हैं यदि उनके पास एक खाली valueविशेषता है ( input[value=""]) या पूरी तरह से विशेषता का अभाव है ( input:not([value])), लेकिन यह इसके बारे में है।


हम्म, मुझे याद नहीं है कि मैंने जो कुछ किया था, वह सिर्फ उसी के साथ चला गया input:empty। शायद मैंने कुछ गलत लिखा है, कौन जानता है।
animuson

9
inputयदि आप requiredHTML मार्कअप में विशेषता का उपयोग कर सकते हैं , तो जवाब में अंतिम पैराग्राफ, तत्वों को गतिशील (पर्याप्त रूप से आधुनिक ब्राउज़रों में) स्टाइल किया जा सकता है । फिर आप उपयोग कर सकते हैं :validऔर :invalidसीएसएस में नियंत्रण के खाली बनाम शून्य के लिए परीक्षण करने के लिए। देखें stackoverflow.com/questions/16952526/…
Jukka K. Korpela

1
@ JukkaK.Korpela जब तक आप पैटर्न विशेषता का उपयोग नहीं कर रहे हैं।
वर्क

2
इनपुट: नहीं ([value = '']) मान के साथ एक इनपुट का चयन करेगा?)
क्रिस लव

@ क्रिस लव: एक प्रारंभिक (पेज लोड पर) मूल्य के साथ इनपुट ।
BoltClock

43

यह इनलाइन जावास्क्रिप्ट onkeyup="this.setAttribute('value', this.value);"और के साथ संभव हैinput:not([value=""]):not(:focus):invalid

डेमो: 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);" />


क्या onchangeइस मामले में घटना बेहतर नहीं है ? चूँकि आप इनपुट वैल्यूज़ को एडिट कर सकते हैं Right click > Cut(उदाहरण के लिए)। यह परीक्षण किया: ठीक काम करता है।
डर्क जान स्पिलमैन

40

आप उपयोग करने का प्रयास कर सकते हैं: प्लेसहोल्डर-दिखाया ...

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>

कोई बड़ा समर्थन हालांकि ... caniuse


2
बहुत अच्छा समर्थन हालांकि ... caniuse
रेगी

अच्छा पुराना इंटरनेट एक्सप्लोरर (Y)
rorymorris89

@ Rorymorris89 EDGE का नवीनतम संस्करण भी समर्थन नहीं करता है :-(
मो।

12

.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

आप इसे अलग तरीके से देख सकते हैं; :emptyछद्म वर्ग के उपयोग को छोड़ दें और inputघटनाओं का उपयोग करके <input>क्षेत्र में एक महत्वपूर्ण मूल्य का पता लगाएं और तदनुसार शैली दें:

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>

सम्बंधित


अस्वीकरण: ध्यान दें कि inputघटनाएं वर्तमान में प्रयोगात्मक हैं , और शायद व्यापक रूप से समर्थित नहीं हैं।


3

चूंकि प्लेसहोल्डर इनपुट पर गायब है, आप उपयोग कर सकते हैं:

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

2

शुद्ध सीएसएस समाधान

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

एक और शुद्ध सीएसएस समाधान

.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

यह आधुनिक ब्राउज़रों में काम करना चाहिए:

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

यह सभी इनपुट का चयन मूल्य विशेषता के साथ करता है और फिर उनके बीच गैर रिक्त मान वाले इनपुट का चयन करता है।


10
हालांकि यह गतिशील नहीं होगा। यह केवल उन इनपुट तत्वों का चयन करेगा जिनकी विशेषता के रूप में परिभाषित किया गया है value=""। बॉक्स में कुछ टाइप करने / निकालने से कोई परिवर्तन नहीं होगा।
animuson

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

यह काम करता है क्योंकि हम इनपुट का चयन केवल तभी करते हैं जब कोई रिक्त स्ट्रिंग नहीं होती है


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

// or 

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

1
दस मौजूदा उत्तरों के साथ ग्यारह साल पुराने प्रश्न के उत्तर को जोड़ने पर, यह महत्वपूर्ण है कि आपके उत्तर कैसे और क्यों काम करते हैं और आपके उत्तर के प्रश्न के किस नए पहलू को इंगित करने के लिए कुछ स्पष्टीकरण जोड़ते हैं। यदि उत्तर किसी ऐसी चीज पर निर्भर करता है जो प्रश्न पूछे जाने के बाद से बदल गई है और साथ ही बाहर भी।
जेसन एलेर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.