CSS를 통해 입력에 텍스트가 있는지 여부를 감지하는 방법이 있습니까? 나는 :empty
의사 클래스를 사용해 보았지만 [value=""]
어느 것도 효과가 없었습니다. 이것에 대한 단일 해결책을 찾지 못하는 것 같습니다.
에 대한 의사 클래스가 :checked
있으며 :indeterminate
, 둘 다 비슷한 종류의 것을 고려하면 이것이 가능해야한다고 생각합니다 .
참고 : JavaScript를 사용할 수없는 “스타일리쉬 한 스타일”을 위해이 작업을 수행하고 있습니다.
또한 Stylish는 사용자가 제어하지 않는 페이지에서 클라이언트 쪽에서 사용됩니다.
답변
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";
}
답변
일반적인 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
유사한 것들입니다. 실제 사용자 입력의 영향을받지 않습니다.
답변
: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=" " />
답변
<input onkeyup="this.setAttribute('value', this.value);" />
과
input[value=""]
작동합니다 🙂
답변
기본적으로 모두가 찾고있는 것은 :
적게:
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;}
답변
필드없이 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;
}
답변
간단한 CSS :
input[value]:not([value=""])
이 코드는 입력이 채워지면 페이지로드에 주어진 CSS를 적용합니다.