使用CSS匹配空输入框

时间:2010-09-01 10:21:09

标签: css input css-selectors

如何将样式应用于空输入框?如果用户在输入字段中键入内容,则不应再应用该样式。这在CSS中可行吗?我试过这个:

input[value=""]

13 个答案:

答案 0 :(得分:140)

如果只有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>

请参阅live on jsFiddle

或否定使用#foo-thing:invalid(归功于@SamGoody)

答案 1 :(得分:111)

在现代浏览器中,您可以使用: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/

答案 2 :(得分:43)

CSS中没有选择器可以执行此操作。属性选择器匹配属性值,而不是计算值。

您必须使用JavaScript。

答案 3 :(得分:16)

更新字段的值不会更新DOM中的value属性,这就是为什么您的选择器始终与字段匹配的原因,即使它实际上并不是空的。

而是使用invalid pseudo-class来达到你想要的效果,如下所示:

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

<input required type="text" value="Value">
&#13;
&#13;
&#13;

答案 4 :(得分:15)

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

适用于:

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

但是一旦有人开始打字,风格就不会改变(你需要JS)。

答案 5 :(得分:9)

如果不需要支持旧版浏览器,则可以使用requiredvalidinvalid的组合。

使用它的好处是validinvalid伪元素与输入字段的类型属性配合良好。例如:

&#13;
&#13;
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;
}
&#13;
<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/>
&#13;
&#13;
&#13;

供参考,JSFiddle在这里:http://jsfiddle.net/0sf6m46j/

答案 6 :(得分:5)

$('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; }

答案 7 :(得分:3)

这对我有用:

html: - 将所需属性添加到输入元素

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

css: - 使用:无效选择器

input.my-input-element:invalid {

}

注意:

  • 不需要输入元素中的值。
  • 关于w3Schools.com的要求, “如果存在,它指定在提交表单之前必须填写输入字段。”

答案 8 :(得分:3)

对我来说,在输入中添加一个类名,然后对其应用CSS规则,对我来说很有效:

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

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

答案 9 :(得分:2)

这个问题可能是前一段时间被问过的,但是当我最近找到这个主题寻找客户端表单验证时,随着:placeholder-shown support 越来越好,我想到了以下几点可能会帮助别人。

使用Berend使用此CSS4伪类的想法,我能够创建仅在用户填写完成后触发的表单验证。

以下是CodePen的解释和说明: https://codepen.io/johanmouchet/pen/PKNxKQ

答案 10 :(得分:2)

如果您很高兴不支持IE或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>

答案 11 :(得分:0)

我想知道答案我们有明确的属性来获取空输入框,看看这段代码

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

<强>更新

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;
    }
}

答案 12 :(得分:0)

我意识到这是一个非常老的线程,但是此后发生了一些变化,它确实帮助我找到了解决问题所需的正确组合。所以我想我会分享我所做的。

问题是,我想在可选输入中将相同的CSS应用于可选输入,就像我对必需的填充一样。 css使用了psuedo类:valid,该类在未填充时也将css应用于可选输入。

这就是我修复它的方式;

HTML

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

CSS

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