11

Выбор и манипуляция псевдоэлементами CSS ::before и ::after с помощью JavaScript (или jQuery)

11

Вопрос на русском для StackOverflow.com:

Есть ли способ выбора/манипуляции с CSS псевдоэлементами, такими как ::before и ::after (и старая версия с одной точкой с запятой) с использованием jQuery?

Например, в моем файле стилей есть следующее правило:

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

Как я могу изменить 'foo' на 'bar' с использованием чистого JavaScript или jQuery?

5 ответ(ов)

7

Вы также можете передать содержимое в псевдоэлемент с помощью атрибута данных, а затем использовать jQuery для манипуляций с этим:

В HTML:

<span>foo</span>

В jQuery:

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

В CSS:

span:after {
    content: attr(data-content) ' любой другой текст, который вы хотите';
}

Если вы хотите предотвратить появление 'другого текста', вы можете объединить это с решением seucolega следующим образом:

В HTML:

<span>foo</span>

В jQuery:

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

В CSS:

span.change:after {
    content: attr(data-content) ' любой другой текст, который вы хотите';
}

Таким образом, при наведении на элемент у вас будет возможность динамически изменять содержимое псевдоэлемента.

0

Если вы хотите полностью управлять псевдоэлементами ::before или ::after только с помощью CSS, вы можете использовать JavaScript. Вот пример:

jQuery('head').append('<style id="mystyle" type="text/css"> /* ваши стили здесь */ </style>');

Обратите внимание, что элемент <style> имеет идентификатор, который можно использовать для его удаления и добавления снова, если ваши стили меняются динамически.

Таким образом, ваш элемент будет стилизован именно так, как вам нужно, с помощью CSS и небольшого вклада JavaScript.

0

Спасибо всем! Я справился с тем, что хотел 😄 Вот ссылка: http://jsfiddle.net/Tfc9j/42/. Загляните!

Я хотел, чтобы непрозрачность внешнего блока отличалась от непрозрачности внутреннего блока и менялась по клику в другом месте. Спасибо!

Использовал следующий код:

$('#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" data-before="Click me!">
    <div id="duo">
        <p>ena p</p>
        <p id="duop">duoyyyyyyyyyyyyyy p</p>
    </div>   
</div>

Надеюсь, это поможет тем, кто сталкивается с похожими задачами!

0

В духе предложенного Кристианом, вы также можете сделать следующее:

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

Этот код добавляет новый стиль в <head> вашего документа, который добавляет содержимое "bar" после любого элемента с классом .span. Убедитесь, что ваш селектор соответствует элементам, к которым вы хотите применить стиль.

0

Вот как можно получить доступ к стилям :after и :before, определённым в CSS:

// Получить значение цвета у .element:before
var color = window.getComputedStyle(
    document.querySelector('.element'), ':before'
).getPropertyValue('color');

// Получить значение контента у .element:before
var content = window.getComputedStyle(
    document.querySelector('.element'), ':before'
).getPropertyValue('content');

Этот код позволит вам получить свойства, заданные для псевдоэлемента :before, такие как цвет и содержимое.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь