입력 필드에서 : before 또는 : after 유사 요소를 사용할 수 있습니까?


686

필드 에서 :afterCSS 의사 요소 를 사용하려고 input하지만 작동하지 않습니다. 와 함께 사용하면 span정상적으로 작동합니다.

<style type="text/css">
.mystyle:after {content:url(smiley.gif);}
.mystyle {color:red;}
</style>

이것은 작동합니다 ( "buu!"다음에 "some more"앞에 스마일리를 넣습니다)

<span class="mystyle">buuu!</span>a some more

이 방법은 작동하지 않습니다. 일부 값만 빨간색으로 표시되지만 웃는 것은 없습니다.

<input class="mystyle" type="text" value="someValue">

내가 무엇을 잘못하고 있지? 다른 의사 선택기를 사용해야합니까?

참고 : span내 주변을 추가 할 수는 없습니다 input. 타사 컨트롤에 의해 생성되고 있기 때문입니다.


HTML을 전혀 제어 할 수없는 border-color경우 input대신 HTML을 변경해보십시오 . 더 주목을 받는다는 것을 알았습니다.
Blazemonger

답변:


255

:after그리고 :before어떤 요소, Internet Explorer 7 및 아래에서 지원되지 않습니다.

또한 양식 요소 (입력) 및 이미지 요소 와 같은 교체 된 요소에는 사용되지 않습니다 .

다시 말해 순수한 CSS로는 불가능 합니다.

그러나 jquery 를 사용하면

$(".mystyle").after("add your smiley here");

.after의 API 문서

자바 스크립트로 콘텐츠를 추가합니다. 이것은 모든 브라우저에서 작동합니다.


Alex, IE8 및 최신 FF를 사용하고 있으므로 IE7은 문제가되지 않습니다. : after의 limiatation에 대한 문서를 검색했지만 찾을 수 없었습니다. w3.org/TR/CSS2/generate.html에 따르면 문서 트리에서 현재 노드 뒤에 삽입되므로 두 경우 모두 작동해야합니다.
matra

3
자신 만 사용하도록 페이지를 작성하지 않는 한 인터넷의 많은 부분이 여전히 해당 브라우저를 사용합니다. w3c 스펙은 이것을 말한다. 잘 아시다시피 브라우저는 사양에 대한 자체 해석을 구현합니다. 입력 후 : after를 사용하면 Opera 9 이상에서만 작동하지만 내부적으로 DOM을 구성하는 방식 때문에 IE, FF, 사파리 또는 크롬에서는 구현되지 않습니다. 다시 순수한 CSS로는 수행 할 수 없습니다.
Alex

3
이것이 4 월의 경우인지 확실하지 않지만 Webkit은 :after일반적으로 지원 하지만 입력 :before또는 :after입력을 지원하지는 않습니다 .
coreyward

258
W3C :after:before의사 요소를 이해 하는 한 컨테이너 요소에만 배치 할 수 있습니다. 왜? 그것들은 그 특정 요소 안에 추가되기 때문 입니다. input컨테이너가 아닙니다. button예를 들어 당신이 그들을 입을 수 있습니다. 예상대로 작동합니다. 사양은 실제로 요소의 문서 트리 내용 전후에 명시 적으로 CONTENT 라고 말합니다 . 따라서 요소는 컨테이너 여야합니다.
Robert Koritnik

29
다음 대답은 ... 더 나은 방법입니다 IE 7 (염려)와 jQuery를 (좋은 생각)에 대해 이야기보다는 실제 이유를 제공
로완

1305

:before:after컨테이너 내부 렌더링

<input>은 다른 요소를 포함 할 수 없습니다.


의사 요소는 컨테이너 요소에 대해서만 정의 할 수 있습니다 (또는 더 잘 말해집니다). 그들이 표현하는 방식이기 때문에 자식 요소로 컨테이너 자체. input다른 요소를 포함 할 수 없으므로 지원되지 않습니다. button은 다른 서브 - 소자 용기 때문이다 반면에, 또한 폼 엘리먼트는이를 지원한다.

저에게 묻는다면 일부 브라우저 컨테이너가 아닌 요소 에이 두 개의 의사 요소를 표시하면 버그와 비표준 준수입니다. 사양은 요소 내용에 대해 직접 이야기합니다 ...

W3C 사양

