Определить, есть ли во входных данных текст с помощью CSS на странице, которую я посещаю и не контролирую?

Есть ли способ определить, есть ли на входе текст через CSS? Я пробовал использовать псевдокласс :empty, и я пробовал использовать [value=""], ни один из них не работал. Кажется, я не могу найти единственного решения для этого.

Я полагаю, что это должно быть возможно, учитывая, что у нас есть псевдоклассы для :checked и :indeterminate, которые в некотором роде похожи друг на друга.

Обратите внимание: Я делаю это для «стильного» стиля, в котором не может использоваться JavaScript.

Также обратите внимание, что стильный используется на стороне клиента на страницах, которые пользователь не контролирует.


person JacobTheDev    schedule 06.06.2013    source источник
comment
Я не уверен, как это сделать с помощью CSS (который в любом случае не обновляется на лету). Однако это легко сделать с помощью JavaScript.   -  person ralph.m    schedule 06.06.2013
comment
Я не думаю, что могу использовать JavaScript. Я работаю над стильным стилем. Совершенно уверен, что это должно быть сделано полностью с помощью CSS. Если он не обновляется, когда пользователь вводит текст, я думаю, это пустая трата времени. Не думал об этом. Хм. По крайней мере, это не критично для стиля, это просто тонкость, которую я надеялся добавить.   -  person JacobTheDev    schedule 06.06.2013
comment
возможный дубликат : not (: empty) CSS-селектор не работает?   -  person Danny Beckett    schedule 06.06.2013


Ответы (17)


Stylish не может этого сделать, потому что CSS не может этого сделать. В CSS нет (псевдо) селекторов для значений <input>. См.:

Селектор :empty относится только к дочерним узлам, а не к входным значениям.
[value=""] работает; но только для начального состояния. Это связано с тем, что value атрибут узла (который видит CSS) не совпадает с value свойством узла (изменено пользователем или Javascript DOM и отправлено как данные формы ).

Если вас не волнует только начальное состояние, вы должны использовать пользовательский скрипт или скрипт Greasemonkey. К счастью, это несложно. Следующий скрипт будет работать в Chrome или Firefox с установленным Greasemonkey или Scriptish, или в любом браузере, который поддерживает пользовательские скрипты (то есть в большинстве браузеров, кроме IE).

См. Демонстрацию ограничений CSS и решения javascript на этой странице jsBin. .

// ==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";
}
person Brock Adams    schedule 06.06.2013
comment
Я займусь этим юзерскриптом. Спасибо. - person JacobTheDev; 06.06.2013
comment
@MartinGottweis, а не в случае с OP. Это [стильный] вопрос. - person Brock Adams; 20.05.2016
comment
@BrockAdams, op говорит, что не может использовать javascript, поэтому вариант: valid - лучший вариант. Я что-то упускаю? - person Martin Gottweis; 20.05.2016
comment
@MartinGottweis, опция :valid требует переписывания страницы - чего OP не может сделать со Stylish, и что ни один из других ответов не показывает вообще в контексте просмотра. Пользователь не контролирует страницу, которую он посещает. - person Brock Adams; 20.05.2016

Это возможно, с обычными оговорками 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 - похожие вещи. На них не влияет фактический ввод пользователя.

