จับคู่กล่องอินพุตว่างโดยใช้ CSS


141

ฉันจะใช้สไตล์กับกล่องใส่ข้อมูลที่ว่างได้อย่างไร หากผู้ใช้พิมพ์บางอย่างในฟิลด์อินพุตสไตล์นั้นไม่ควรใช้อีกต่อไป เป็นไปได้ใน CSS? ฉันลองสิ่งนี้:

input[value=""]

คำตอบ:


159

ถ้าเป็นเพียงสนามrequiredคุณก็สามารถไปด้วยinput: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>

ดูสดบน jsFiddle

หรือปฏิเสธการใช้#foo-thing:invalid(ให้เครดิตกับ @SamGoody)


14
.. หรือคัดค้านโดยใช้: ไม่ถูกต้อง {} developer.mozilla.org/en-US/docs/Web/CSS/
......

6
ฉันต้องการสิ่งเดียวกัน แต่ไม่จำเป็นต้องใช้ข้อมูลของฉัน มีวิธีการทำเช่นนี้?
Zahidul Islam Ruhel

1
ยอดเยี่ยม :)
kriskodzi

@ZahidulIslamRuhel แน่นอนคำตอบนี้ไม่ควรอยู่อันดับหนึ่ง ดูคำตอบด้านล่างstackoverflow.com/a/35593489/11293716
sijanec

150

ในเบราว์เซอร์สมัยใหม่คุณสามารถใช้:placeholder-shownเพื่อกำหนดเป้าหมายอินพุตว่าง (เพื่อไม่ให้สับสน::placeholder)

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

ข้อมูลเพิ่มเติมและการสนับสนุนเบราว์เซอร์: https://css-tricks.com/almanac/selectors/p/placeholder-shown/


4
เป็นสิ่งที่ดี! มีประโยชน์มาก :)
unbreak

1
@TricksfortheWeb ดูเหมือนว่าจะต้องมีแอตทริบิวต์ตัวยึดตำแหน่ง (ที่มีค่า) เพื่อแสดงในแท็กอินพุต ทดสอบใน Chrome - ไม่แน่ใจว่าสิ่งนี้นับสำหรับเบราว์เซอร์ทั้งหมดหรือไม่
Berend

9
ต้องตั้งค่าแอตทริบิวต์ตัวยึด อย่างไรก็ตามเราสามารถตั้งค่าแอตทริบิวต์ตัวยึดตำแหน่งเป็นช่องว่าง
Barcelonczyk

2
@Amanpreet ตามcaniuse.com/#search=placeholderสิ่งนี้จะไม่ทำงานใน IE 11 อย่างใดอย่างหนึ่ง (หรือ Edge)
ทิมมาโลน

4
ไม่รองรับเบราว์เซอร์ของ Microsoft เลย: caniuse.com/#feat=css-placeholder-shown
Lounge9

44

ไม่มีตัวเลือกใน CSS ที่ทำสิ่งนี้ ตัวเลือกแอททริบิวจับคู่กับค่าแอททริบิวไม่ใช่ค่าที่คำนวณ

คุณจะต้องใช้จาวาสคริปต์


3
สำหรับทุกคนที่ค้นหาคำตอบนี้ในภายหลัง: Quentin นั้นถูกต้องเกี่ยวกับค่าที่คำนวณ แต่มีตัวเลือกว่างที่สามารถใช้ที่นี่และมีการสนับสนุนที่เหมาะสม (เบราว์เซอร์ทั้งหมดยกเว้น IE8 และเก่ากว่าตาม: w3schools.com/cssref/sel_empty.asp
โคเฮน

35
:emptyตัวเลือกทำงานเฉพาะกับองค์ประกอบที่ว่างเปล่าหมายถึงเฉพาะองค์ประกอบที่มีแท็กเปิดและปิดที่ว่างเปล่าระหว่างและองค์ประกอบแท็กเดียวซึ่งถือว่าว่างเสมอตัวอย่างดังนั้นจึงไม่สามารถใช้กับองค์ประกอบอินพุตได้textarea
am05mhz

7
ไม่จริง. ดูคำตอบของ lukmo ด้านล่าง การรวม sttribute ที่จำเป็นและตัวเลือกหลอกที่ถูกต้องหรือไม่ถูกต้องได้รับสิ่งนี้
voidstate

2
นี่เป็นคำตอบที่ถูกต้องในเวลาที่ถามคำถาม แอตทริบิวต์ที่ต้องการมีเฉพาะใน Chrome และ Firefox ในปี 2011 และคำตอบนี้มาจาก 2010 อย่างไรก็ตามเวลามีการเปลี่ยนแปลงและนี่ไม่ใช่คำตอบที่ "ดีที่สุด" อีกต่อไปดังนั้นฉันจึงยกเลิกการทำเครื่องหมายว่ายอมรับแล้ว
Sjoerd

18

การอัปเดตค่าของเขตข้อมูลจะไม่อัปเดตแอตทริบิวต์ค่าใน DOM ดังนั้นจึงเป็นสาเหตุที่ผู้เลือกของคุณจับคู่เขตข้อมูลเสมอแม้ว่าจะไม่ได้ว่างเปล่าก็ตาม

แทนที่จะใช้invalidคลาสหลอกเพื่อให้ได้สิ่งที่คุณต้องการเช่น:

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])

ทำงานร่วมกับ:

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

แต่สไตล์จะไม่เปลี่ยนแปลงทันทีที่มีคนเริ่มพิมพ์ (คุณต้องใช้ JS เพื่อสิ่งนั้น)


1
ไม่น่าเชื่อถือเนื่องจากแอตทริบิวต์ค่าไม่เปลี่ยนแปลงใน DOM หลังจากแก้ไขฟิลด์ อย่างไรก็ตามเคล็ดลับดี ๆ ถ้าคุณไม่สนใจเรื่องนี้ - และใช้งานได้ใน Safari, Chrome, FF และ IE ล่าสุด ...
Dunc

