내가 방문한 페이지에서 CSS를 사용하여 입력 내용에 텍스트가 있는지 감지합니다.


187

CSS를 통해 입력에 텍스트가 있는지 여부를 감지하는 방법이 있습니까? 나는 :empty의사 클래스를 사용해 보았지만 [value=""]어느 것도 효과가 없었습니다. 이것에 대한 단일 해결책을 찾지 못하는 것 같습니다.

에 대한 의사 클래스가 :checked있으며 :indeterminate, 둘 다 비슷한 종류의 것을 고려하면 이것이 가능해야한다고 생각합니다 .

참고 : JavaScript를 사용할 수없는 "스타일리쉬 한 스타일"을 위해이 작업을 수행하고 있습니다.

또한 Stylish는 사용자가 제어하지 않는 페이지에서 클라이언트 쪽에서 사용됩니다.


CSS로 작업을 수행하는 방법을 잘 모르겠습니다 (어쨌든 업데이트되지 않음). 그러나 JavaScript를 사용하면 쉽습니다.
ralph.m

JavaScript를 사용할 수 없다고 생각합니다. "스타일리쉬 한"스타일로 작업하고 있습니다. CSS로 완전히 수행해야합니다. 사용자가 텍스트를 입력해도 업데이트되지 않으면 시간 낭비라고 생각합니다. 그것에 대해 생각하지 않았다. 흠. 적어도 이것은 스타일에 중요하지 않습니다. 추가하고 싶었던 것입니다.
JacobTheDev

답변:


66

CSS는 이것을 할 수 없기 때문에 스타일리쉬 는 이것을 할 수 없습니다. CSS에는 <input>값에 대한 (의사) 선택기가 없습니다 . 보다:

:empty선택은 자식 노드가 아닌 입력 값을 의미한다.
[value=""] 작동 합니다; 그러나 초기 상태에 대해서만 . 이 노드의 때문입니다 value 속성 (CSS가 보는 것을), 노드의 동일하지 않습니다 value 재산 (사용자 또는 DOM의 자바 스크립트에 의해 변경, 양식 데이터로 제출).

초기 상태 만 신경 쓰지 않으면 사용자 스크립트 또는 Greasemonkey 스크립트 사용해야합니다 . 다행히도 이것은 어렵지 않습니다. 다음 스크립트는 Chrome, Greasemonkey 또는 Scriptish가 설치된 Firefox 또는 사용자 스크립트를 지원하는 모든 브라우저 (IE를 제외한 대부분의 브라우저)에서 작동합니다.

이 jsBin 페이지 에서 CSS의 한계와 자바 스크립트 솔루션의 데모를보십시오 .

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

@ MartinGottweis, OP의 경우에는 그렇지 않습니다. 이것은 [스타일리쉬 한] 질문입니다.
Brock Adams

1
@BrockAdams, op는 자바 스크립트를 사용할 수 없으므로 : valid 옵션을 사용하는 방법입니다. 내가 뭔가를 놓치고 있습니까?
Martin Gottweis

1
@MartinGottweis의 경우 :valid옵션을 사용하려면 페이지를 다시 작성해야합니다. 이는 OP에서 스타일러스로 수행 할 수없고 탐색 컨텍스트 에서 다른 답변 은 전혀 표시하지 않습니다 . 사용자는 방문한 페이지를 제어 할 수 없습니다.
Brock Adams

265

일반적인 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
이 방법은 모든 입력이 필요한 경우에만 유효합니다. 그렇지 않은 경우 유효 하지 않은 style에 영향을받지 않은 비어 있지만 유효한 입력 필드가있는 상황에 처하게 됩니다. JS가 아마도이 솔루션의 승자 일 것입니다
AdamSchuld

7
이것은 더럽지 만 놀랍도록 영리합니다. 이 질문에 대한 해결책은 아니지만 확실히 나를 위해 속임수를
Jan

1
더러운 용액. 이에 따라 라벨 표시 로직을 추가하려고하면이 크롬에서 자동 완성에 문제가 발생할 수 있음을 참고이에 입력이 실제로 필요하지 않으며 양식 유효성 검사를 기반으로 한 경우
Artjom Kurapov

1
의미 상 이것은 잘못된 것입니다. 이전 의견에서 언급했듯이 일부 입력은 선택 사항 일 수 있으며 required특성으로 인해 양식 제출이 금지 될 수 있습니다.
zhenming

1
한 번 채워진 후 필드가 비어있을 때 빨간색 표시에 대해 걱정하지 않도록 요소에 novalidate속성을 추가 <form>했습니다.<form ... novalidate> <input ... required /> </form>
Alcalyn

228

: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

5
이것의 다른 단점은 실제로 자리 표시자가 필요하다는 것입니다. 즉, 값이 없더라도 input:not(:placeholder-shown)항상 일치 <input/>합니다.
redbmk

5
나를 위해 그것은 Chrome, Firefox 및 Safari에서 작동합니다. IE11에는 없습니다.
J0ANMM