person Jukka K. Korpela    schedule 06.06.2013
comment
Это стильный вопрос - это означает, что OP не может контролировать или изменять целевую страницу. Например, он не может добавить атрибут required. Он видит только страницу на стороне клиента. - person Brock Adams; 06.06.2013
comment
Это отличное решение, если и только если требуется каждый ввод - в противном случае вы столкнетесь с ситуацией, когда у вас есть пустое, но действительное поле ввода, на которое не влияет недопустимый стиль. JS, вероятно, победитель этого решения - person AdamSchuld; 04.04.2015
comment
Отличное решение для простых случаев использования! Спасибо. - person Luuuud; 11.05.2015
comment
это грязно, но замечательно умно. Не решение вопроса, но это помогло мне - person Jan; 07.07.2015
comment
Грязный раствор. Обратите внимание, что это может вызвать проблемы с автозаполнением в Chrome, если вы попытаетесь добавить логику отображения меток на основе этого ИЛИ, если ввод на самом деле не требуется и форма имеет проверку на основе этого - person Artjom Kurapov; 12.12.2016
comment
Семантически это неправильно. Как упоминалось в предыдущих комментариях, некоторые входные данные могут быть необязательными, а атрибут required может препятствовать отправке формы. - person zhenming; 10.04.2018
comment
Добавлен атрибут novalidate для <form>element, чтобы не беспокоиться о красном отображении, когда поле пусто после однократного заполнения: <form ... novalidate> <input ... required /> </form> - person Alcalyn; 28.05.2019
comment
Замечательное решение! Отличное мышление. Спасибо - person Dil A; 12.03.2020
comment
Это работает, только если вы стилизуете сам ввод. Попытка стилизовать текст метки ввода не будет работать, поскольку селектор css будет ссылаться на ввод и применять стиль к нему вместо применения его к метке, которая будет находиться в другом пути селектора css. - person johntrepreneur; 03.06.2020
comment
: invalid или: valid не работают для текстового поля. Я пытаюсь textarea:valid, но это просто не работает. Есть ли другой подход для текстового поля? - person A.Raza; 19.11.2020
comment
A.Raza, я только что протестировал это для textarea, в Chrome, Edge и Android, и он работал как для input. Возможно, вы пробовали использовать textarea с некоторым непустым исходным (по умолчанию) содержимым? Вся идея состоит в том, чтобы проверить, имеет ли элемент управления значение или нет, и изначально установленное значение здесь неотличимо от значения, введенного пользователем. - person Jukka K. Korpela; 20.11.2020

Вы можете использовать псевдокласс :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=" " />

person ngryman    schedule 09.02.2016
comment
К сожалению, это не поддерживается IE или Firefox. Источник: caniuse.com/#feat=css-placeholder-shown - person Sean Dawson; 23.02.2016
comment
Отличный ответ. Поддержка браузером - отстой, но если для :placeholder-shown появляется полифил, то это должно стать принятым ответом. Метод required не учитывает второстепенные случаи. Следует отметить, что вы можете передать пробел в заполнитель, и этот метод по-прежнему будет работать. Престижность. - person corysimmons; 26.02.2016
comment
Другой недостаток заключается в том, что вам действительно нужен заполнитель. Другими словами, input:not(:placeholder-shown) всегда будет соответствовать <input/>, даже если нет значения. - person redbmk; 11.06.2016
comment
Для меня это работает в Chrome, Firefox и Safari. Не в IE11. - person J0ANMM; 03.03.2017
comment
Лучшее решение на данный момент. - person Vladimir Jovanović; 11.04.2017
comment
@redbmk, как упоминал corysimmons. Следует отметить, что вы можете передать пробел в заполнитель, и этот метод все равно будет работать. - person Naeem Baghi; 05.02.2018
comment
По состоянию на февраль 2018 года единственным крупным браузером, не поддерживающим его, является Edge. Даже мобильные устройства теперь поддерживают это решение. - person Claudio Holanda; 23.02.2018
comment
Я бы сказал, что это ответ, и напишу резервный CSS для Edge. Атрибут required с input:valid для Edge. (если вам это нужно для работы с необязательными входными данными в Edge, вам понадобится JS, чтобы получить это там) - person Ben Racicot; 08.03.2019
comment
Это работает, только если вы стилизуете сам ввод. Попытка стилизовать текст метки ввода не будет работать, поскольку селектор css будет ссылаться на ввод и применять стиль к нему вместо применения его к метке, которая будет находиться в другом пути селектора css. - person johntrepreneur; 03.06.2020
comment
Для чего это стоит: IE10 и IE11 вместо этого поддерживают :-ms-input-placeholder. Все новейшие браузеры (включая «новый Edge» с 2020 года) поддерживают :placeholder-shown. (источник: caniuse) - person Sygmoral; 31.01.2021

По сути, все ищут:

