jQuery를 사용하여 :: before 및 :: after와 같은 CSS 의사 요소 선택 및 조작


943

jQuery를 사용하여 ::before::after(및 세미콜론이있는 이전 버전과 같은) CSS 의사 요소를 선택 / 조작하는 방법이 있습니까?

예를 들어, 내 스타일 시트에는 다음 규칙이 있습니다.

.span::after{ content:'foo' }

jQuery를 사용하여 'foo'를 'bar'로 변경하는 방법


4
나는 당신에게 도움이 될만한 것을 만들었습니다 : gist.github.com/yckart/5563717
yckart

1
나는 내가 쓰려고하는 stackoverflow에 대한 의견을 싫어한다 (코멘트 작성자는 왜 당신이 그것을 완전히 반대 방향으로하지 않습니까? ) : 그러나 어느 시점에서 코드 설계 문제를 깨닫고 그 의사 요소를 스팬 또는 무언가. 내가 뭘 지적하는지 알아
zsitro

1
허용되는 답변이 우수합니다. 다음 사항 중 하나를 달성하려고하면 대답이 효과가 없습니다. 1. JS의 스타일을 변경하십시오. 2. 내용을 변경하십시오 : 전에 JS에 의해 필요한 경우 내 대답을 참조하십시오.
Learner


@Learner 이제이 모든 것에 대한 답변이 있습니다 : stackoverflow.com/a/49618941/8620333
Temani Afif

답변:


694

데이터 속성을 사용하여 내용을 의사 요소에 전달한 다음 jQuery를 사용하여 다음을 조작 할 수도 있습니다.

HTML에서 :

<span>foo</span>

jQuery에서 :

$('span').hover(function(){
    $(this).attr('data-content','bar');
});

CSS에서 :

span:after {
    content: attr(data-content) ' any other text you may want';
}

'다른 텍스트'가 표시되지 않게하려면 이것을 다음과 같이 seucolega의 솔루션과 결합 할 수 있습니다.

HTML에서 :

<span>foo</span>

jQuery에서 :

$('span').hover(function(){
    $(this).addClass('change').attr('data-content','bar');
});

CSS에서 :

span.change:after {
    content: attr(data-content) ' any other text you may want';
}

2
사양에 대해 해당 attr기능 을 사용하기위한 사양에 대한 링크가 content있습니까? 이 말을 들어 본 적이 없어서 놀랍습니다 ...
Kevin Peno

95
에 대한 +1 attr(), 너무 나쁩니다 content. 이외의 다른 속성에서는 사용할 수 없습니다 . 데모
Maksim Vi.

28
attr()CSS2 이외의 브라우저는 아직 구현 되지 않았지만 CSS2 자체 attr()content속성에 대해서만 정의 되었기 때문 입니다.
BoltClock

10
속성 참조에 대한 업데이트 된 링크 : w3.org/TR/css3-values/#attr-notation


477

jQuery가 할 수있는 다른 모든 것에 대한 대답은 간단한 질문이라고 생각할 것입니다. 불행히도 문제는 기술적 인 문제로 귀결됩니다 . css : after 및 : before 규칙은 DOM의 일부가 아니므로 jQuery의 DOM 메소드를 사용하여 변경할 수 없습니다.

있습니다 자바 스크립트 및 / 또는 CSS 해결 방법을 사용하여 이러한 요소를 조작하는 방법; 사용하는 것은 정확한 요구 사항에 따라 다릅니다.


저는 "최고의"접근 방식으로 널리 간주되는 것으로 시작하겠습니다.

1) 소정의 클래스 추가 / 제거

이 방법에서는, 당신은 이미 다른과의 CSS에서 클래스를 만들었습니다 :after또는 :before스타일. 이 "새"클래스를 나중에 스타일 시트에 배치하여 대체되도록하십시오.

p:before {
    content: "foo";
}
p.special:before {
    content: "bar";
}

그런 다음 jQuery (또는 바닐라 JavaScript)를 사용하여이 클래스를 쉽게 추가하거나 제거 할 수 있습니다.

$('p').on('click', function() {
    $(this).toggleClass('special');
});

  • 장점 : jQuery로 쉽게 구현할 수 있습니다. 한 번에 여러 스타일을 빠르게 변경합니다. 우려 사항 분리 (CSS와 JS를 HTML에서 분리)
  • 단점 : CSS는 미리 작성해야하므로 내용이 완전히 동적 :before이거나 :after그렇지 않다

2) 문서의 스타일 시트에 직접 새로운 스타일 추가