9
input[value=""], input:not([value])เพื่อให้ตรงกับอดีตคุณสามารถใช้
Schism

10

หากเบราว์เซอร์ที่สนับสนุนมรดกไม่จำเป็นคุณสามารถใช้การรวมกันของrequired, และvalidinvalid

สิ่งที่ดีเกี่ยวกับการใช้นี้เป็นvalidและinvalidหลอกองค์ประกอบทำงานได้ดีกับคุณลักษณะประเภทของช่องใส่ ตัวอย่างเช่น:

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/>

สำหรับการอ้างอิง JSFiddle ที่นี่: 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');
    }
});

ใน jQuery ฉันเพิ่มคลาสและสไตล์ด้วย CSS

.empty { background:none; }

6

สิ่งนี้ใช้ได้กับฉัน:

สำหรับ HTML ให้เพิ่มแอrequiredททริบิวในองค์ประกอบอินพุต

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

สำหรับ CSS ใช้:invalidตัวเลือกเพื่อกำหนดเป้าหมายอินพุตว่าง

input.my-input-element:invalid {

}

หมายเหตุ:

  • เกี่ยวกับrequiredจากw3Schools.com : "เมื่อมีอยู่จะระบุว่าต้องป้อนข้อมูลในฟิลด์ป้อนข้อมูลก่อนส่งแบบฟอร์ม"

2

อาจมีการถามคำถามนี้เมื่อไม่นานมานี้ แต่เมื่อไม่นานมานี้ในหัวข้อที่กำลังมองหาการตรวจสอบความถูกต้องของแบบฟอร์มฝั่งไคลเอ็นต์และเมื่อการ:placeholder-shown สนับสนุนเริ่มดีขึ้นฉันคิดว่าสิ่งต่อไปนี้อาจช่วยผู้อื่นได้

การใช้ความคิดBerendในการใช้คลาสหลอกหลอก CSS4 นี้ฉันสามารถสร้างการตรวจสอบความถูกต้องของฟอร์มได้เฉพาะเมื่อผู้ใช้กรอกข้อมูลเสร็จ

นี่คือ ademo และคำอธิบายเกี่ยวกับ CodePen: https://codepen.io/johanmouchet/pen/PKNxKQ


1

หากคุณมีความสุขที่ไม่สนับสนุน IE หรือ pre-Chromium Edge (ซึ่งอาจใช้ได้ถ้าคุณใช้สิ่งนี้เพื่อเพิ่มประสิทธิภาพแบบก้าวหน้า) คุณสามารถใช้:placeholder-shownตามที่ Berend ได้กล่าวไว้ โปรดทราบว่าสำหรับ Chrome และ Safari คุณต้องมีตัวยึดตำแหน่งที่ไม่ว่างเปล่าเพื่อให้ใช้งานได้แม้ว่าจะมีพื้นที่ว่าง

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

มันใช้งานได้สำหรับฉันที่จะเพิ่มชื่อคลาสให้กับอินพุตแล้วใช้กฎ CSS กับสิ่งนั้น:

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

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

0

ฉันสงสัยว่าคำตอบที่เรามีคุณสมบัติที่ชัดเจนในการรับกล่องใส่ที่ว่างเปล่าดูที่รหัสนี้

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

UPDATE

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

มากกว่าสำหรับการมีลักษณะที่ดีในการตรวจสอบ

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

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

7
:emptyใช้กับองค์ประกอบที่ไม่มีลูกเท่านั้น อินพุตไม่สามารถมีโหนดลูกได้เลยอินพุตของคุณจะเป็นขอบสีแดงเสมอ ยังเห็นความคิดเห็นนี้
Zhegan

2
@NasserHadjloo คุณได้ทดสอบสิ่งนี้แล้วหรือยัง การเปลี่ยนvalueจะไม่เปลี่ยนจำนวนโหนดย่อย
jcuenod

@jcuenod คุณหมายถึงจำนวนโหนดลูกอย่างไร ฉันไม่เข้าใจประเด็นของคุณ
Nasser Hadjloo

ในโครงสร้าง xml โหนดจะซ้อนกัน (เช่น<parent><child></child></parent>) คุณเพียงแค่ต้อง<input></input>และเป็นคุณพิมพ์สิ่งที่เปลี่ยนแปลงไม่ได้เป็น<value>ภายในโหนด<input>แต่ค่าแอตทริบิวต์ :<input value='stuff you type'></input>
jcuenod

2
แต่นั่นไม่ใช่สิ่งที่ OP พยายามที่จะบรรลุ
jcuenod

0

ฉันรู้ว่านี่เป็นเธรดที่เก่ามาก แต่สิ่งต่าง ๆ ได้เปลี่ยนไปเล็กน้อยตั้งแต่นั้นมาและมันก็ช่วยให้ฉันค้นหาชุดที่ถูกต้องของสิ่งที่ฉันต้องการเพื่อแก้ไขปัญหาของฉัน ดังนั้นฉันคิดว่าฉันจะแบ่งปันสิ่งที่ฉันทำ

ปัญหาคือฉันควรจะใช้ css เดียวกันกับอินพุตที่เป็นตัวเลือกถ้ามันเต็มเพราะฉันต้องกรอก css ใช้คลาส psuedo: ถูกต้องซึ่งใช้ css กับอินพุตเพิ่มเติมเช่นกันเมื่อไม่ได้กรอกข้อมูล

นี่คือวิธีที่ฉันแก้ไขมัน;

HTML

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

CSS

input:required:valid {
    ....
}
input:optional::not(:placeholder-shown){
    ....
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.