동일한 요소에 대해 여러 개의 : before 의사 요소를 가질 수 있습니까?


116

:before동일한 요소에 대해 여러 의사 를 가질 수 있습니까?

.circle:before {
    content: "\25CF";
    font-size: 19px;
}
.now:before{
    content: "Now";
    font-size: 19px;
    color: black;
}

jQuery를 사용하여 위의 스타일을 동일한 요소에 적용하려고하는데 가장 최근의 스타일 만 적용되고 둘 다 적용되지는 않습니다.

답변:


94

CSS2.1에서 요소는 항상 모든 종류의 의사 요소 중 하나만 가질 수 있습니다. (이것은 요소가 a :before와 :after가상 요소를 모두 가질 수 있음을 의미 합니다. 단지 각 종류를 둘 이상 가질 수 없습니다.)

결과적으로 :before동일한 요소와 일치하는 여러 규칙 :before이있는 경우 일반 요소와 마찬가지로 모두 계단식으로 연결되고 단일 의사 요소에 적용됩니다 . 귀하의 예에서 최종 결과는 다음과 같습니다.

.circle.now:before {
    content: "Now";
    font-size: 19px;
    color: black;
}

보시다시피 content우선 순위가 가장 높은 선언 (설명 된대로 마지막에 오는 선언) 만 적용됩니다. 나머지 선언은 다른 CSS 속성의 경우와 마찬가지로 삭제됩니다.

이 동작은 CSS2.1 의 선택자 섹션에 설명되어 있습니다 .

유사 요소는 아래 및 다른 곳에서 설명하는 예외를 제외하고 CSS의 실제 요소처럼 작동합니다 .

이것은 유사 요소가있는 선택기가 일반 요소의 선택기와 같이 작동 함을 의미합니다. 또한 캐스케이드가 동일한 방식으로 작동해야 함을 의미합니다. 이상하게도 CSS2.1이 유일한 참조 인 것 같습니다. 둘 CSS3 선택자 도 CSS3-폭포는 전혀 이것을 언급하지, 그리고 그것이 미래의 사양에 명확하게 될 것인지두고 볼 일이다.

요소가 동일한 유사 요소를 가진 둘 이상의 선택기와 일치 할 수 있고 모든 선택기를 어떻게 든 적용하려는 경우 브라우저가 수행해야하는 작업을 정확히 지정할 수 있도록 결합 된 선택기로 추가 CSS 규칙을 만들어야합니다. 케이스. 예를 들어 content기호 또는 텍스트가 먼저 와야하는지 여부가 명확하지 않기 때문에 여기에 속성을 포함하는 완전한 예를 제공 할 수 없습니다 . 그러나이 결합 된 규칙에 필요한 선택기는 .circle.now:before또는입니다. .now.circle:before두 선택자가 동일하므로 사용자가 선택하는 선택자가 개인 선호 사항이며, content사용자가 직접 정의해야하는 속성 의 값일뿐 입니다.

여전히 구체적인 예가 필요하면 이 유사한 질문에 대한 내 답변을 참조하십시오 .

레거시 css3-content 사양에는::before::after CSS2.1 캐스케이드와 호환되는 표기법을 사용하여 다중 및 의사 요소 삽입에 대한 섹션이 포함되어 있지만 특정 문서는 더 이상 사용되지 않습니다. 2003 년 이후로 업데이트되지 않았으며 아무도 지난 10 년 동안이 기능을 구현했습니다. 좋은 소식은 버려진 문서가 css-content-3 및 css-pseudo-4 의 모습으로 활발하게 재 작성되고 있다는 것입니다 . 나쁜 소식은 다중 의사 요소 기능이 어느 사양에서도 찾을 수 없다는 것입니다. 아마도 구현 자의 관심이 부족하기 때문일 것입니다.