그것은 포함하여 문서 스타일 시트에 직접 스타일을 추가 자바 스크립트를 사용하는 것이 가능 :after하고 :before스타일. jQuery는 편리한 지름길을 제공하지 않지만 다행히 JS는 그렇게 복잡하지 않습니다.

var str = "bar";
document.styleSheets[0].addRule('p.special:before','content: "'+str+'";');

.addRule()관련 .insertRule()방법 은 오늘날 상당히 잘 지원됩니다.

변형으로, jQuery를 사용하여 완전히 새로운 스타일 시트를 문서에 추가 할 수 있지만 필요한 코드는 더 깔끔하지 않습니다.

var str = "bar";
$('<style>p.special:before{content:"'+str+'"}</style>').appendTo('head');

값을 추가하는 것이 아니라 값을 "조작"하는 것에 대해 다른 접근 방식을 사용하여 기존 또는 스타일읽을:after:before 수도 있습니다 .

var str = window.getComputedStyle(document.querySelector('p'), ':before') 
           .getPropertyValue('content');

약간 짧은 코드를 위해 jQuery document.querySelector('p')$('p')[0]사용할 때 바꿀 수 있습니다 .

  • 장점 : 모든 문자열을 스타일에 동적으로 삽입 할 수 있습니다
  • 단점 : 독창적 인 스타일은 변경되지 않고 재정의됩니다. 반복적으로 사용하면 DOM이 임의로 커질 수 있습니다.

3) 다른 DOM 속성 변경

당신은 또한 할 수 있습니다 사용 attr()하여 CSS에서 특정 DOM 속성을 읽을 수 있습니다. ( 브라우저가 지원하는 경우 :before, 그것은 지원 attr()뿐만 아니라. ) 이것을 결합하여 content:몇 가지주의 깊게 준비 CSS, 우리는 (그러나 내용 변경 되지 않은 다른 특성, 마진 또는 색상 등)의 :before:after동적 :

p:before {
    content: attr(data-before);
    color: red;
    cursor: pointer;
}

JS :

$('p').on('click', function () {
    $(this).attr('data-before','bar');
});

CSS를 미리 준비 할 수없는 경우 두 번째 기술과 결합 할 수 있습니다.

var str = "bar";

document.styleSheets[0].addRule('p:before', 'content: attr(data-before);');

$('p').on('click', function () {
    $(this).attr('data-before', str);
});

  • 장점 : 끝없는 추가 스타일을 만들지 않습니다 .
  • 단점 : attr CSS에서 URL 또는 RGB 색상이 아닌 콘텐츠 문자열에만 적용 할 수 있습니다

2
:: after psedo에서 glyphicon 값을 16 진수 값을 통해 동적으로 설정하려고합니다. content : 요소 (예 : content : "\ e043";). 그것은 나를 위해 작동하지 않는 것 같아서 글리프 콘의 16 진수 값도 작동하지 않는다고 가정하고 있습니까?
user2101068 2016 년

@ user2101068 새 질문으로 게시해야합니다. 사용중인 모든 코드를보아야합니다.
Blazemonger 2016 년

Blazemonger, 빠른 답변 주셔서 감사합니다. 불행히도 꽤 많은 코드가 있으며 관련 코드를 잘라내는 데 약간의 노력이 필요합니다. 나는이 일을하기 위해 12 시간 이상을 보냈는데 이것이 일을하기위한 마지막 노력이었다. 손실을 줄여야합니다. 위의 # 3에서 설명한 기술을 사용할 때 16 진수 값 (코드 스 니펫 이전)을 가정 할 수 있기를 바랐습니다. 콘텐츠 요소에 16 진수 문자열을 삽입 할 수 있지만 실제 글리프 아이콘 대신 글리프 콘 16 진수 값의 텍스트가 표시됩니다. 모든 코드를 보지 않고 인상을?
user2101068

1
@ user2101068 16 진 문자열을 사용하지 마십시오. 대신 실제 유니 코드 문자를 복사하여 HTML 속성에 붙여 넣으십시오. jsfiddle.net/mblase75/Lcsjkc5y
Blazemonger

솔루션 2 & 3과 관련하여 실제로 document.styleSheets [0] .insertRule (rule, index)를 사용하면 스타일 시트가 커지는 것을 방지 할 수 있습니다.이 인덱스를 사용하면 필요하지 않은 경우 규칙을 제거 할 수 있습니다. styleSheets [0] .deleteRule (index)
Picard

158

비록 그것들이 다른 실제 DOM 요소들처럼 마치 CSS를 통해 브라우저에 의해 렌더링되지만, 의사 요소는 이름에서 알 수 있듯이 실제 요소가 아니기 때문에 의사 요소 자체는 DOM의 일부가 아닙니다. jQuery를 사용하여 직접 선택하고 조작하십시오 (또는 Selectors API 조차도 해당 하는 JavaScript API ). 이것은 누구의 스타일 당신이 스크립트를 수정하려는 모든 의사 요소에 적용되며 단지 ::before::after .

