내가 방문한 페이지에서 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.