CSS를 사용하여 빈 입력 상자 일치


141

빈 입력 상자에 스타일을 어떻게 적용합니까? 사용자가 입력 필드에 무언가를 입력하면 스타일이 더 이상 적용되지 않습니다. CSS에서 가능합니까? 나는 이것을 시도했다 :

input[value=""]

답변:


159

필드 만 있으면 required갈 수 있습니다input:valid

#foo-thing:valid + .msg { visibility: visible!important; }      
 <input type="text" id="foo-thing" required="required">
 <span class="msg" style="visibility: hidden;">Yay not empty</span>

jsFiddle에서 라이브 보기

또는 #foo-thing:invalid(@SamGoody의 신용)을 사용하여 무효화



6
나는 같은 것을 원하지만 내 분야는 필요하지 않습니다. 그렇게 할 방법이 있습니까?
Zahidul 이슬람 루헬

1
훌륭합니다 :)
kriskodzi

@ZahidulIslamRuhel 물론이 답변은 최고가 아니어야합니다. 아래의 답변을 참조하십시오 stackoverflow.com/a/35593489/11293716
sijanec

150

최신 브라우저에서는 :placeholder-shown빈 입력을 타겟팅하는 데 사용할 수 있습니다 (와 혼동하지 말 것 ::placeholder).

input:placeholder-shown {
    border: 1px solid red; /* Red border only if the input is empty */
}

추가 정보 및 브라우저 지원 : https://css-tricks.com/almanac/selectors/p/placeholder-shown/


4
그거 좋네! 매우 유용합니다 :)
깨기

1
@TricksfortheWeb 입력 태그에 자리 표시 자 속성 (값 포함)이 있어야하는 것 같습니다. Chrome에서 테스트되었습니다. 모든 브라우저에 해당되는지 확실하지 않습니다.
Berend

9
자리 표시 자 속성을 설정해야합니다. 어쨌든 자리 표시 자 속성을 공백으로 설정할 수 있습니다.
Barcelonczyk

2
@Amanpreet caniuse.com/#search=placeholder 에 따르면 IE 11 (또는 Edge)에서는 작동하지 않습니다.
팀 말론

4
Microsoft 브라우저에서 전혀 지원되지 않음 : caniuse.com/#feat=css-placeholder-shown
Lounge9

44

이 작업을 수행하는 CSS에는 선택기가 없습니다. 속성 선택기는 계산 된 값이 아닌 속성 값과 일치합니다.

JavaScript를 사용해야합니다.