CSSOM (think window.getComputedStyle())을 통해 런타임에 의사 요소 스타일에만 직접 액세스 할 수 있습니다..css() 의사 요소를 지원하지 않는 메소드 인 되지 않습니다.

예를 들어 다음과 같은 다른 방법을 항상 찾을 수 있습니다.

  • 스타일을 하나 이상의 임의 클래스의 의사 요소에 적용한 다음 클래스 간을 전환 합니다 (빠른 예는 secolea의 답변 참조 ). 요소와 요소 상태, 사용 방식을 구분

  • 문서 스타일 시트를 변경하여 위의 의사 요소에 적용되는 스타일 조작


78

jQuery에서 의사 요소는 DOM의 일부가 아니므로 선택할 수 없습니다. 그러나 father 요소에 특정 클래스를 추가하고 CSS에서 의사 요소를 제어 할 수 있습니다.

jQuery에서 :

<script type="text/javascript">
    $('span').addClass('change');
</script>

CSS에서 :

span.change:after { content: 'bar' }

48

의사 요소를 조작하기 위해 사용자 정의 속성 (일명 CSS 변수) 에 의존 할 수도 있습니다 . 우리는 사양 에서 읽을 수 있습니다 :

사용자 정의 속성은 일반 속성이므로 모든 요소에서 선언 할 수 있으며 일반 상속계단식 규칙 으로 해결 되며 @media 및 기타 조건부 규칙으로 조건부로 만들 수 있으며 HTML 스타일 속성 에서 사용할 수 있으며 읽거나 설정할 수 있습니다 CSSOM 등을 사용하여

이를 고려하면 아이디어는 요소 내에서 사용자 정의 특성을 정의하는 것이며 의사 요소는 단순히 특성을 상속합니다. 따라서 쉽게 수정할 수 있습니다.

1) 인라인 스타일 사용 :

.box:before {
  content:var(--content,"I am a before element");
  color:var(--color, red);
  font-size:25px;
}
<div class="box"></div>
<div class="box" style="--color:blue;--content:'I am a blue element'"></div>
<div class="box" style="--color:black"></div>
<div class="box" style="--color:#f0f;--content:'another element'"></div>

2) CSS와 클래스 사용

.box:before {
  content:var(--content,"I am a before element");
  color:var(--color, red);
  font-size:25px;
}

.blue {
  --color:blue;
  --content:'I am a blue element';
}
.black {
  --color:black;
}
<div class="box"></div>
<div class="box black" ></div>
<div class="box blue"></div>

3) 자바 스크립트 사용

document.querySelectorAll('.box')[0].style.setProperty("--color", "blue");
document.querySelectorAll('.box')[1].style.setProperty("--content", "'I am another element'");
.box:before {
  content:var(--content,"I am a before element");
  color:var(--color, red);
  font-size:25px;
}
<div class="box"></div>
<div class="box"></div>

4) jQuery 사용

$('.box').eq(0).css("--color", "blue");
/* the css() function with custom properties works only with a jQuery vesion >= 3.x
   with older version we can use style attribute to set the value. Simply pay
   attention if you already have inline style defined! 
*/
$('.box').eq(1).attr("style","--color:#f0f");
.box:before {
  content:"I am a before element";
  color:var(--color, red);
  font-size:25px;
}
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>


복잡한 값과 함께 사용할 수도 있습니다.

.box {
  --c:"content";
  --b:linear-gradient(red,blue);
  --s:20px;
  --p:0 15px;
}

.box:before {
  content: var(--c);
  background:var(--b);
  color:#fff;
  font-size: calc(2 * var(--s) + 5px);
  padding:var(--p);
}
<div class="box"></div>

내가 구문을 고려하고 있음을 알 수 있습니다 var(--c,value).value 기본값이며, 또한 대체 값이라고합니다.

동일한 사양에서 다음을 읽을 수 있습니다.

사용자 정의 속성 값은 var () 함수를 사용하여 다른 속성 값으로 대체 할 수 있습니다. var ()의 구문은 다음과 같습니다.

var() = var( <custom-property-name> [, <declaration-value> ]? )

함수의 첫 번째 인수는 대체 할 사용자 정의 특성의 이름입니다. 함수에 대한 두 번째 인수 (제공된 경우)는 대체 값으로, 참조 된 사용자 정의 특성이 유효하지 않은 경우 대체 값으로 사용됩니다 .

