jQuery를 사용하여 ::before
및 ::after
(및 세미콜론이있는 이전 버전과 같은) CSS 의사 요소를 선택 / 조작하는 방법이 있습니까?
예를 들어, 내 스타일 시트에는 다음 규칙이 있습니다.
.span::after{ content:'foo' }
jQuery를 사용하여 ‘foo’를 ‘bar’로 변경하는 방법
답변
데이터 속성을 사용하여 내용을 의사 요소에 전달한 다음 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';
}
답변
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 색상이 아닌 콘텐츠 문자열에만 적용 할 수 있습니다
답변
비록 그것들이 다른 실제 DOM 요소들처럼 마치 CSS를 통해 브라우저에 의해 렌더링되지만, 의사 요소는 이름에서 알 수 있듯이 실제 요소가 아니기 때문에 의사 요소 자체는 DOM의 일부가 아닙니다. jQuery를 사용하여 직접 선택하고 조작하십시오 (또는 Selectors API 조차도 해당 하는 JavaScript API ). 이것은 누구의 스타일 당신이 스크립트를 수정하려는 모든 의사 요소에 적용되며 단지 ::before
및::after
.
CSSOM (think window.getComputedStyle()
)을 통해 런타임에 의사 요소 스타일에만 직접 액세스 할 수 있습니다..css()
의사 요소를 지원하지 않는 메소드 인 되지 않습니다.
예를 들어 다음과 같은 다른 방법을 항상 찾을 수 있습니다.
-
스타일을 하나 이상의 임의 클래스의 의사 요소에 적용한 다음 클래스 간을 전환 합니다 (빠른 예는 secolea의 답변 참조 ). 요소와 요소 상태, 사용 방식을 구분
-
문서 스타일 시트를 변경하여 위의 의사 요소에 적용되는 스타일 조작
답변
jQuery에서 의사 요소는 DOM의 일부가 아니므로 선택할 수 없습니다. 그러나 father 요소에 특정 클래스를 추가하고 CSS에서 의사 요소를 제어 할 수 있습니다.
jQuery에서 :
<script type="text/javascript">
$('span').addClass('change');
</script>
CSS에서 :
span.change:after { content: 'bar' }
답변
의사 요소를 조작하기 위해 사용자 정의 속성 (일명 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 ()를 대체하려면
var()
함수 에 대한 첫 번째 인수로 명명 된 사용자 정의 특성 이 애니메이션으로 오염되어 있고var()
함수가 애니메이션 특성 또는 그 중 하나에서 사용중인 경우 사용자 정의 특성을이 알고리즘의 나머지 부분에 대한 초기 값으로 간주하십시오.var()
함수 에 대한 첫 번째 인수로 명명 된 사용자 정의 특성 값이 초기 값 이외var()
의 값이면 해당 사용자 정의 특성 값으로 함수를 바꾸십시오 .- 그렇지 않으면
var()
함수가 두 번째 인수로 폴백 값을 갖는 경우 함수를 폴백 값으로 대체하십시오var()
. 있다면var()
대체 참고 문헌뿐만 아니라 그들을 대체합니다.- 그렇지 않으면
var()
함수가 포함 된 속성이 계산 된 값 시간에 유효하지 않습니다.
사용자 정의 속성을 설정하지 않거나 OR로 설정 initial
하거나 잘못된 값을 포함하면 폴백 값이 사용됩니다. initial
사용자 정의 특성을 기본값으로 재설정하려는 경우 사용이 유용 할 수 있습니다.
관련
CSS 사용자 정의 속성 (일명 CSS 변수) 내에 상속 값을 저장하는 방법은 무엇입니까?
CSS 변수는 관련있는 것으로 간주되는 모든 브라우저 (예 : IE 11)에서 사용하지 못할 수 있습니다. https://caniuse.com/#feat=css-variables
답변
그리스도인이 제안한대로 다음과 같이 할 수도 있습니다.
$('head').append("<style>.span::after{ content:'bar' }</style>");
답변
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');