使用CSS检测输入中是否有文本 - 在我正在访问的页面上并且无法控制?

Jac*_*Dev 161 css input is-empty stylish

有没有办法通过CSS检测输入中是否有文本?我已经尝试过使用:empty伪类,我尝试过使用[value=""],但两者都没有用.我似乎无法找到一个解决方案.

我想这一定是可能的,考虑到我们有伪类:checked,并且:indeterminate两者都是类似的东西.

请注意:我这样做的是"时尚"风格,无法使用JavaScript.

另请注意,在用户无法控制的页面上使用Stylish,客户端.

Juk*_*ela 234

有可能,通常的CSS警告和HTML代码可以修改.如果将required属性添加到元素,则元素将匹配:invalid:valid根据控件的值是否为空.如果元素没有value属性(或者它有value=""),则控件的值最初为空,并且在输入任何字符(甚至是空格)时变为非空.

例:

<style>
#foo { background: yellow; }
#foo:valid { outline: solid blue 2px; }
#foo:invalid { outline: solid red 2px; }
</style>
<input id=foo required>
Run Code Online (Sandbox Code Playgroud)

伪类:valid:invalid仅在工作草案级CSS文档中定义,但支持在浏览器中相当普遍,除了在IE中,它与IE 10一起提供.

如果您想使"空"包含仅包含空格的值,则可以添加该属性pattern=.*\S.*.

(当前)没有用于直接检测输入控件是否具有非空值的CSS选择器,因此我们需要间接地执行它,如上所述.

通常,CSS选择器引用标记,或者在某些情况下,引用通过脚本(客户端JavaScript)设置的元素属性,而不是用户操作.例如,:empty匹配标记中包含空内容的元素; input在这个意义上,所有元素都是不可避免的空洞.选择器[value=""]测试元素是否具有value标记中的属性并将空字符串作为其值.而且:checked:indeterminate有类似的事情.它们不受实际用户输入的影响.

  • 这是纯粹的魔法!谢谢!最干净的解决方案,imho (13认同)
  • 当且仅当需要每个输入时,这是一个很好的解决方案 - 如果不是,您会遇到一个空的但有效的输入字段不受**无效样式**影响的情况.JS可能是此解决方案的赢家 (7认同)
  • 这很脏但非常聪明.不是问题的解决方案,但它肯定对我有用 (5认同)
  • 在`&lt;form&gt;`元素上添加了`novalidate`属性,这样就不用担心填充一次后字段为空时显示红色:`&lt;form ... novalidate&gt; &lt;input ... required /&gt; &lt;/form&gt;` (3认同)
  • 它是可能的....这里是一个小提琴...... https://jsfiddle.net/k1a5gfsa/1/ (2认同)
  • 从语义上讲,这是错误的。正如前面的评论中提到的,某些输入可能是可选的,并且“required”属性可以阻止表单提交。 (2认同)

ngr*_*man 178

您可以使用:placeholder-shown伪类.从技术上讲,需要占位符,但您可以使用空格.

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

input:placeholder-shown {
  border-color: red;
}
Run Code Online (Sandbox Code Playgroud)
<input placeholder="Text is required" />
<input placeholder=" " value="This one is valid" />
<input placeholder=" " />
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,IE或Firefox根本不支持此功能.资料来源:http://caniuse.com/#feat=css-placeholder-shown (8认同)
  • 另一个缺点是你似乎需要一个占位符.换句话说,即使没有值,`input:not(:placeholder-shown)`也总是匹配`<input />`. (5认同)
  • 对我而言,它适用于Chrome,Firefox和Safari.不在IE11中. (5认同)
  • 很棒的答案.浏览器支持很糟糕,但如果一个polyfill出现`:placeholder-shown`那么这应该成为公认的答案."required"方法没有考虑边缘情况.应该注意的是,您可以将空格传递给占位符,此方法仍然有效.荣誉. (2认同)
  • @redbmk 正如 corysimmons 提到的,应该注意的是,您可以将空格传递给占位符,并且此方法仍然有效。 (2认同)

Bro*_*ams 61

时尚不能这样做因为CSS无法做到这一点. CSS没有<input>值(伪)选择器.看到:

:empty选择仅指子节点,而不是输入值.
[value=""] 工作; 但仅限于初始状态.这是因为节点的value 属性(CSS看到的)与节点的value 属性(由用户或DOM javascript更改,并作为表单数据提交)不同.

除非你只关心初始状态,必须使用一个userscript或Greasemonkey的脚本. 幸运的是,这并不难.以下脚本适用于Chrome或安装了Greasemonkey或Scriptish的Firefox,或者支持用户脚本的任何浏览器(即大多数浏览器,IE除外).