사양 을주의 깊게 읽으면 실제로 포함 요소 안에 삽입되었다고 말합니다 .

작성자는 : before 및 : after 유사 요소를 사용하여 생성 된 컨텐츠의 스타일과 위치를 지정합니다. 이름에서 알 수 있듯이 : before 및 : after 유사 요소는 요소의 문서 트리 내용 전후에 내용의 위치를 ​​지정합니다. 이러한 의사 요소와 함께 'content'속성은 삽입되는 내용을 지정합니다.

보다? 요소의 문서 트리의 내용 . 내가 이해하는 것처럼 이것은 컨테이너 내부를 의미 합니다.


119
+1 허용 된 답변보다 훨씬 낫습니다. 표준 자체에 대한 명확한 설명에 감사드립니다. 그래서 대부분을 [required]::before { content "*"; color: red; }: P
케빈 Peno

93
팁 :과 같은 제출 입력에 문제가있는 <input type="submit" value="Send"/>경우 <button type="submit">Send</button>대신 사용하십시오. 표현은 동일하지만,이 <button>컨테이너이고, 따라서 지원 :before하고 :after.
독감

15
무엇에 대해 <hr />? 컨테이너 요소가 아니라고 생각했지만 렌더링 :after:before jsfiddle.net/Uf88j/1
deathlock

7
@deathlock : 정말 흥미 롭습니다. 나는 그것이 일종의 변칙적이어야한다고 말하고 크로스 브라우저 또는 크로스 버전을 사용하는 것에 의존하지 않을 것입니다 ... HR은 컨테이너 요소가 아니므로 의사 요소를 허용해서는 안됩니다. W3C 표준 조차도 내용을 허용 하지 않는다고 말합니다 . 당신이 확인된다면 무효 요소 당신이 볼 수있는 이러한 요소는 어떤 상황에서 어떤 내용이 안된다. 유사 요소는 콘텐츠이므로 향후 브라우저 버전에서 표시되지 않을 것으로 예상합니다.
Robert Koritnik

5
" : before 및 : after 컨테이너 내부 렌더링 ": before 및 : after 유사 요소는 " 컨텐트 전후 "에옵니다 . 컨테이너의 "시작 또는 끝"에 있지 않습니다. 사양은 컨테이너를 언급하지 않습니다 . 같은 태그로 p하고 h1, 내용이 태그 내에, 그래서 전 / 후뿐만 아니라 내부의 표시입니다. inputand와 같은 요소를 사용하면 hr: before 및 : after가 여전히 컨텐츠 전후에 나타나지만 관련된 컨테이너는 없습니다 (특히 input). input : checked : before는 CSS를 통해 확인되는 확인란을 나타내는 데 널리 사용됩니다.
Radley Sustaire

60

이상하게도 일부 유형의 입력에서 작동합니다. 적어도 Chrome에서는

<input type="checkbox" />

잘 작동합니다

<input type="radio" />

그것은 type=text작동하지 않는 단지 다른 것입니다.


1
@ ANeves, Chromium에서 작동했지만 Firefox에서는 작동하지 않았습니다.
kcpr

45

다음은 또 다른 접근 방식입니다 (HTML을 제어한다고 가정). <span></span>입력 바로 뒤에 빈 내용을 추가하고 CSS를 사용하여 대상을 지정하십시오.input.mystyle + span:after

.field_with_errors {
  display: inline;
  color: red;
}
.field_with_errors input+span:after {
  content: "*"
}
<div class="field_with_errors">Label:</div>
<div class="field_with_errors">
  <input type="text" /><span></span> 
</div>

AngularJS 에서이 접근법을 사용하고 있습니다. .ng-invalid클래스가 <input>아닌 요소와 양식 에 클래스를 자동으로 추가하기 때문입니다 <label>.


1
다음과 같은 호버 작업을 추가 할 수 있습니다 input:hover+span:after{color: blue}. 공감.
krassowski

2
이 답변에 왜 공언이 적습니까? 이론적 지식이 중요하다고 생각하지만 문제가 해결됩니다.
jorgefpastor

문제를 해결하기 위해 함께 갈 수있는 좋은 옵션.
Jester

39

:before그리고 :after만약 종료 태그 요소를 사용할 수 있다는 것을 의미 용기의 내부에 도포된다.

자체 결산 요소에는 적용되지 않습니다.