그리고 나중에 :

속성 값에서 var ()를 대체하려면

  1. var()함수 에 대한 첫 번째 인수로 명명 된 사용자 정의 특성 이 애니메이션으로 오염되어 있고 var()함수가 애니메이션 특성 또는 그 중 하나에서 사용중인 경우 사용자 정의 특성을이 알고리즘의 나머지 부분에 대한 초기 값으로 간주하십시오.
  2. var()함수 에 대한 첫 번째 인수로 명명 된 사용자 정의 특성 값이 초기 값 이외 var()의 값이면 해당 사용자 정의 특성 값으로 함수를 바꾸십시오 .
  3. 그렇지 않으면 var()함수가 두 번째 인수로 폴백 값을 갖는 경우 함수를 폴백 값으로 대체하십시오 var(). 있다면var() 대체 참고 문헌뿐만 아니라 그들을 대체합니다.
  4. 그렇지 않으면 var()함수가 포함 된 속성이 계산 된 값 시간에 유효하지 않습니다.

사용자 정의 속성을 설정하지 않거나 OR로 설정 initial하거나 잘못된 값을 포함하면 폴백 값이 사용됩니다. initial사용자 정의 특성을 기본값으로 재설정하려는 경우 사용이 유용 할 수 있습니다.

관련

CSS 사용자 정의 속성 (일명 CSS 변수) 내에 상속 값을 저장하는 방법은 무엇입니까?

상자 모델의 CSS 사용자 정의 특성 (변수)


CSS 변수는 관련있는 것으로 간주되는 모든 브라우저 (예 : IE 11)에서 사용하지 못할 수 있습니다. https://caniuse.com/#feat=css-variables


@akalata 예, 코드에는 jQuery 버전 3.x가 필요합니다. jQuery를 사용하여 자세한 내용과 대안을 추가했습니다.;)
Temani Afif

이것은 IE 11에서 어떻게 수행됩니까?
connexo

1
@connexo는 훌륭하고 현대적인 기능과 같습니다 .. 지원되지 않으며 작동하지 않습니다 caniuse.com/#feat=css-variables
Temani Afif

Ofc 저는 IE 11이 여전히 관련성이 높기 때문에 귀하의 답변의 소개 부분에서 해당 정보를 놓쳤습니다.
connexo

1
이 답변은 CSS 변수를 사용하여 의사 요소를 JavaScript와 관련시키고 수정하는 방법에 대한 심층 자습서입니다. 시간을내어 매우 귀중한 기술을 공유해 주셔서 감사합니다.
LebCit

37

그리스도인이 제안한대로 다음과 같이 할 수도 있습니다.

$('head').append("<style>.span::after{ content:'bar' }</style>");

2
여기에 id 속성을 추가해야합니다. 따라서 새로운 요소를 추가하기 전에 요소를 선택하고 삭제할 수 있습니다. 그렇지 않은 경우, 불필요한 스타일 노드가 많이 나타날 수 있습니다.
KS

24

CSS에 정의 된 : after 및 : before 스타일 속성에 액세스하는 방법은 다음과 같습니다.

// Get the color value of .element:before
var color = window.getComputedStyle(
    document.querySelector('.element'), ':before'
).getPropertyValue('color');

// Get the content value of .element:before
var content = window.getComputedStyle(
    document.querySelector('.element'), ':before'
).getPropertyValue('content');

11

CSS를 통해 :: before 또는 :: after sudo 요소를 완전히 조작하려면 JS를 사용하면됩니다. 아래를보십시오;

jQuery('head').append('<style id="mystyle" type="text/css"> /* your styles here */ </style>');

<style>요소에 ID가 어떻게 있는지 확인하십시오. 이 ID를 사용하면 스타일이 동적으로 변경되는 경우 요소를 제거하고 다시 추가 할 수 있습니다.

이런 식으로 요소는 JS의 도움으로 CSS를 통해 원하는 방식으로 정확하게 스타일됩니다.


6

효과적이지만 효율적이지 않은 방법 중 하나는 새 내용으로 문서에 규칙을 추가하고 클래스로 참조하는 것입니다. 필요한 것에 따라 클래스는 컨텐츠의 각 값에 대해 고유 한 ID가 필요할 수 있습니다.

$("<style type='text/css'>span.id-after:after{content:bar;}</style>").appendTo($("head"));
$('span').addClass('id-after');

5

HTML은 다음과 같습니다.

<div class="icon">
  <span class="play">
    ::before
  </span>
</div>

'전에'의 계산 스타일은 content: "VERIFY TO WATCH";