МЕНЬШЕ:

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;}
person Fábio ZC    schedule 03.05.2017
comment
Вы явно только что дали использовать рабочее решение и получили 0 голосов "за"? WaT? - person ProNOOB; 30.07.2017
comment
Отличный ответ. Псевдокласс: placeholder-shown не работает в IE или Edge, поэтому это не полное решение. Однако это чертовски близко, и мне хочется убить Эджа за то, что он не поддержал его. IE я мог бы согласиться, но Edge? Да ладно, Microsoft! - person Aaron Martin-Colby; 07.11.2017
comment
Это не чистое решение css, если вам нужно добавить необходимое в свой html - person user1566694; 09.11.2017
comment
Для IE10 и IE11 добавьте вместо этого :-ms-input-placeholder. Edge поддерживает :placeholder-shown с 2019 года. - person Sygmoral; 31.01.2021

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

а также

input[value=""]

буду работать :-)

изменить: http://jsfiddle.net/XwZR2/

person Tom D.    schedule 17.06.2014
comment
Это CSS? Похоже на HTML и Javascript (но я могу ошибаться). - person jww; 17.06.2014
comment
Брук Адамс писал: [value =] действительно работает; но только для начального состояния. Это связано с тем, что атрибут значения узла (который видит CSS) не совпадает со свойством значения узла (изменено пользователем или Javascript DOM и отправлено как данные формы). - ›Магия заключается в обновлении атрибута значения при изменениях: jsfiddle.net/XwZR2 - person Tom D.; 17.06.2014
comment
Я думаю, что это одно из очень немногих применений хорошо размещенной встроенной обработки событий, если вы не хотите пропускать логику представления в свои файлы JavaScript, но не возражаете немного загромождать свой HTML . Однако имейте в виду, что это переопределит все другие обработчики событий, которые вы ранее прикрепили к этому элементу для события onkeyup. - person John Weisz; 18.02.2015
comment
@ JánosWeisz, нет. Этот обработчик будет установлен до того, как скрипт сможет манипулировать этим элементом, и он сможет работать вместе с обработчиком, добавленным с помощью addEventListener. - person Dinoboff; 28.03.2015
comment
Очевидно, что onkeyup заботится только о вводе с клавиатуры. Однако не забывайте, что вы можете вставлять текст в поле ввода с помощью мыши. Попробуйте: скопируйте текст в буфер обмена, затем щелкните правой кнопкой мыши вход и выберите «Вставить». Смотрите, как CSS НЕ работает. То же самое с перетаскиванием текста в поле ввода с помощью мыши. - person beluga; 25.11.2015
comment
input[value]:not([value=""]) - лучше. Спасибо всем. codepen.io/iegik/pen/ObZpqo - person iegik; 07.12.2016
comment
Очень хорошая точка от белуги. Я изо всех сил пытался понять, почему jsfiddle работает, а для меня это не так, пока я не прочитал его комментарий и не понял, что у меня есть датапикер и, следовательно, нет ввода с клавиатуры. - person J0ANMM; 03.03.2017
comment
Я бы пошел на событие onchange, но однострочный подход javascript на самом деле очень хороший способ. - person dkellner; 19.11.2019

Вы можете использовать трюк 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

person Ricky Levi    schedule 08.08.2018
comment
Этот подход идеально подходил для моего случая использования. У меня были фильтры поиска, у которых все равно были заполнители, и я хотел, чтобы граница поля ввода выделялась при наличии значения. - person Stephen Tuttlebee; 28.11.2019
comment
@barhatsor мм, я не помню, но в Интернете и языках все движется и меняется очень быстро. но тот факт, что люди все еще голосуют за этот ответ - я думаю, они, вероятно, будут вести себя так же, как и я (он становится красным, когда вы что-то пишете, а затем удаляете - вот почему я добавил свой ответ поверх официального ответа). Я видел ваш ответ ниже - автор этого сообщения, однако, не хотел required - он просто хотел знать, есть ли что-нибудь внутри поля input, добавление required включает проверку формы - и это это то, чего я лично не хотел. - person Ricky Levi; 11.07.2021

Вы можете воспользоваться заполнителем и использовать:

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

Простой css:

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

Этот код будет применять данный CSS при загрузке страницы, если ввод заполнен.

person Breno Teixeira    schedule 15.03.2018
comment
Это работает только при загрузке страницы. Не динамический ввод значения. - person Ben Racicot; 08.03.2019
comment
В этом ответе следует указать проблему загрузки страницы. - person Bryce Snyder; 22.06.2020