참고로, 자체 결산 (예 : img / hr / input) 요소는 각각의 내용으로 대체되므로 '대체 요소'라고도합니다. 더 나은 용어가없는 "외부 개체" 더 나은 여기를 읽으 십시오


이 답변은 정확하고 간결하며 중요한 맥락을 제공합니다. 맨 위에 있어야합니다.

32

background-image필수 필드에 빨간색 점을 만드는 데 사용했습니다 .

input[type="text"][required] {
  background-image: radial-gradient(red 15%, transparent 16%);
  background-size: 1em 1em;
  background-position: top right;
  background-repeat: no-repeat
}

Codepen에서보기


20

입력 요소에는 의사 요소를 넣을 수 없지만 자리 표시 자처럼 그림자 요소를 넣을 수 있습니다!

input[type="text"] {   
  &::-webkit-input-placeholder {
    &:before {
      // your code
    }
  }
}

그것은 다른 브라우저 사용에 작동하도록하기 위해 :-moz-placeholder, ::-moz-placeholder그리고 :-ms-input-placeholder 다른 선택기에 . 브라우저가 선택기를 인식하지 못하면 전체 명령문이 무효화되므로 선택기를 그룹화 할 수 없습니다.

업데이트 : 위의 코드는 전처리기를 사용하지 않고 CSS 전 처리기 (SASS, LESS ...)에서만 작동합니다.

input[type="text"]::-webkit-input-placeholder:before { // your code }

3
좋은! 자리 표시 자 의사 요소에는 색상, 배경, 단어 간격, 문자 간격, 텍스트 장식, 세로 정렬, 텍스트 변형, 줄 높이, 텍스트 들여 쓰기, 불투명도 등 속성 지원이 제한되어 있습니다. css-tricks.com/almanac/selectors/p/placeholder
henry

힌트 주셔서 감사합니다. 사용자가 입력 상자를 채우면 의사 요소 내부의 모든 내용이 사라집니다. 나처럼 원하는 glyphicon-search마크 업을 표시 하지 않고 표시했다면 UX 문제 입니다.
다비 리마

2
이것이 더 이상 작동하지 않는 이유에 대한 일부 내용 : bugs.chromium.org/p/chromium/issues/detail?id=582301
Oliver Joseph Ash

17

의사 요소처럼 :after, :before컨테이너 요소 만 있습니다. 출발과 같은 단일 위치에서 폐쇄 요소 <input/>, <img>등 컨테이너 엘리먼트 따라서 의사 요소는 지원되지 아니다. 의사 요소를 컨테이너 요소에 적용 <div>하고 코드를 검사하면 (이미지 참조) 의미하는 바를 이해할 수 있습니다. 실제로 의사 요소는 컨테이너 요소 내에 작성됩니다. <input>또는의 경우에는 불가능합니다<img>

여기에 이미지 설명을 입력하십시오


15

순수한 CSS에서 작동하는 솔루션 :

트릭은 텍스트 필드 뒤에 dom 요소가 있다고 가정하는 것입니다.

/*
 * The trick is here:
 * this selector says "take the first dom element after
 * the input text (+) and set its before content to the
 * value (:before).
 */
input#myTextField + *:before {
  content: "👍";
} 
<input id="myTextField" class="mystyle" type="text" value="someValue" />
<!--
  There's maybe something after a input-text
  Does'nt matter what it is (*), I use it.
  -->
<span></span>

(*) 제한적인 솔루션 :

  • 다음과 같은 돔 요소가 있기를 바랍니다.
  • 입력 필드 뒤에 다른 입력 필드가 없어야합니다.

그러나 대부분의 경우 우리는 코드를 알고 있으므로이 솔루션은 효율적이고 100 % CSS 및 0 % jQuery처럼 보입니다.


2
input#myTextField ~ span:before {더 나은,하지만 범위는 같은 더 명시 적으로 정말 클래스가 있어야 .tick또는.icon

13

나는 같은 문제가 발생했을 때이 게시물을 찾았습니다. 이것은 저에게 효과적이었습니다. 입력 값을 바꾸는 대신 입력을 제거하고 동일한 크기의 범위를 절대로 배치하는 대신, 범위는 :before선택한 아이콘 글꼴로 의사 클래스를 적용 할 수 있습니다.

<style type="text/css">

