Есть ли способ сбросить: after /: before правила CSS для элемента? - PullRequest
2 голосов
/ 21 марта 2012

Есть ли способ (надежно) сбросить любые возможные :after и :before правила CSS для вновь созданного элемента?

Обычно вы можете просто установить правила стиля, которые хотите сбросить на элементенапрямую (с !important, если вы хотите быть уверенным), но я не знаю ни одного способа изменить правила, определенные в :after только для элемента.

(Работает только с Chrome,если это вообще возможно.)


Пример at jsFiddle .

Содержимое добавлено с :before / :afterПравила влияют на значение, возвращаемое clientHeight.

Ответы [ 5 ]

7 голосов
/ 21 марта 2012

Существует DOM2 API в этом отношении.Правильный способ сделать это -

document.getOverrideStyle(p, ':after').display = 'none'; // or
document.getOverrideStyle(p, ':after').cssText = 'display: none !important;';

К сожалению, ни один браузер не реализовал это.( Webkit возвращает ноль , В Firefox такого метода нет ).Похоже, что CSS3 даже не говорит об этом больше, возможно, потому, что случаи использования очень редки.

Так что вам придется использовать магию id / className, как предложено выше или в другой теме

2 голосов
/ 21 марта 2012

Я бы просто присвоил имя класса новым элементам, которые не имеют :before / :after содержимого.

Пример - http://jsfiddle.net/84kZK/1/

1 голос
/ 21 марта 2012

Ах, хорошо. Вы можете написать новый CSS, который сбрасывает ложные элементы :before / :after:

function resetPsuedo(el) {
    if (!el.id) el.id = makeId();
    var selector = "#" + el.id;

    var head = document.getElementsByTagName('head')[0],
    style = document.createElement('style'),
    rules = document.createTextNode(selector + ":before, " + selector + ":after { content: '' }");

    style.type = 'text/css';
    if(style.styleSheet)
        style.styleSheet.cssText = rules.nodeValue;
    else style.appendChild(rules);
    head.appendChild(style);
}

function makeId() {
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    for (var i=0; i < 15; i++)
        text += possible.charAt(Math.floor(Math.random() * possible.length));

    return text;
}

Назначение случайного идентификатора передаваемому элементу (если у него его нет) позволяет взламывать встроенные стили - вместо доступа к el.beforeStyle вы можете использовать селекторы CSS: el#rkhjr828t9g:before.

Возможно, вам придется добавить дополнительные правила, чтобы полностью сбросить стили. jsFiddle: посмотреть меня!


http://www.w3.org/TR/CSS21/generate.html#before-after-content

Псевдоэлементы: before и: after взаимодействуют с другими блоками как если бы они были настоящими элементами, вставленными только внутри элемент. * +1021 *

Например, следующий фрагмент документа и таблица стилей:

<p> Text </p>                   p:before { display: block; content: 'Some'; }

... будет отображаться точно так же, как следующий документ фрагмент и таблица стилей:

<p><span>Some</span> Text </p>  span { display: block }

Аналогично, следующий фрагмент документа и таблица стилей:

<h2> Header </h2>     h2:after { display: block; content: 'Thing'; }

... будет отображаться точно так же, как следующий документ фрагмент и таблица стилей:

<h2> Header <span>Thing</span></h2>   h2 { display: block; }
                                      span { display: block; }
0 голосов
/ 11 октября 2016
//reference to this link:https://pankajparashar.com/posts/modify-pseudo-elements-css/ I wrote a demo and just modified the top attribute of ::before,here is the demo.
<head>
    <meta charset="UTF-8">
    <title>测试是否可以js修改伪类元素css yessssss</title>
    <style type="text/css">
    .htmlbox_close::before,
    .htmlbox_close::after {
        content: '';
        position: absolute;
        height: 2px;
        top: 4%;
        width: 3%;
        left: 2%;
        margin-top: -1px;
        background: #51aed9;
        height: 1.1%;
    }

    .htmlbox_close::before {
        -webkit-transform: rotate(45deg);
        -moz-transform: rotate(45deg);
        -ms-transform: rotate(45deg);
        -o-transform: rotate(45deg);
        transform: rotate(45deg);
    }

    .htmlbox_close::after {
        -webkit-transform: rotate(-45deg);
        -moz-transform: rotate(-45deg);
        -ms-transform: rotate(-45deg);
        -o-transform: rotate(-45deg);
        transform: rotate(-45deg);
    }
    </style>
</head>

<body>
    <div class="htmlbox_close"></div>
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">
    var str = window.getComputedStyle($('.htmlbox_close')[0], '::before').getPropertyValue('top');

    console.log(str);
    document.styleSheets[0].addRule('.htmlbox_close::before', 'top:100px');
    document.styleSheets[0].insertRule('.htmlbox_close::before { top:100px }', 0);
     document.styleSheets[0].addRule('.htmlbox_close::after', 'top:100px');
    document.styleSheets[0].insertRule('.htmlbox_close::before { top:100px }', 0);

    var str = window.getComputedStyle($('.htmlbox_close')[0], '::before').getPropertyValue('top');

    console.log(str);
    </script>
</body>
0 голосов
/ 30 декабря 2014

Используйте ruleSelector("ref::before")[0].style вместо document.getOverrideStyle(ref, ':before').

http://jsfiddle.net/s3fv8e5v/4/

<!DOCTYPE html>
<title>CSS</title>

<style>
    body {
        font: 200%/1.45 charter;
    }
    ref::before {
        content: '\00A7';
        letter-spacing: .1em;
    }
</style>

<article>The seller can, under Business Law <ref>1782</ref>, offer a full refund to buyers. </article>

<script>
    function ruleSelector(selector) {
        function uni(selector) {
            return selector.replace(/::/g, ':') // for Firefox
        }
        return Array.prototype.filter.call(Array.prototype.concat.apply([], Array.prototype.map.call(document.styleSheets, function(x) {
            return Array.prototype.slice.call(x.cssRules);
        })), function(x) {
            return uni(x.selectorText) === uni(selector);
        });
    }

    var toggle = false, 
        pseudo = ruleSelector("ref::before").slice(-1);

    document.querySelector("article").onclick = function() {
        pseudo.forEach(function(rule) {
            if (toggle = !toggle)
                rule.style.color = "red";
            else
                rule.style.color = "black";
        });
    }
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...