다음은 jQuery의 두 줄입니다.이 요소를 구체적으로 참조하기 위해 여분의 클래스를 추가하고 스타일 요소 (! important 태그 포함)를 추가하여 sudo-element의 컨텐츠 값의 CSS를 변경하는 아이디어가 사용됩니다.

$("span.play:eq(0)").addClass('G');

$('body').append("<style>.G:before{content:'NewText' !important}</style>");


5

모두 감사합니다! 나는 내가 원하는 것을 할 수 있었다 : D http://jsfiddle.net/Tfc9j/42/ 여기에서 살펴보십시오.

외부 div의 불투명도가 내부 div의 불투명도와 다르고 클릭 somwewhere로 변경되도록하고 싶었습니다.) 감사합니다!

   $('#ena').on('click', function () {
        $('head').append("<style>#ena:before { opacity:0.3; }</style>");
    });

$('#duop').on('click', function (e) {

        $('head').append("<style>#ena:before { opacity:0.8; }</style>");

     e.stopPropagation(); 
    });

#ena{
    width:300px;
    height:300px;
    border:1px black solid;
    position:relative;
}
#duo{
    opacity:1;
    position:absolute;
    top:50px;
  width:300px;
    height:100px;
      background-color:white;
}
#ena:before {
    content: attr(data-before);
    color: white;
    cursor: pointer;
    position: absolute;
    background-color:red;
    opacity:0.9;
    width:100%;
    height:100%;
}


<div id="ena">
    <div id="duo">
        <p>ena p</p>
        <p id="duop">duoyyyyyyyyyyyyyy p</p>

    </div>   


</div>

하지 않으려 append사용은 html최고입니다 예방
KingRider

1
조심하십시오 : 여기에서 클릭을 처리 할 때마다 머리에 스타일 태그를 추가합니다. 새 것을 추가하기 전에 이전 것을 제거하는 방법을 코딩했습니다.
pupitetris

3

가짜 속성을 만들거나 기존 속성을 사용 하여 유사 요소의 스타일 시트에서 상속 할 수 있습니다.

var switched = false;

// Enable color switching
setInterval(function () {
    var color = switched ? 'red' : 'darkred';
    var element = document.getElementById('arrow');
    element.style.backgroundColor = color;
    
    // Managing pseudo-element's css
    // using inheritance.
    element.style.borderLeftColor = color;
    
    switched = !switched;
}, 1000);
.arrow {
    /* SET FICTIONAL PROPERTY */
    border-left-color:red;
    
    background-color:red;
    width:1em;
    height:1em;
    display:inline-block;
    position:relative;
}
.arrow:after {
    border-top:1em solid transparent;
    border-right:1em solid transparent;
    border-bottom:1em solid transparent;
    border-left:1em solid transparent;
    
    /* INHERIT PROPERTY */
    border-left-color:inherit;
    
    content:"";
    width:0;
    height:0;
    position:absolute;
    left:100%;
    top:-50%;
}
<span id="arrow" class="arrow"></span>

"content"속성에서 작동하지 않는 것 같습니다. (


3

실제 사용을 위해 이것을 쓰지 않았으므로 달성 할 수있는 것에 대한 예를 제공하기 위해 이것은 실용적이지 않습니다.

css = {
before: function(elem,attr){ 

if($("#cust_style") !== undefined){ 
$("body").append("<style> " + elem + ":before {"  + attr +  "} </style>"); 
} else {
 $("#cust_style").remove();
$("body").append("<style> " + elem + ":before {"  + attr +  "} </style>"); 
}

}, after: function(elem,attr){
if($("#cust_style") !== undefined){ 
$("body").append("<style> " + elem + ":after {"  + attr +  "} </style>"); 

} else { $("#cust_style").remove();
$("body").append("<style> " + elem + ":after {"  + attr +  "} </style>"); 
}
}
}

이것은 현재 /를 추가하거나 필요한 요소를 포함하는 Style 요소를 추가하여 대상 요소의 Pseudo 요소 다음에 영향을 미칩니다.

이것은 다음과 같이 사용될 수 있습니다

css.after("someElement"," content: 'Test'; position: 'absolute'; ") // editing / adding styles to :after

css.before( ... ); // to affect the before pseudo element.

after : 및 before : 의사 요소는 DOM을 통해 직접 액세스 할 수 없으며 현재 CSS의 특정 값을 자유롭게 편집 할 수 없습니다.

내 길은 단지 예일 뿐이며 연습에 좋지는 않습니다. 자신의 트릭을 시도하고 실제 사용에 맞게 수정할 수 있습니다.

이것과 다른 것들에 대한 당신 자신의 실험을하십시오!

감사합니다-Adarsh ​​Hegde.


3

나는 항상 자신의 utils 함수를 추가하고 있습니다.

function setPseudoElContent(selector, value) {    
    document.styleSheets[0].addRule(selector, 'content: "' + value + '";');
}

setPseudoElContent('.class::after', 'Hello World!');

또는 ES6 기능을 사용하십시오.

const setPseudoElContent = (selector, value) => {    
    document.styleSheets[0].addRule(selector, `content: "${value}";`);
}

setPseudoElContent('.class::after', 'Hello World!');

2

그냥 style머리에 추가 할 수있을 때 클래스 또는 속성을 추가하는 이유

$('head').append('<style>.span:after{ content:'changed content' }</style>')

2

여기에는 많은 답변이 있지만 수락 된 답변 조차도 :before또는 의 CSS를 조작하는 데 도움이되는 답변이 :after없습니다.

여기 내가 그것을 제안하는 방법이 있습니다. HTML이 다음과 같다고 가정 해 봅시다.

<div id="something">Test</div>

그리고 CSS에서 : fore를 설정하고 다음과 같이 디자인합니다.

#something:before{
   content:"1st";
   font-size:20px;
   color:red;
}
#something{
  content:'1st';
}