form {position: relative; }
.mystyle:before {content:url(smiley.gif); width: 30px; height: 30px; position: absolute; }
.mystyle {color:red; width: 30px; height: 30px; z-index: 1; position: absolute; }
</style>

<form>
<input class="mystyle" type="text" value=""><span class="mystyle"></span>
</form>

1
+1-이 솔루션은 부모 클래스가 아닌 요소 자체에 유효성 검사 클래스를 자동으로 추가하는 플러그인 또는 프레임 워크를 사용하는 경우에 효과적입니다.
Blazemonger

9

여기에 가장 큰 오해는 단어의 의미 beforeafter. 그들은 할 수 없습니다 요소 자체를 참조하지만,에 대한 내용 요소이다. 그래서 element:before컨텐츠 전에이며,element:after 컨텐츠 이후이지만, 모두 원래의 요소 내에 여전히.

input요소는 CSS보기에는 내용이 없습니다, 그래서가 아니 :before거나 없습니다:after 의사의 콘텐츠. 이것은 많은 다른 공극 또는 대체 요소에 해당됩니다.

요소 외부를 참조하는 의사 요소가 없습니다 .

다른 우주에서, 이러한 의사 요소들은이 구별을 더 명확하게하기 위해 다른 것으로 불려 졌을 수도 있습니다. 그리고 누군가는 실제로 요소 바깥에있는 의사 요소를 제안했을 수도 있습니다. 지금까지이 우주에서는 그렇지 않습니다.


나는 당신이 무슨 뜻인지 이해하지 못할 수도 있지만, 의사 요소가 hr에서 작동합니까? jsfiddle.net/demetriad/o49yn5hq
Chris

1
@Chris 그것은 저에게 놀랍고 검색 할 때 다른 사람들에게옵니다. 나는 그것이 기발한 것이라고 생각합니다. hr색상에 대해 더 많이 알지만 CSS 관점에서는 항상 모호했습니다.
Manngo

5

CSS 2.1 스펙 의 메모 에 따르면 ,이 스펙은 대체 된 요소 (예 : HTML의 IMG)와 : before 및 : after의 상호 작용을 완전히 정의하지 않습니다. 이는 향후 사양에서 더 자세히 정의 될 것입니다.” 하지만 input정말 어떤 더, 기본적인 상황이 변경되지 않은 대체 요소되지 않습니다 :의 효과 :before:after 일반적으로 지정되지 않은에서 거기에 아무 효과가 없습니다.

해결책은이 방법으로 해결하려는 문제에 대한 다른 접근법을 찾는 것입니다. 생성 된 콘텐츠를 텍스트 입력 컨트롤에 넣는 것은 매우 오해의 소지가 있습니다. 사용자에게는 컨트롤의 초기 값의 일부인 것처럼 보이지만 수정할 수는 없습니다. 그러나 양식 데이터의 일부로 제출되지는 않았습니다.


3
이것은 주석이 아니라 답변입니다. 오히려 긴 주석이지만 그럼에도 불구하고 주석입니다.
Blazemonger

@ Blazemonger, 질문이 무엇인지 확실하지 않지만 어쨌든이 답변은 수락 된 답변과 동일한 문제를 해결하지만보다 정확한 방법으로 해결됩니다. 지정되지 않고 브라우저에 따라 요소에 생성 된 컨텐츠를 사용하는 것은 불가능 하지 않습니다 input.
Jukka K. Korpela

5

다른 사람들이 설명했듯이 inputs는 대체 된 void 요소이므로 대부분의 브라우저는 생성 ::before하거나 생성 할 수 없습니다::after 요소 의사 요소 .

그러나 CSS Working Group은 명시 적으로 허용 ::before하고 ::after있는 경우를 고려 하고 input있습니다 appearance: none.

에서 https://lists.w3.org/Archives/Public/www-style/2016Mar/0190.html ,

Safari와 Chrome은 모두 양식 입력에 의사 요소를 허용합니다. 다른 브라우저는 그렇지 않습니다. 우리는 이것을 제거하려고 시도했지만 사용 카운터는 그것을 사용하는 페이지의 ~ .07 %를 기록하고 있습니다. 이는 최대 제거 임계 값의 20 배입니다.

실제로 입력에 의사 요소를 지정하려면 입력의 내부 구조를 적어도 어느 정도 지정해야하지만 아직 관리하지 않은 것입니다. 그러나 보리스는 버그 스레드 중 하나에서 다음과 같이 표현할 수 있다고 제안했다. 아무 입력도 없다.


