Недавно задалась вопросом: как динамически изменить стиль CSS в :before или :after у элемента с помощью JavaScript?
Поменять или задать content для before или after на JavaScript
Самое простое решение в одну строку:
<style>
#raz:after {
content: attr(data-after);
background: yellow;
}
</style>
<button onclick="this.dataset.after = ' мой after'" id="raz">нажать</button>
То есть для элемента создаём новый атрибут data-after, в котором пишем содержимое для content у after
Удалить :before или :after
Можно задать другой стиль CSS с дополнительным class, где content имеет значение none. Щелчок по кнопке будет присваивать этот class элементу.
<style>
#element {background: #fff5d7; border: 5px solid #fff5d7;}
#element:before {content: ":before"; border-bottom: solid brown;} /* изначальный стиль */
#element.new:before {content: none;} /* новый стиль */
</style>
<button onclick="delBefore();">удалить</button>
<div id="element"></div>
<script>
function delBefore() {
var div = document.getElementById('element');
div.className = 'new'; // задать класс
}
</script>
Скрипт, чтобы изменить псевдоэлементы у NodeList
А как быть, если вместо getElementById используется getElementsByName или querySelectorAll и т.п? Там работать нужно с массивом NodeList. Например, я хочу чтобы высота у :after каждого элемента составила четверть ширины элемента. Один класс на всех тут не подходит, поскольку ширина у элементов разная.
<style>
#element {background: #fff5d7; border: 5px solid #fff5d7;}
#element li {background: green;}
#element li:nth-child(2) {background: blue; width: 30%; text-align: right;}
#element li:after {content: ":after"; background: DarkSalmon; display: inline-block;}
</style>
<button onclick="borderWidth();">height = 1/4 ширины li</button>
<ol id="element">
<li>
<li>
</ol>
<script>
function borderWidth() {
// eLi - каждый отдельный li
[].forEach.call(document.querySelectorAll('#element li'), function(eLi) {
// offsetWidth - ширина li
// dataset.width в HTML выглядит как data-width (не работает в IE, поэтому можно просто применить title)
eLi.dataset.width = eLi.offsetWidth/4;
// следующие строки кода в head добавляют (подробнее про appendChild()):
// <style> #element li[data-width="207.75"]:after {border-bottom-width: 207.75px;} </style>
// <style> #element li[data-width="62.25"]:after {border-bottom-width: 62.25px;} </style>
var style = document.createElement('style');
style.innerHTML = '#element li[data-width="' + eLi.dataset.width + '"]:after {height: ' + eLi.dataset.width + 'px;}';
document.querySelector('head').appendChild(style);
});
}
</script>
Комментариев нет: