使用CSS检测输入中是否包含文本-我正在访问的页面上不受控制吗?


184

是否可以通过CSS检测输入中是否包含文本?我试过使用:empty伪类,并且试过使用[value=""],这两种都不起作用。我似乎找不到单个解决方案。

考虑到我们有:checked和和的伪类,我想这一定是有可能的,:indeterminate两者都是相似的。

请注意:我这样做是为了“时尚”风格,无法利用JavaScript。

另请注意,在用户无法控制的页面上,客户端使用了时尚样式。


我不确定使用CSS的方法(无论如何,它不会即时更新)。不过,使用JavaScript很容易。
ralph.m

我认为我无法使用JavaScript。我正在研究“时尚”风格。可以肯定,它必须完全使用CSS完成。如果用户输入文本时它不会更新,那我认为那是在浪费时间。没想到。嗯 至少这对于样式不是很关键,这只是我希望添加的一个优点。
JacobTheDev 2013年

Answers:


64

时尚无法做到这一点,因为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";
}

我将研究该用户脚本内容。谢谢。
JacobTheDev 2013年

@MartinGottweis,在OP的情况下不是这样。这是一个[时尚的]问题。
布罗克·亚当斯

1
@ BrockAdams,op表示它不能使用javascript,因此:valid选项是一种解决方法。我想念什么吗?
Martin Gottweis '16

1
@MartinGottweis,该:valid选项需要重写页面-这是后话了OP不能与时尚做,并且没有其他的答案显示在所有的浏览器上下文。用户无法控制他正在访问的页面。
布罗克·亚当斯

263

通常的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>

伪归类:valid,并:invalid在工作层面草案CSS文件只被定义,但支持在浏览器中相当普遍,但在IE中,才出现了IE 10。

如果要使“空”包含仅包含空格的值,则可以添加属性pattern=.*\S.*

(当前)没有CSS选择器可直接检测输入控件是否具有非空值,因此如上所述,我们需要间接进行选择。

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


7
当且仅当需要每个输入时,这才是一个很好的解决方案。否则,您将遇到一个空而有效的输入字段,不受无效样式影响的情况。JS可能是该解决方案的赢家
AdamSchuld 2015年

6
这很脏但是很聪明。这个问题不是解决方案,但确实可以解决问题
1

1
脏溶液。请注意,如果您尝试基于此添加标签显示逻辑,或者如果实际上不需要输入并且表单具有基于此的验证,则这可能会导致Chrome自动完成问题
Artjom Kurapov 2016年

1
从语义上讲这是错误的。如先前的评论中所述,某些输入可能是可选的,并且该required属性会阻止表单提交。
zhenming '18

1
novalidate<form>元素上添加了属性,以便在字段一次填充后为空时不用担心红色显示:<form ... novalidate> <input ... required /> </form>
Alcalyn

226

您可以使用:placeholder-shown伪类。从技术上讲,占位符是必需的,但是您可以使用空格代替。

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
不幸的是,IE或Firefox根本不支持此功能。来源:caniuse.com/#feat=css-placeholder-shown
Sean Dawson

2
很棒的答案。浏览器支持很糟糕,但是如果出现了polyfill,:placeholder-shown那么这应该成为公认的答案。该required方法未考虑边缘情况。请注意,您可以将空间传递给占位符,并且此方法仍然可以使用。荣誉
corysimmons '16

5
另一个缺点是您似乎实际上需要有一个占位符。换句话说,即使没有值也input:not(:placeholder-shown)将始终匹配<input/>
redbmk

5
对我来说,它可以在Chrome,Firefox和Safari中使用。不在IE11中。
J0ANMM'3

1
@redbmk(如corysimmons所述),应注意,您可以将空格传递给占位符,此方法仍然有效。
Naeem Baghi,

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

input[value=""]

将工作 :-)

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


23
那是CSS吗?它看起来像HTML和Javascript(但我可能会误会)。
jww

布鲁克·亚当斯(Brook Adams)写道:[value =“”]确实有效;但仅适用于初始状态。这是因为节点的value属性(CSS可以看到)与节点的value属性不同(由用户或DOM JavaScript更改,并作为表单数据提交)。->魔术是在更改时更新value属性:jsfiddle.net/XwZR2
Tom D.

2
@JánosWeisz不,不会。该处理程序将在脚本可以操作该元素之前进行设置,并且可以与通过addEventListener添加的处理程序一起使用。
Dinoboff

1
显然,onkeyup仅负责键盘输入。但是,请不要忘记,您可以使用鼠标将文本粘贴到输入框中。尝试一下:将一些文本复制到剪贴板中,然后右键单击输入,然后单击“粘贴”。观看CSS不起作用。用鼠标将文本拖放到输入框中也一样。
beluga 2015年

4
input[value]:not([value=""])- 更好。谢谢大家。codepen.io/iegik/pen/ObZpqo
iegik 2016年

29

基本上每个人都在寻找:

减:

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

纯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
您显然只是使用了有效的解决方案,而您有0票赞成吗?
ProNOOB

5
很棒的答案。:placeholder-shown伪类在IE或Edge中不起作用,因此它不是一个完整的解决方案。但是,它太近了,这让我想杀了Edge不支持它。IE我可以接受,但是Edge?来吧微软!
亚伦·马丁·科尔比

2
如果您必须在HTML中添加“ required”,这不是纯CSS解决方案
user1566694

谢谢你,先生,我衷心希望这会有所提高,因为我认为这是大多数人真正想要的。
sivi911 '18

18

您可以使用placeholder上面没有写的技巧required字段中。

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

您可以简单地做不做的事情 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;
}

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


1
这种方法非常适合我的用例。我的搜索过滤器无论如何都具有占位符,并且我希望在出现值时突出显示输入框的边框。
史蒂芬·塔特比


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

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


仅供参考,这会可靠地格式化占位符,但只会格式化占位符本身。这给您一种改变文本颜色的错觉,但是事实已经如此,默认情况下只有灰色和黑色。
John Weisz 2015年

所有CSS都是一种廉价的幻觉,您只需更改外观而不会影响实际内容:-)
vbraun

这正是我所需要的。如果占位符的设计与输入样式不同,则我需要输入更改文本的样式。完善!
Christopher Marshall

这适用于背景,但不适用于边框。不过,我并没有深入尝试更改边界。
majinnaibu

5

使用JS和CSS:不是伪类

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

   



3

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

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

1

使用jQuery和CSS的简单技巧,如下所示:

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部分执行以下操作:

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

必需的参数将要求它在输入字段中具有文本才能生效。


这就是问题所在,这无助于CSS检测输入中是否包含文本。
Jukka K. Korpela 2013年

抱歉,它实际上有帮助...可以使用伪类,如我的回答中所述。
Jukka K. Korpela

1
这是一个时髦的问题-这意味着OP无法控制或更改目标页面。他只会看到客户端页面。
Brock Adams

3
这非常有用,这是Xedret所谈论的示例:codepen.io/tolmark12/pen/LsBvf
tolmark 2014年

****** <需要输入的信息> &&输入:有效的{...} ******
FremyCompany 2015年

0

是! 您可以使用带有值选择器的简单基本属性来完成此操作。

将属性选择器与空白值一起使用并应用属性 input[value='']

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

-6

CSS无法做到这一点。要实现这一点,您将必须使用JavaScript(例如$("#input").val() == "")。


2
我知道该怎么做,我需要使用CSS来做。请阅读原始帖子上的评论。据我所知,我正在构建一种无法利用JavaScript的“时尚”风格。
JacobTheDev 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.