12
주어진 경우 요소가 class circle와 class 모두에 속하면 두 now규칙 모두 요소의 :before의사 요소에 적용 되지만 일반 CSS는 content설정 중 하나만 적용 할 수 있음을 의미합니다 (일반 계단식 규칙에 따라). 포인트는 content축적되지 않는다는 것입니다.
— Jukka K. Korpela

내가 몇 달 후에 대답 한이 질문 은 이것과 중복 된 것으로 밝혀졌습니다 . 나는 기본적으로 @Jukka가 말한 모든 것을 기본적으로 확장하는 다른 답변의 대부분의 정보를 병합했습니다. 먼저 오는 것 외에도 훨씬 더 많은 트래픽이 증가함에 따라이 것입니다.
— BoltClock

1
13 년 후 css-content-3 초안이 마침내 업데이트되었습니다 . pseudo-elements 섹션은 css-pseudo-4를 위해 확실히 제거되었으며, 이는 다중 ::before또는 ::after의사 요소를 허용하지 않습니다 .
— Oriol

@Oriol : 실제로 12 년. css-pseudo-4의 FPWD는 작년에 소개되었으며, 이때 css-content-3은 이미 새로운 사양을 가리 키도록 업데이트되었습니다.
— BoltClock

@BoltClock drafts.csswg.org의 css-content-3 편집기 초안은 얼마 전에 업데이트되었지만 w3.org의 작업 초안은 최근까지도 2003 년 초안이었습니다. 나는 아직도 ... 약간의 희망을 가지고 있었다
— 오리올

31

기본 요소에 하위 요소 나 텍스트가있는 경우이를 사용할 수 있습니다.

주요 요소를 상대 위치 (또는 절대 / 고정)로 지정하고 : before 및 : after 절대 위치를 모두 사용합니다 (내 상황에서는 절대 위치 여야합니다.

이제 하나 이상의 가상 요소를 원하면 절대 : before를 기본 요소의 자식 중 하나에 연결합니다 (텍스트 만있는 경우 범위에 넣으면 이제 요소가 있음). 상대 / 절대 / 고정이 아닙니다. .

이 요소는 그의 소유자가 귀하의 주요 요소 인 것처럼 작동하기 시작합니다.

HTML

<div class="circle">
    <span>Some text</span>
</div>

CSS

.circle {
    position: relative; /* or absolute/fixed */
}

.circle:before {
    position: absolute;
    content: "";
    /* more styles: width, height, etc */
}

.circle:after {
    position: absolute;
    content: "";
    /* more styles: width, height, etc */
}

.circle span {
    /* not relative/absolute/fixed */
}

.circle span:before {
    position: absolute;
    content: "";
    /* more styles: width, height, etc */
}

2
선택한 답변은 정확하지만 제 경우에는 실행 가능한 해결 방법이었습니다. DOM에 노드를 더 추가 할 필요없이 여러 가상 요소를 갖는 것을 시뮬레이션 할 수있었습니다!
— matt.kauffman23 dec.

@ matt.kauffman23 그래서, 어떻게 시뮬레이션을했는지 말씀해 주시겠습니까?
— BbIKTOP

1
@BbIKTOP 죄송합니다. 제 경우에는 항상 아이들이있는 모달을 작업하고 있었기 때문에 다음과 같은 결과를 .modal:first-child:before { …
— 얻었

@ matt.kauffman23 6 년이 넘는 시간이 지난 후에 이와 같은 세부 사항을 회상하기 위해 당신은 훌륭한 기억이 있습니다!
— ChrisOdney

1

다음을 사용하여이 문제를 해결했습니다.

.element:before {
    font-family: "Font Awesome 5 Free" , "CircularStd";
    content: "\f017" " Date";
}

아이콘에 "font awesome 5 free"글꼴 패밀리를 사용하고 그 후에 다시 사용할 글꼴을 지정해야합니다. 이렇게하지 않으면 내비게이터가 기본 글꼴 (times new roman 또는 이).

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