3
나중에이 답변을 찾는 사람은 Quentin이 계산 된 값과 관련이 있지만 여기에 사용할 수 있고 합리적인 지원을하는 : empty 선택기가 있습니다 (IE8 이상을 제외한 모든 브라우저 : w3schools.com/cssref/sel_empty.asp
Cohen

35
:empty단지 개폐 태그 사이에서 비어 항상 빌 때 하나의 태그 요소가 요소를 의미 빈 요소의 선택에만 작동 는 제외 입력 요소에 이용 될 수 없도록,textarea
am05mhz

7
사실이 아니다. 아래의 lukmo의 답변을 참조하십시오. 필수 sttribute와 : valid 또는 : invalid 의사 선택기를 결합하면이 작업을 수행 할 수 있습니다.
voidstate

2
이것은 질문을받을 당시의 정답이었습니다. 필수 속성은 2011 년 Chrome 및 Firefox에서만 사용할 수 있었으며이 답변은 2010 년 이후입니다. 그러나 시간이 변경되어 더 이상 "최상의"답변이 아니므로 승인 된 것으로 표시하지 않았습니다.
Sjoerd

18

필드 값을 업데이트해도 DOM의 값 속성이 업데이트되지 않으므로 실제로 비어 있지 않은 경우에도 선택기가 항상 필드와 일치합니다.

대신 invalid의사 클래스 를 사용하여 원하는 것을 달성하십시오.

input:required {
  border: 1px solid green;
}
input:required:invalid {
  border: 1px solid red;
}
<input required type="text" value="">

<input required type="text" value="Value">


15

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

와 일하다:

<input type="text" />
<input type="text" value="" />

그러나 누군가가 타이핑을 시작하자마자 스타일은 바뀌지 않을 것입니다 (JS가 필요합니다).


1
필드 편집 후 value 속성이 DOM에서 변경되지 않으므로 신뢰할 수 없습니다. 그러나, 당신이 이것에 신경 쓰지 않으면 좋은 트릭-최신 Safari, Chrome, FF 및 IE에서 작동합니다 ...
Dunc

9
전자와 일치시키기 위해을 사용할 수 있습니다 input[value=""], input:not([value]).
Schism

10

지원 기존 브라우저가 필요하지 않은 경우의 조합을 사용할 수 있습니다 required, valid하고 invalid.

이 사용에 대한 좋은 점은있다 validinvalid의사 요소는 입력 필드의 type 속성을 잘 작동합니다. 예를 들면 다음과 같습니다.

input:invalid, textarea:invalid { 
    box-shadow: 0 0 5px #d45252;
    border-color: #b03535
}

input:valid, textarea:valid {
    box-shadow: 0 0 5px #5cd053;
    border-color: #28921f;
}
<input type="email" name="email" placeholder="john_doe@example.com" required />
<input type="url" name="website" placeholder="http://johndoe.com"/>
<input type="text" name="name" placeholder="John Doe" required/>

참고로 JSFiddle은 다음과 같습니다. http://jsfiddle.net/0sf6m46j/


7
$('input#edit-keys-1').blur(function(){
    tmpval = $(this).val();
    if(tmpval == '') {
        $(this).addClass('empty');
        $(this).removeClass('not-empty');
    } else {
        $(this).addClass('not-empty');
        $(this).removeClass('empty');
    }
});

jQuery에서. 클래스를 추가하고 CSS로 스타일을 지정했습니다.

.empty { background:none; }

6

이것은 나를 위해 일했다 :

HTML의 required경우 입력 요소에 속성을 추가하십시오.

<input class="my-input-element" type="text" placeholder="" required />

CSS의 경우 :invalid선택기를 사용 하여 빈 입력을 타겟팅

input.my-input-element:invalid {

}

노트:

  • 정보 required로부터 w3Schools.com ". 현재, 그것은 입력 필드 양식을 제출하기 전에 채워 져야 함을 지정하는 경우"

2

이 질문은 얼마 전에 요청되었을 수도 있지만 최근에 클라이언트 측 양식 유효성 검사를 찾고이 주제에 착수하고 :placeholder-shown 지원 이 향상됨에 따라 다음이 다른 사람들에게 도움이 될 것이라고 생각했습니다.

이 CSS4 의사 클래스를 사용하는 Berend 아이디어를 사용하여 사용자가 채우기를 완료 한 후에 만 ​​트리거되는 양식 유효성 검사를 만들 수있었습니다.

CodePen에 대한 ademo와 설명은 다음과 같습니다. https://codepen.io/johanmouchet/pen/PKNxKQ


1

IE 또는 Pre-Chromium Edge를 지원하지 않는 것이 행복하다면 (점진적 향상을 위해 이것을 사용하면 좋을 수도 있음) :placeholder-shownBerend가 말한 것처럼 사용할 수 있습니다 . Chrome과 Safari의 경우 공백이 작동하지만 실제로는 비어 있지 않은 자리 표시자가 필요합니다.

*,
 ::after,
 ::before {
  box-sizing: border-box;
}

label.floating-label {
  display: block;
  position: relative;
  height: 2.2em;
  margin-bottom: 1em;
}

label.floating-label input {
  font-size: 1em;
  height: 2.2em;
  padding-top: 0.7em;
  line-height: 1.5;
  color: #495057;
  background-color: #fff;
  background-clip: padding-box;
  border: 1px solid #ced4da;
  border-radius: 0.25rem;
  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}

label.floating-label input:focus {
  color: #495057;
  background-color: #fff;
  border-color: #80bdff;
  outline: 0;
  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}

label.floating-label input+span {
  position: absolute;
  top: 0em;
  left: 0;
  display: block;
  width: 100%;
  font-size: 0.66em;
  line-height: 1.5;
  color: #495057;
  border: 1px solid transparent;
  border-radius: 0.25rem;
  transition: font-size 0.1s ease-in-out, top 0.1s ease-in-out;
}

label.floating-label input:placeholder-shown {
  padding-top: 0;
  font-size: 1em;
}

label.floating-label input:placeholder-shown+span {
  top: 0.3em;
  font-size: 1em;
}
<fieldset>
  <legend>
    Floating labels example (no-JS)
  </legend>
  <label class="floating-label">
    <input type="text" placeholder=" ">
    <span>Username</span>
  </label>
  <label class="floating-label">
    <input type="Password" placeholder=" ">
    <span>Password</span>
  </label>
</fieldset>
<p>
  Inspired by Bootstrap's <a href="https://getbootstrap.com/docs/4.0/examples/floating-labels/">floating labels</a>.
</p>


1

입력에 클래스 이름을 추가 한 다음 CSS 규칙을 적용했습니다.

<input type="text" name="product" class="product" />

<style>
input[value=""].product {
    display: none;
}
</style>

0

빈 입력 상자를 얻는 명확한 속성이있는 답변에 궁금합니다.이 코드를 살펴보십시오.

/*empty input*/
input:empty{
    border-color: red;
}
/*input with value*/
input:not(:empty){
    border-color: black;
}

최신 정보

input, select, textarea {
    border-color: @green;
    &:empty {
        border-color: @red;
    }
}

더 이상 검증에서 좋은 모습을 가지고위한

 input, select, textarea {
    &[aria-invalid="true"] {
        border-color: amber !important;
    }

    &[aria-invalid="false"], &.valid {
        border-color: green !important;
    }
}

7
:empty자식이없는 요소에만 적용됩니다. 입력은 자식 노드를 전혀 가질 수 없으므로 입력에는 항상 빨간색 테두리가 있습니다. 또한 이 의견을보십시오
Zhegan

2
@NasserHadjloo 이것을 테스트 했습니까? 를 변경해도 value자식 노드 수는 변경되지 않습니다.
jcuenod

@jcuenod 자식 노드의 수는 무엇을 의미합니까? 나는 당신의 요점을 얻지 못했습니다
Nasser Hadjloo

xml 구조에서 노드는 중첩됩니다 (예 :) <parent><child></child></parent>. 당신은 가지고 <input></input>있고 입력 할 때 변경 사항은 <value>내부 노드가 <input>아니라 값 속성입니다 .<input value='stuff you type'></input>
jcuenod

2
그러나 그것은 OP가 달성하려는 것이 아닙니다.
jcuenod

0

나는 이것이 매우 오래된 스레드라는 것을 알고 있지만 그 이후로 상황이 조금 바뀌었고 문제를 해결하는 데 필요한 것들의 올바른 조합을 찾는 데 도움이되었습니다. 그래서 내가 한 일을 나누겠다고 생각했습니다.

문제는 채워진 필수 입력과 마찬가지로 선택적 입력에 동일한 CSS를 적용하는 것으로 나타났습니다. CSS는 채워지지 않은 경우에도 선택적 입력에 CSS를 적용한 psuedo 클래스 : valid를 사용했습니다.

이것이 내가 고친 방법입니다.

HTML

<input type="text" required="required">
<input type="text" placeholder="">

CSS

input:required:valid {
    ....
}
input:optional::not(:placeholder-shown){
    ....
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.