Задать свойтво content для псевдоэллемента after
Вот собственно и вопрос .
Есть элемент div. Как реализовать, чтобы div::after свойство content подтягивалось из переменной (назовем ее userVar).Причем userVar может меняться во время нахождения юзера на странице и вместе с ним должно меняться значение content. Помогите,пожалуйста,кто знает. Удачного вечера) |
API для изменения свойств псевдоэлементов отсутствует. Поэтому замените свой псевдоэлемент на обычный элемент.
Если же задача принципиальная, то нужно динамически создавать элемент <style> и вставлять в него нужное правило. |
Да. Задача на самом деле принципиальная. Если Вам несложно,напишите,как это сделать через динамический стайл. Спасибо.
|
Ну примерно в таком ключе надо работать. Код не тестировал. Часть кода нужна для поддержки IE8. В вебкит почему то не получается напрямую установить pseudoRule.style.content ..
<script> (function(){ var head = document.head || document.getElementsByTagName('head')[0]; head.appendChild(document.createElement('style')); var styleSheet = document.styleSheets[document.styleSheets.length - 1]; if (styleSheet.insertRule) { styleSheet.insertRule('span:before {}'); } else { styleSheet.addRule('span:before', ''); } var pseudoRule = (styleSheet.cssRules || styleSheet.rules)[0]; this.setPseudoContent = function(content) { // почему-то style.content не работает в хроме. pseudoRule.style.cssText = 'content:' + ['"','"'].join(content); } })(); </script> <input onkeydown="setPseudoContent(value)" /> Pseudo:<span></span> |
danik.js,
в опере не работает |
Цитата:
|
Вариант...
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <script> function setPseudoContent(value) { var style = document.createElement('style'); var head = document.getElementsByTagName('head')[0]; head.appendChild(style); style.innerHTML = "span:before { content: '"+value+"' }" } </script> </head> <body> <input onkeyup="setPseudoContent(this.value)" /> <span> проверка</span> </body> </html> |
рони,
а ты видел что происходит в стилях, при таком использовании? span::before { content: "впвавпавапвапва"; } span::before { content: "впвавпавапвапв"; } span::before { content: "впвавпавапвапв"; } span::before { content: "впвавпавапвап"; } span::before { content: "впвавпавапва"; } span::before { content: "впвавпавапв"; } span::before { content: "впвавпавап"; } span::before { content: "впвавпав"; } span::before { content: "впвавпав"; } span::before { content: "впвавпав"; } span::before { content: "впвав"; } span::before { content: "впвав"; } span::before { content: "впва"; } span::before { content: "впв"; } span::before { content: "вп"; } span::before { content: "вапвп"; } span::before { content: "вапвп"; } span::before { content: "вап"; } span::before { content: "вап"; } span::before { content: "ва"; } |
Цитата:
|
devote,
Вариант...без повторов <!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <script> function setPseudoContent(value) { var style = document.getElementById('style_before') if(!style){ style = document.createElement('style'); style.id = 'style_before'; var head = document.getElementsByTagName('head')[0]; head.appendChild(style); } style.innerHTML = "span:before { content: '"+value+"' }" } </script> </head> <body> <input onkeyup="setPseudoContent(this.value)" /> <span> проверка</span> </body> </html> |
function queryStyleRule(selector) { var sheets = document.styleSheets, j, i = sheets.length, rules = []; for( ;i--; ) { try { rules = sheets[i].cssRules ? sheets[i].cssRules : sheets[i].rules ? sheets[i].rules : []; } catch(_e_) { rules = []; } for(j = rules.length; j--; ) { var sel = rules[j].selectorText.replace(/(^|[^:]):(after|before)/i, '$1::$2'); if (sel.toLowerCase() === selector) { return rules[j]; } } } var style = document.documentElement.firstChild.appendChild(document.createElement('style')); try { selector = selector.replace(/::(after|before)/, ':$1'); if (style.sheet) { style.sheet.insertRule(selector + '{}', 0); return style.sheet.cssRules[0]; } else if (style.styleSheet) { style.styleSheet.addRule(selector, ' ', 0); return style.styleSheet.rules[0]; } } catch(_e_) { style.parentNode.removeChild(style); } return null; } queryStyleRule('body::after').style.content = '"Hello World!"';; alert(queryStyleRule('body::after').style.content); |
<style> div:after { content: 'Этот текст будем получать с помощью метода queryStyleRule'; } </style> <div>Во как! </div> <input type="button" onclick="queryStyleRule('div::after').style.content='\'Вот мы его и заменили)))\'';" value="Заменить текст" /> <script> function queryStyleRule(selector) { var sheets = document.styleSheets, j, i = sheets.length, rules = []; for( ;i--; ) { try { rules = sheets[i].cssRules ? sheets[i].cssRules : sheets[i].rules ? sheets[i].rules : []; } catch(_e_) { rules = []; } for(j = rules.length; j--; ) { var sel = rules[j].selectorText.replace(/(^|[^:]):(after|before)/i, '$1::$2'); if (sel.toLowerCase() === selector) { return rules[j]; } } } var style = document.documentElement.firstChild.appendChild(document.createElement('style')); try { selector = selector.replace(/::(after|before)/, ':$1'); if (style.sheet) { style.sheet.insertRule(selector + '{}', 0); return style.sheet.cssRules[0]; } else if (style.styleSheet) { style.styleSheet.addRule(selector, ' ', 0); return style.styleSheet.rules[0]; } } catch(_e_) { style.parentNode.removeChild(style); } return null; } alert('Текущий текст у псевдо-элемента: ' + queryStyleRule('div::after').style.content); </script> |
devote,
:thanks: |
Мой вариант, без поиска существующих правил, исправленный:
<script> var addRule = (function(){ var head = document.head || document.getElementsByTagName('head')[0]; var style = head.appendChild(document.createElement('style')); var styleSheet = style.sheet || style.styleSheet; var cssRules = styleSheet.cssRules || styleSheet.rules; return function(selector) { if (styleSheet.insertRule) { styleSheet.insertRule(selector + '{}', cssRules.length); } else { styleSheet.addRule(selector, ' ', cssRules.length); } return cssRules[cssRules.length - 1]; } })(); var pseudoRule = addRule('span:before'); var setPseudoContent = function(content) { pseudoRule.style.content = '"' + content + '"'; } </script> <input onkeyup="setPseudoContent(value)" /> Pseudo:<span></span> Проверено в Opera, Firefox, Google Chrome, IE8, IE10. Цитата:
|
Цитата:
|
Цитата:
style.content = 'ololo'; хотя по правилам нужно: style.content = '"ololo"'; // или style.content = 'attr(data-my-attr)'; |
кстати о птичках.. а нафига такой хренью заниматься, если можно все упростить))
Для ИЕ8 обязательно должен присутствовать у спана атрибут, иначе ИЕ8 не будет обновлять значение <style> span:before { content: attr(data-before-content); } </style> <input onkeyup="document.getElementById('spanId').setAttribute('data-before-content', this.value)" /> Pseudo:<span id="spanId" data-before-content="Начальное значение псевдо-элемента, может быть пустым значением"></span> |
Цитата:
Цитата:
Кстати, как заэкранировать кавычку? В моем варианте текст с двойной кавычкой не проходит.. |
Цитата:
|
Цитата:
style.content = JSON.stingify('Мой текст в "Кавычках" и \'одинарных\' тоже'); |
Цитата:
|
Часовой пояс GMT +3, время: 22:29. |