1
@ redbmk는 corysimmons가 언급했듯이 자리 표시 자에 공백을 전달할 수 있으며이 방법은 여전히 ​​작동합니다.
Naeem Baghi

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

input[value=""]

작동합니다 :-)

편집 : http://jsfiddle.net/XwZR2/


24
CSS인가요? HTML 및 Javascript처럼 보입니다 (그러나 잘못 생각할 수 있습니다).
jww

Brook Adams는 다음과 같이 썼습니다 : [value = ""]는 작동합니다; 그러나 초기 상태에 대해서만. 이는 CSS에 표시되는 노드의 값 속성이 노드의 값 속성 (사용자 또는 DOM Javascript에 의해 변경되고 양식 데이터로 제출 됨)과 동일하지 않기 때문입니다. -> 마술은 변경시 value 속성을 업데이트하는 것입니다 : jsfiddle.net/XwZR2
Tom D.

2
@ JánosWeisz 아니에요. 해당 핸들러는 스크립트가 해당 요소를 조작하기 전에 설정되며 addEventListener로 추가 된 핸들러와 함께 작동 할 수 있습니다.
Dinoboff

1
분명히 onkeyup은 키보드 입력 만 처리합니다. 그러나 마우스를 사용하여 텍스트를 입력 상자에 붙여 넣을 수 있습니다. 사용해보십시오 : 텍스트를 클립 보드에 복사 한 다음 입력을 마우스 오른쪽 버튼으로 클릭하고 붙여 넣기를 클릭하십시오. CSS가 작동하지 않는 것을보십시오. 마우스로 입력 상자에 텍스트를 끌어다 놓는 것과 동일합니다.
벨루가

4
input[value]:not([value=""])- 더 나은. 모두 감사합니다. codepen.io/iegik/pen/ObZpqo
iegik

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 pseudo-class는 IE 또는 Edge에서 작동하지 않으므로 완벽한 솔루션이 아닙니다. 그래도 가까이 다가 갔고 Edge를 지원하지 않기 때문에 Edge를 살해하고 싶습니다. IE는 받아 들일 수 있지만 Edge? 마이크로 소프트!
Aaron Martin-Colby

2
HTML에 "필수"를 추가해야한다면 순수한 CSS 솔루션이 아닙니다.
user1566694

친절한 선생님, 감사합니다. 진심으로 이것이 대부분의 사람들이 정말로 원하는 것이므로 이것이 높아지기를 바랍니다.
sivi911

19

필드없이 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
이 접근 방식은 사용 사례에 완벽하게 맞았습니다. 어쨌든 자리 표시자가있는 검색 필터가 있었고 값이있을 때 입력 상자의 테두리를 강조하고 싶었습니다.
Stephen Tuttlebee

9

간단한 CSS :

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

이 코드는 입력이 채워지면 페이지로드에 주어진 CSS를 적용합니다.


9
이것은 페이지로드에서만 작동합니다. 동적으로 값을 입력하지 않습니다.
Ben Racicot

이 답변에 대해 페이지로드 문제를 명시해야합니다.
브라이스 스나이더

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

CSS는 모두 싸구려이며 실제 내용에 영향을주지 않고 외관 만 변경합니다. :-)
vbraun

이것이 바로 내가 필요한 것입니다. 자리 표시 자의 디자인이 입력 스타일과 다르기 때문에 텍스트가있는 경우 입력을 변경해야했습니다. 완전한!
Christopher Marshall

이것은 배경에는 적용되지만 테두리에는 적용되지 않습니다. 나는 국경을 바꾸려고 노력하는 데 너무 깊이 파고 들지 않았다.
majinnaibu 2016 년

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 type="text" class="myText" required="required" />

.myText {
    //default style of input
}
.myText:valid {
    //style when input has text
}

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

죄송합니다, 실제로 도움이됩니다 ... 내 대답에 설명 된 것처럼 의사 클래스를 사용할 수 있습니다.
Jukka K. Korpela

1
이것은 세련된 질문입니다. 즉, OP는 대상 페이지를 제어하거나 변경할 수 없습니다. 그는 클라이언트 쪽의 페이지 만 볼 수 있습니다.
Brock Adams

3
이것은 Xedret이 말하는 것에 대한 예입니다. codepen.io/tolmark12/pen/LsBvf
tolmark

****** <필수 입력> && 입력 : 유효 {...} ******
FremyCompany

0

예! 값 선택기를 사용하여 간단한 기본 속성으로 할 수 있습니다.

값이 공백 인 속성 선택기를 사용하고 특성을 적용하십시오. input[value='']

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

-6

CSS에서는 불가능합니다. 이를 구현하려면 JavaScript를 사용해야합니다 (예 :) $("#input").val() == "".


2
나는 그것을하는 방법을 알고 있습니다 .CSS로해야합니다. 원래 게시물에 대한 의견을 읽으십시오. JavaScript를 사용할 수없는 "스타일리시 한"스타일을 알고 있습니다.
JacobTheDev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.