content나중에 쉽게 가져올 수 있도록 요소 자체에 속성 도 설정 했습니다. 이제는button 클릭하기 전에 :의 색상을 녹색으로 변경하고 글꼴 크기를 30px로 변경하려고합니다. 다음과 같이 달성 할 수 있습니다.

일부 클래스에서 필요한 스타일로 CSS를 정의하십시오 .activeS.

.activeS:before{
   color:green !important;
   font-size:30px !important;
 }

이제 다음과 같이 클래스를 : before 요소에 추가하여 : before 스타일을 변경할 수 있습니다.

<button id="changeBefore">Change</button>
<script>
    $('#changeBefore').click(function(){
        $('#something').addClass('activeS');
    });
</script>

의 콘텐츠를 얻으려면 :before다음과 같이 할 수 있습니다.

<button id="getContent">Get Content</button>
<script>
    $('#getContent').click(function(){
        console.log($('#something').css('content'));//will print '1st'
    });
</script>

궁극적으로 :beforejQuery로 컨텐츠 를 동적으로 변경하려면 다음과 같이하십시오.

<button id="changeBefore">Change</button>
<script>
    var newValue = '22';//coming from somewhere
    var add = '<style>#something:before{content:"'+newValue+'"!important;}</style>';
    $('#changeBefore').click(function(){
        $('body').append(add);
    });
</script>

위의 "changeBefore"버튼을 클릭하면 :before내용이 #something동적 값인 '22'로 변경 됩니다 .

나는 그것이 도움이되기를 바랍니다


1

I에 정의 변수를 사용하여 만들어진 :root내부 CSS수정하는 :after(동일한가 적용되는 :before) 가상 요소는 , 특히 변동 background-colorA는 서식이 가치 anchor에 의해 정의 .sliding-middle-out:hover:after되고 content다른 가치 anchor( #reference다음의) 데모 자바 스크립트를 사용하여 임의의 색을 생성 / jQuery :

HTML

<a href="#" id="changeColor" class="sliding-middle-out" title="Generate a random color">Change link color</a>
<span id="log"></span>
<h6>
  <a href="https://stackoverflow.com/a/52360188/2149425" id="reference" class="sliding-middle-out" target="_blank" title="Stack Overflow topic">Reference</a>
</h6>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript" src="https://cdn.rawgit.com/davidmerfield/randomColor/master/randomColor.js"></script>

CSS

:root {
    --anchorsFg: #0DAFA4;
}
a, a:visited, a:focus, a:active {
    text-decoration: none;
    color: var(--anchorsFg);
    outline: 0;
    font-style: italic;

    -webkit-transition: color 250ms ease-in-out;
    -moz-transition: color 250ms ease-in-out;
    -ms-transition: color 250ms ease-in-out;
    -o-transition: color 250ms ease-in-out;
    transition: color 250ms ease-in-out;
}
.sliding-middle-out {
    display: inline-block;
    position: relative;
    padding-bottom: 1px;
}
.sliding-middle-out:after {
    content: '';
    display: block;
    margin: auto;
    height: 1px;
    width: 0px;
    background-color: transparent;

    -webkit-transition: width 250ms ease-in-out, background-color 250ms ease-in-out;
    -moz-transition: width 250ms ease-in-out, background-color 250ms ease-in-out;
    -ms-transition: width 250ms ease-in-out, background-color 250ms ease-in-out;
    -o-transition: width 250ms ease-in-out, background-color 250ms ease-in-out;
    transition: width 250ms ease-in-out, background-color 250ms ease-in-out;
}
.sliding-middle-out:hover:after {
    width: 100%;
    background-color: var(--anchorsFg);
    outline: 0;
}
#reference {
  margin-top: 20px;
}
.sliding-middle-out:before {
  content: attr(data-content);
  display: attr(data-display);
}