4

다음 시도 :

label[for="userName"] {
  position: relative;
}

label[for="userName"]::after {
  content: '[after]';
  width: 22px;
  height: 22px;
  display: inline-block;
  position: absolute;
  right: -30px;
}
<label for="userName">
	Name: 
	<input type="text" name="userName" id="userName">
	</label>


3

이전 또는 이후 의사 요소를 사용하려면 입력 주위에 일종의 래퍼가 있어야합니다. 다음은 입력의 래퍼 div에 이전이 있고 이전에 입력 내부를 배치하는 바이올린입니다. 분명히 이것은 해결 방법이지만 꼬집음에 효과적이며 스스로 반응합니다. 다른 내용을 넣어야 할 경우 쉽게 만들 수 있습니다.

일 바이올린

의사 요소로 입력 내부의 달러 기호 : http://jsfiddle.net/kapunahele/ose4r8uj/1/

HTML :

<div class="test">
    <input type="text"></input>
</div>

CSS :

input {
    margin: 3em;
    padding-left: 2em;
    padding-top: 1em;
    padding-bottom: 1em;
    width:20%; 
}


.test {
    position: relative;
    background-color: #dedede;
    display: inline;
}

.test:before {
    content: '$';
    position: absolute;
    top: 0;
    left: 40px;
    z-index: 1;
}

좋은 트릭이지만 입력을 "계속"하도록 양식화 된 div를 만들 수 있습니다. 이 바이올린 jsfiddle.net/ose4r8uj/31을 참조하십시오. 그러나 부트 스트랩을 사용하여 더 쉽게 할 수도 있습니다. getbootstrap.com/css/#forms-control-validation "옵션 아이콘 사용"부분을 찾으십시오. 그럼에도 불구하고 이것은 원래의 질문과 관련이 없습니다.
Victor Ivens

1
참고로 좋은 경우 : 초점 : 당신은 부모 요소 호버 등 입력의 대상으로 할 수 없습니다 때문에
jordanb

2

: before 및 : after로 입력 요소의 스타일을 지정하려는 경우 CSS 범위의 다른 범위, div 또는 요소의 효과모방 하려고 할 가능성이 있습니다 .

Robert Koritnik의 답변에서 지적했듯이 : before 및 : after는 컨테이너 요소 에만 적용 할 수 있으며 입력 요소는 컨테이너가 아닙니다.

그러나 HTML 5 는 컨테이너 인 button 요소를 도입했으며 input [type = "submit | reset"] 요소처럼 동작합니다.

    <style>
    .happy:after { content:url(smiley.gif); }
    </style>

    <form>
    <!-- won't work -->
    <input class="happy" type="submit" value="Submit" />

    <!-- works -->
    <button class="happy">Submit</button>
    </form>

HTML 4는 실제로 <button> 요소를 도입했습니다.
Mr Lister

1

요약

작동하지 않지만 <input type="button">잘 작동합니다 <input type="checkbox">.

피들 : http://jsfiddle.net/gb2wY/50/

HTML :

<p class="submit">
    <input id="submit-button" type="submit" value="Post">
    <br><br>
    <input id="submit-cb" type="checkbox" checked>
</p>

CSS :

#submit-button::before,
#submit-cb::before {
    content: ' ';
    background: transparent;
    border: 3px solid crimson;
    display: inline-block;
    width: 100%;
    height: 100%;
    padding: 0;
    margin: -3px -3px;
}

1

:before그리고 :after그들 만이 첫 번째 또는 마지막 노드로 새로운 노드를 삽입하기 때문에 자식 노드를 가질 수있는 노드 작동합니다.


0

나는 당신이 다음과 같이 할 수 있음을 발견했습니다 :

패딩과 : after를 취하는 div 부모가 필요합니다. 첫 번째 부모는 상대적이어야하고 두 번째 div는 절대적이어야하므로 후자의 위치를 ​​설정할 수 있습니다.


-1

대신 다른 아이디어를 사용하십시오.

<div>
<input type="text"></input>text can be entered here</div>

질문 작성자는 HTML 마크 업을 변경할 수 없다고 명시 적으로 언급했습니다. 이 답변은 의미가 없습니다. 아마도 @Morpheus 편집 된 것이 아니라 downvoted되었을 것입니다.
Palec
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.