Изменение свойства width: перед селектором css с использованием JQuery
У меня есть страница с изображением в ней, и я ее стилизовал, используя: перед селекторами CSS.
Изображение динамическое, поэтому оно не имеет фиксированной ширины; Поэтому мне нужно установить: до ширины правила динамически.
Я хочу сделать это на стороне клиента, используя JQuery.
Предположим следующее:
.column:before{
width: 300px;
float: left;
content: "";
height: 430px;
}
.column{
width: 500px;
float: right;
padding: 5px;
overflow: hidden;
text-align: justify;
}
Как я могу изменить свойство width класса с помощью селектора :before
(а не без него) с помощью JQuery?
Ответы
Ответ 1
Я не думаю, что есть jQuery-способ прямого доступа к правилам псевдокласса, но вы всегда можете добавить новый элемент style
в голову документа, например:
$('head').append('<style>.column:before{width:800px !important;}</style>');
Смотрите демо-версию здесь
Я также помню, что видел плагин, который решает эту проблему один раз, но я не смог найти его при первом запуске Google.
Ответ 2
Псевдоэлементы являются частью теневого DOM и не могут быть изменены (но могут быть запрошены их значения).
Однако иногда вы можете обойти это, используя классы, например.
JQuery
$('#element').addClass('some-class');
CSS
.some-class:before {
/* change your properties here */
}
Это может оказаться неприемлемым для вашего запроса, но он показывает, что вы можете иногда достигать этого шаблона.
Чтобы получить значение псевдоэлемента, попробуйте использовать некоторый код...
var pseudoElementContent = window.getComputedStyle($('#element')[0], ':before')
.getPropertyValue('content')
Ответ 3
Псевдоэлементы не являются частью DOM, поэтому их нельзя манипулировать с помощью jQuery или Javascript.
Но, как указано в принятом ответе, вы можете использовать JS для добавления блока стиля, который заканчивает стилизацию псевдоэлементов.
Ответ 4
Ответ должен быть Jain. Вы не можете выбрать элемент с помощью псевдоселектора, но вы можете добавить новое правило в таблицу стилей с помощью insertRule
.
Я сделал что-то, что должно сработать для вас:
var addRule = function(sheet, selector, styles) {
if (sheet.insertRule) return sheet.insertRule(selector + " {" + styles + "}", sheet.cssRules.length);
if (sheet.addRule) return sheet.addRule(selector, styles);
};
addRule(document.styleSheets[0], "body:before", "content: 'foo'");
http://fiddle.jshell.net/MDyxg/1/
Чтобы быть супер-крутым (и на самом деле ответить на вопрос), я снова свернул его и завернул в jQuery-плагин (однако jquery по-прежнему не требуется!):
/*!
* jquery.addrule.js 0.0.1 - https://gist.github.com/yckart/5563717/
* Add css-rules to an existing stylesheet.
*
* @see http://stackoverflow.com/a/16507264/1250044
*
* Copyright (c) 2013 Yannick Albert (http://yckart.com)
* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php).
* 2013/05/12
**/
(function ($) {
window.addRule = function (selector, styles, sheet) {
styles = (function (styles) {
if (typeof styles === "string") return styles;
var clone = "";
for (var p in styles) {
if (styles.hasOwnProperty(p)) {
var val = styles[p];
p = p.replace(/([A-Z])/g, "-$1").toLowerCase(); // convert to dash-case
clone += p + ":" + (p === "content" ? '"' + val + '"' : val) + "; ";
}
}
return clone;
}(styles));
sheet = sheet || document.styleSheets[document.styleSheets.length - 1];
if (sheet.insertRule) sheet.insertRule(selector + " {" + styles + "}", sheet.cssRules.length);
else if (sheet.addRule) sheet.addRule(selector, styles);
return this;
};
if ($) $.fn.addRule = function (styles, sheet) {
addRule(this.selector, styles, sheet);
return this;
};
}(window.jQuery));
Использование довольно просто:
$("body:after").addRule({
content: "foo",
color: "red",
fontSize: "32px"
});
// or without jquery
addRule("body:after", {
content: "foo",
color: "red",
fontSize: "32px"
});
https://gist.github.com/yckart/5563717
Ответ 5
"Хотя они отображаются браузерами через CSS, как если бы они были похожими на другие реальные элементы DOM, сами псевдоэлементы не являются частью DOM, и поэтому вы не можете выбирать и манипулировать ими с помощью jQuery". (Выбор и использование псевдоэлементов CSS, таких как:: before и:: после использования jQuery)
Лучше всего установить стиль с помощью jQuery, а не с помощью селектора псевдоселекса.
Ответ 6
Вы можете попытаться наследовать свойство из базового класса:
var width = 2;
var interval = setInterval(function () {
var element = document.getElementById('box');
width += 0.0625;
element.style.width = width + 'em';
if (width >= 7) clearInterval(interval);
}, 50);
.box {
/* Set property */
width:4em;
height:2em;
background-color:#d42;
position:relative;
}
.box:after {
/* Inherit property */
width:inherit;
content:"";
height:1em;
background-color:#2b4;
position:absolute;
top:100%;
}
<div id="box" class="box"></div>
Ответ 7
Один из вариантов - использовать атрибут на изображении и изменить его с помощью jQuery. Затем возьмите это значение в CSS:
HTML (примечание Я предполагаю, что .cloumn
- это div
, но это может быть что угодно):
<div class="column" bf-width=100 >
<img src="..." />
</div>
JQuery
// General use:
$('.column').attr('bf-width', 100);
// With your image, along the lines of:
$('.column').attr('bf-width', $('img').width());
И затем, чтобы использовать это значение в CSS:
.column:before {
content: attr(data-content) 'px';
/* ... */
}
Это будет захватывать значение атрибута от .column
и применять его к предыдущему.
Источники: CSS attr (обратите внимание на examples с ранее), jQuery attr.