JS / jQuery

var anchorsFg = randomColor();
$( ".sliding-middle-out" ).hover(function(){
    $( ":root" ).css({"--anchorsFg" : anchorsFg});
});

$( "#reference" ).hover(
 function(){
    $(this).attr("data-content", "Hello World!").attr("data-display", "block").html("");
 },
 function(){
    $(this).attr("data-content", "Reference").attr("data-display", "inline").html("");
 }
);

에서 attr()제외에 대한 지원 content은 실제로 부족합니다. caniuse.com에서 확인할 수 있습니다. :root그리고 css-variables 지원이 더 좋지만, 아직 새로운 지원이므로 아직 널리 보급되지 않았습니다. (또한 caniuse.com에서 이에 대한 지원을 확인)
BananaAcid

1

.css()특정 요소에 사용 하는 것과 같은 CSS 의사 규칙을 추가하기 위해 jQuery 플러그인을 만들었습니다 .

  • 플러그인 코드 및 테스트 사례는 여기
  • 간단한 CSS 이미지 팝업 등의 사용 사례 여기

용법:

$('body')
  .css({
    backgroundColor: 'white'
  })
  .cssPseudo('after', {
    content: 'attr(title) ", you should try to hover the picture, then click it."',
    position: 'absolute',
    top: 20, left: 20  
  })
  .cssPseudo('hover:after', {
    content: '"Now hover the picture, then click it!"'
  });

0

 $('.span').attr('data-txt', 'foo');
        $('.span').click(function () {
         $(this).attr('data-txt',"any other text");
        })
.span{
}
.span:after{ 
  content: attr(data-txt);
 }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class='span'></div>


0

이 목적으로 내 플러그인을 사용할 수 있습니다.

jQuery :

(function() {
  $.pseudoElements = {
    length: 0
  };

  var setPseudoElement = function(parameters) {
    if (typeof parameters.argument === 'object' || (parameters.argument !== undefined && parameters.property !== undefined)) {
      for (var element of parameters.elements.get()) {
        if (!element.pseudoElements) element.pseudoElements = {
          styleSheet: null,
          before: {
            index: null,
            properties: null
          },
          after: {
            index: null,
            properties: null
          },
          id: null
        };

        var selector = (function() {
          if (element.pseudoElements.id !== null) {
            if (Number(element.getAttribute('data-pe--id')) !== element.pseudoElements.id) element.setAttribute('data-pe--id', element.pseudoElements.id);
            return '[data-pe--id="' + element.pseudoElements.id + '"]::' + parameters.pseudoElement;
          } else {
            var id = $.pseudoElements.length;
            $.pseudoElements.length++

              element.pseudoElements.id = id;
            element.setAttribute('data-pe--id', id);

            return '[data-pe--id="' + id + '"]::' + parameters.pseudoElement;
          };
        })();

        if (!element.pseudoElements.styleSheet) {
          if (document.styleSheets[0]) {
            element.pseudoElements.styleSheet = document.styleSheets[0];
          } else {
            var styleSheet = document.createElement('style');

            document.head.appendChild(styleSheet);
            element.pseudoElements.styleSheet = styleSheet.sheet;
          };
        };

        if (element.pseudoElements[parameters.pseudoElement].properties && element.pseudoElements[parameters.pseudoElement].index) {
          element.pseudoElements.styleSheet.deleteRule(element.pseudoElements[parameters.pseudoElement].index);
        };

        if (typeof parameters.argument === 'object') {
          parameters.argument = $.extend({}, parameters.argument);

          if (!element.pseudoElements[parameters.pseudoElement].properties && !element.pseudoElements[parameters.pseudoElement].index) {
            var newIndex = element.pseudoElements.styleSheet.rules.length || element.pseudoElements.styleSheet.cssRules.length || element.pseudoElements.styleSheet.length;

            element.pseudoElements[parameters.pseudoElement].index = newIndex;
            element.pseudoElements[parameters.pseudoElement].properties = parameters.argument;
          };

          var properties = '';

          for (var property in parameters.argument) {
            if (typeof parameters.argument[property] === 'function')
              element.pseudoElements[parameters.pseudoElement].properties[property] = parameters.argument[property]();
            else
              element.pseudoElements[parameters.pseudoElement].properties[property] = parameters.argument[property];
          };

          for (var property in element.pseudoElements[parameters.pseudoElement].properties) {
            properties += property + ': ' + element.pseudoElements[parameters.pseudoElement].properties[property] + ' !important; ';
          };

          element.pseudoElements.styleSheet.addRule(selector, properties, element.pseudoElements[parameters.pseudoElement].index);
        } else if (parameters.argument !== undefined && parameters.property !== undefined) {
          if (!element.pseudoElements[parameters.pseudoElement].properties && !element.pseudoElements[parameters.pseudoElement].index) {
            var newIndex = element.pseudoElements.styleSheet.rules.length || element.pseudoElements.styleSheet.cssRules.length || element.pseudoElements.styleSheet.length;

            element.pseudoElements[parameters.pseudoElement].index = newIndex;
            element.pseudoElements[parameters.pseudoElement].properties = {};
          };

          if (typeof parameters.property === 'function')
            element.pseudoElements[parameters.pseudoElement].properties[parameters.argument] = parameters.property();
          else
            element.pseudoElements[parameters.pseudoElement].properties[parameters.argument] = parameters.property;

          var properties = '';

          for (var property in element.pseudoElements[parameters.pseudoElement].properties) {
            properties += property + ': ' + element.pseudoElements[parameters.pseudoElement].properties[property] + ' !important; ';
          };

          element.pseudoElements.styleSheet.addRule(selector, properties, element.pseudoElements[parameters.pseudoElement].index);
        };
      };

      return $(parameters.elements);
    } else if (parameters.argument !== undefined && parameters.property === undefined) {
      var element = $(parameters.elements).get(0);

      var windowStyle = window.getComputedStyle(
        element, '::' + parameters.pseudoElement
      ).getPropertyValue(parameters.argument);

      if (element.pseudoElements) {
        return $(parameters.elements).get(0).pseudoElements[parameters.pseudoElement].properties[parameters.argument] || windowStyle;
      } else {
        return windowStyle || null;
      };
    } else {
      console.error('Invalid values!');
      return false;
    };
  };

  $.fn.cssBefore = function(argument, property) {
    return setPseudoElement({
      elements: this,
      pseudoElement: 'before',
      argument: argument,
      property: property
    });
  };
  $.fn.cssAfter = function(argument, property) {
    return setPseudoElement({
      elements: this,
      pseudoElement: 'after',
      argument: argument,
      property: property
    });
  };
})();