这个jsBin页面上查看CSS限制以及javascript解决方案的演示.

// ==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";
}
Run Code Online (Sandbox Code Playgroud)

  • @MartinGottweis,`:valid` 选项需要重写页面——这是 OP 无法使用 Stylish 做的事情,并且其他答案都没有在浏览上下文中显示*。用户无法控制他正在访问的页面。 (2认同)

Tom*_* D. 27

<input onkeyup="this.setAttribute('value', this.value);" />
Run Code Online (Sandbox Code Playgroud)

input[value=""]
Run Code Online (Sandbox Code Playgroud)

将工作 :-)

编辑:http://jsfiddle.net/XwZR2/

  • 那是CSS吗?它看起来像HTML和Javascript(但我可能会弄错). (21认同)
  • `input [value]:not([value =""])` - 更好.谢谢大家.http://codepen.io/iegik/pen/ObZpqo (4认同)
  • @JánosWeisz不,不会.该脚本将在脚本可以操作该元素之前设置,并且它可以与addEventListener添加的处理程序一起使用. (2认同)
  • 显然,onkeyup 只处理键盘输入。但是不要忘记,您可以使用鼠标将文本粘贴到输入框中。试试看:将一些文本复制到剪贴板,然后右键单击输入并单击粘贴。观看 CSS 不工作。与使用鼠标将文本拖放到输入框中相同。 (2认同)

小智 26

您可以利用占位符并使用:

input:not(:placeholder-shown) {
  border: 1px solid red;
}
Run Code Online (Sandbox Code Playgroud)


wan*_*len 23

使用属性placeholder和伪类placeholder-shown是检测输入是否包含文本的正确方法。

例子:

<input type="email" placeholder=" " required>
<label>Email</label>
Run Code Online (Sandbox Code Playgroud)
input:focus ~ label,
input:not(:placeholder-shown) ~ label
{
  top : -4em
  left : -0.2em
  font-size : 0.9em
}
Run Code Online (Sandbox Code Playgroud)

  • 太棒了!`输入:不(:显示占位符)` (2认同)

Fáb*_* ZC 22

基本上每个人都在寻找的是:

减:

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;}
}
Run Code Online (Sandbox Code Playgroud)

纯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;}
Run Code Online (Sandbox Code Playgroud)

  • 很棒的答案.但是:占位符显示的伪类在IE或Edge中不起作用,因此它不是一个完整的解决方案.尽管如此,它还是很接近,这让我想要谋杀Edge而不支持它.IE我可以接受,但边缘?拜托微软! (5认同)
  • 如果您必须在HTML中添加"required",那么它不是纯粹的CSS解决方案 (2认同)

Ric*_*evi 10

您可以使用placeholder上面w / o required字段中所写的技巧。

问题required在于,当您编写某些内容然后将其删除时,作为HTML5规范的一部分,输入现在始终为红色-然后,您将需要如上所述的CSS来修复/覆盖它。

您可以简单地做不做的事情 required

<input type="text" placeholder="filter here" id="mytest" />
Run Code Online (Sandbox Code Playgroud)

的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;
}
Run Code Online (Sandbox Code Playgroud)

密码笔:https : //codepen.io/arlevi/pen/LBgXjZ


bar*_*sor 8

实际上有一种方法可以在没有 JavaScript 的情况下做到这一点。

如果将 an<input>required选择器设置为 true,则可以检查其中是否有带有 CSS:valid标记的文本。

参考:

MDN 文档
CSS 技巧

input {
  background: red;
}

input:valid {
  background: lightgreen;
}
Run Code Online (Sandbox Code Playgroud)
<input type="text" required>
Run Code Online (Sandbox Code Playgroud)


vbr*_*aun 6

input[type=text]根据输入是否具有通过设置占位符样式的文本,您可以设置不同的样式.这不是官方标准,但具有广泛的浏览器支持,但具有不同的前缀:

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;
}
Run Code Online (Sandbox Code Playgroud)

示例:http://fiddlesalad.com/scss/input-placeholder-css


Bre*_*ira 6

简单的CSS:

input[value]:not([value=""])
Run Code Online (Sandbox Code Playgroud)

如果输入已填满,此代码将应用给定的CSS。

  • 这仅适用于页面加载。不是动态键入值。 (5认同)

Pav*_*huk 5

使用JS和CSS:不是伪类

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

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

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

   
Run Code Online (Sandbox Code Playgroud)