На самом деле есть способ сделать это без JavaScript.

Если вы установите для селектора <input> required значение true, вы можете проверить, есть ли в нем текст, с помощью тега CSS :valid.

Ссылки:

Документы MDN
Уловки CSS

input {
  background: red;
}

input:valid {
  background: lightgreen;
}
<input type="text" required>

person barhatsor    schedule 04.09.2020
comment
Здесь описано: stackoverflow.com/questions/16952526/ - person Calculuswhiz; 04.09.2020
comment
Я знаю, что уже поздно, но ... что, если вход имеет тип text, поэтому поле никогда не получит зеленый фон, если только он не похож на [email protected] - person Pixie Dust; 09.07.2021
comment
Чтобы проверить адрес электронной почты, замените type="text" на type="email". - person barhatsor; 10.07.2021

Вы можете стилизовать 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

person vbraun    schedule 16.02.2015
comment
К вашему сведению, это надежно форматирует заполнитель, но только сам заполнитель. Это дает вам иллюзию изменения цвета текста, но это уже так, только с серым и черным по умолчанию. - person John Weisz; 18.02.2015
comment
Весь CSS - дешевая иллюзия, вы меняете только внешний вид, не затрагивая фактическое содержимое :-) - person vbraun; 19.02.2015
comment
Это именно то, что мне нужно. Мне требовался ввод для изменения стилей, если в нем был текст, поскольку дизайн заполнителя отличается от стиля ввода. Идеально! - person Christopher Marshall; 18.03.2015
comment
Это работает для фона, но не для границ. Однако я не стал слишком углубляться в попытки изменить границу. - person majinnaibu; 02.06.2015

Использование 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="" />

   

person Pavlo Kozachuk    schedule 27.10.2016

действительный селектор сделает свое дело.

<input type="text" class="myText" required="required" />

.myText {
    //default style of input
}
.myText:valid {
    //style when input has text
}
person Niels Steenbeek    schedule 26.09.2016

Простой трюк с 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;
    }
person Bren1818    schedule 06.05.2014

сделайте это в части HTML следующим образом:

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

Обязательный параметр потребует наличия текста в поле ввода, чтобы быть действительным.

person Xedret    schedule 06.06.2013
comment
Это не помогает определить, есть ли во вводе текст с помощью CSS, о чем был вопрос. - person Jukka K. Korpela; 06.06.2013
comment
Извините, это действительно помогает ... Это позволяет использовать псевдоклассы, как описано в моем ответе. - person Jukka K. Korpela; 06.06.2013
comment
Это стильный вопрос - это означает, что OP не может контролировать или изменять целевую страницу. Он видит только страницу на стороне клиента. - person Brock Adams; 06.06.2013
comment
Это было очень полезно, вот пример того, о чем говорит Xedret: codepen.io/tolmark12/pen/LsBvf - person tolmark; 14.02.2014
comment
****** ‹требуется ввод› && ввод: действителен {...} ****** - person FremyCompany; 17.03.2015

Использование атрибута placeholder и псевдокласса placeholder-shown - правильный способ определить, есть ли на вводе текст.

Пример:

<input type="email" placeholder=" " required>
<label>Email</label>
input:focus ~ label,
input:not(:placeholder-shown) ~ label
{
  top : -4em
  left : -0.2em
  font-size : 0.9em
}
person Kos    schedule 17.07.2021

Да! вы можете сделать это с помощью простого базового атрибута с селектором значений.

Используйте селектор атрибутов с пустым значением и примените свойства input[value='']

input[value=''] {
    background: red;
}
person Hidayt Rahman    schedule 31.07.2018

Это невозможно с css. Чтобы реализовать это, вам нужно будет использовать JavaScript (например, $("#input").val() == "").

person Logan    schedule 06.06.2013
comment
Я знаю, как это сделать, мне нужно сделать это с помощью CSS. Пожалуйста, прочтите комментарии к исходному сообщению. Насколько мне известно, я создаю стильный стиль, в котором не может использоваться JavaScript. - person JacobTheDev; 06.06.2013