$(function() {
  $('.element').cssBefore('content', '"New before!"');
});
.element {
  width: 480px;
  margin: 0 auto;
  border: 2px solid red;
}

.element::before {
  content: 'Old before!';
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

<div class="element"></div>

jQuery.css의 일반 함수에서와 같이 값을 지정해야합니다.

또한 jQuery.css의 일반 함수에서와 같이 의사 요소 매개 변수의 값을 얻을 수도 있습니다.

console.log( $(element).cssBefore(parameter) );

JS :


GitHub : https://github.com/yuri-spivak/managing-the-properties-of-pseudo-elements/


0

다른 사람이 전체 스타일 요소로 헤드 요소를 추가하는 것에 대해 언급했으며 한 번만 수행하고 한 번 이상 다시 설정 해야하는 경우 나쁘지 않은 스타일 요소로 끝납니다. 그래서 머리에 빈 스타일 요소를 id로 만들고 이것을 다음과 같이 innerHTML로 바꾸지 않도록하십시오.

<style id="pseudo"></style>

그런 다음 JavaScript는 다음과 같습니다.

var pseudo = document.getElementById("pseudo");

function setHeight() {
    let height = document.getElementById("container").clientHeight;
    pseudo.innerHTML = `.class:before { height: ${height}px; }`
}

setHeight()

이제는 다른 요소의 높이를 기준으로 이전 요소의 높이를 설정하기 위해이 요소가 필요했으며 크기를 조정할 때이를 사용 setHeight()하여 창 크기를 조정할 때마다 실행할 수 있으며 <style>제대로 교체 됩니다.

희망은 같은 일을하려고 애쓰는 사람에게 도움이됩니다.


-1

쉽고 효과적인 다른 것들이 있습니다.

    <style> 
    .case-after:after { // set your properties here like eg: 
        color:#3fd309 !important; 
     } 
     .case-before:before { // set your properties here like eg: 
        color:#151715 !important; 
     }
 </style>
  // case for after
    $('#button-id').on('click', function() {
        $(".target-div").toggleClass('case-after');
    });

     // case for before
    $('#button-id').on('click', function() {
        $(".target-div").toggleClass('case-before');
    });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.