2017-01-09 2 views
3

Я пишу приложение для любой CMS, где я не знаю окружающего CSS или его селекторов, но хочу, чтобы мое приложение всегда выглядело одинаково.Перезаписать все заданные стили CSS с помощью моего селектора CSS

У меня вопрос, что если внешний селектор выбирает один из моих элементов, например с помощью button{height: 100px;} и мой селектор button .class{width:100px;} не определяет атрибут height, внешний селектор помещает этот атрибут на мои кнопки и меняет свой стиль.

Это простой пример, и вы можете сказать: «Просто укажите height в вашем селекторе тоже», я не могу поместить каждый мыслимый атрибут в свои селекторы и перезаписать все, что могло быть где-то задано.

Посмотрите эту скрипку для простого примера: https://jsfiddle.net/u4rvx6Lk/, где я не хочу, чтобы первый селектор установил границу на моем синем элементе, но, конечно же, это так.

Я пробовал all: unset; и all: initial;, но он просто не работает и, конечно же, не будет в Internet Explorer.

Я также знаю о CSS, но это также работает не очень надежно.

(Дополнительная информация: Это угловое 1.x приложение, которое в основном будет введен в WordPress CMS страниц, я составляю мой CSS, используя дерзость)

+0

Может быть, вы ищете '' важно – Hackerman

+1

если я не установлен атрибут я наклоняю установить важный –

+0

Как это:! Https://jsfiddle.net/u4rvx6Lk/1/ – Hackerman

ответ

2

Решение, которое сработало для меня, использует свойство CSS all, установленное на значение revert.

.css-class { 
    all: revert; 
} 

The mozilla docs for revert объясняет это красиво:

убрать изменения CSS ключевое слово откатывает каскад так, что свойство принимает значение оно имело бы, если бы не было никаких стилей в текущем стиле происхождения.

Для Firefox и хром, использовать unset:

.css-class { 
    all: unset; 
} 

См browser hacks для использования «хаки медиа-запроса» для проверки текущего браузера для решения кросс-браузера. Также см. Эту скрипку, где синяя коробка не наследует свойство высоты:

Я надеюсь, что это решение будет работать и в вашем проекте.

+0

он наследует как высоту, так и границу в моем хроме и firefox. в вашем примере fiddle –

+0

им жаль, но это ничего не меняет в стиле синих боксов в firefox и в chrome. –

+0

Это происходит потому, что 'all: unset' выводит все свойства ** унаследованного свойства элемента по умолчанию. Например, 'height', изначально устанавливается в' auto' и не зависит от высоты родителя. – Siavas

0

Посмотреть этот fiddle для простого примера. К сожалению, первый селектор устанавливает границу моего синего элемента.

Причина, по которой граница определяется во втором поле, заключается в том, что она является button, в которой вы определили границу. Вот как работает CSS. Если вам не нужна граница для вашего второго элемента, вам нужно либо определить border: 0; на втором элементе, либо в исходном селекторе, определяющем границу, button, используйте что-то, что исключает второй блок, например button:not(#id1).

+0

Как я уже сказал, я не влияю на первый селектор и какие атрибуты его определяет. Например, он может устанавливать дополнение или что-то еще. Я бы не знал, что это даже существует, потому что я не знаю веб-сайт, на который вводится мой фрагмент, например, фрагмент Google Maps. Его можно применять в любом месте. Я ищу способ предотвратить внешние css, чтобы повлиять на мои элементы. –

+0

Если CSS загружен на страницу, вы не можете удержать его от влияния на ваши элементы. Лучшее, что вы можете сделать, это не загружать CSS или удалять теги стилей или стилей с помощью клиентского кода. –

+0

, поэтому вы предлагаете использовать встроенный стиль и удалять все классы через классList.remove или что-то подобное? –

0

Так что я как-то заставлял это работать. Спасибо за ответы.

all: unset and revert не работал для меня, all: initial сделал.

Кроме того, я дам своим внутренним классам очень конкретные имена. Например, class=my-project-class, чтобы запретить внешним селекторам классов вводить собственные атрибуты.

Также это не должно работать в IE.

Смотрите эту скрипку: https://jsfiddle.net/Lvxxnh8r/13/

+0

Также в этой моей скрипке: https : //jsfiddle.net/Lvxxnh8r/14/ 'all: unset'works fine. В этой скрипке кто-то пишет: https://jsfiddle.net/Lvxxnh8r/10/ it doenst. Я очень смущен. –

+0

Я знаю почему: комментарии '// Firefox' и т. Д. Сломали его –

1

Это практически невозможно остановить код CSS от изменения ваших элементов, так как в настоящее время существует веб. О чем вы, по сути, говорите, это sandboxing ваших элементов, не позволяя им быть модифицированными другим кодом.

Вы можете сделать это с помощью iframe, но это ужасно и почти наверняка слишком много.

С другой стороны, будущее светлое! Существует функция, называемая Shadow DOM, которая по существу работает, чтобы вы могли реализовать свои собственные элементы и изолировать их от остальной части вашего кода. Уже такие элементы, как input и video, работают за кулисами: теперь мы можем делать то, что делают браузеры в течение многих лет.

Вы можете создать элемент: мы назовем его solid-button.

<solid-button></solid-button> 

Затем мы напишем код, чтобы войти в него. Мы поместим в template, чтобы он не появляется на экране, пока мы хотим:

<template id="solid-button-src"> 
    <style> 
    button { 
     width: 100px; 
     height: 100px; 
     background-color: green; 
     border: solid 1px black; 
    } 

    </style> 
    <button></button> 
</template> 

Затем мы используем немного Javascript, чтобы создать Shadow DOM и добавить содержимое в шаблоне в это:

customElements.define('solid-button', class extends HTMLElement { 
    constructor() { 
    super(); 

    const shadowRoot = this.attachShadow({ 
     mode: 'open' 
    }); 
    const template = document.querySelector('#solid-button-src'); 
    const clone = document.importNode(template.content, true); 
    shadowRoot.appendChild(clone); 
    } 
}); 

Это работает в некоторых браузеров сейчас, но далеко не достаточно, чтобы сделать это готовым к производству. Ваш пользователь может применять стили к solid-button, но они не будут влиять на содержимое внутри. Если у вас есть современный браузер, вы можете увидеть это ниже.

Очевидно, что это не решение для вас сейчас, но это может быть будущее.

customElements.define('solid-button', class extends HTMLElement { 
 
    constructor() { 
 
    super(); 
 

 
    const shadowRoot = this.attachShadow({ 
 
     mode: 'open' 
 
    }); 
 
    const template = document.querySelector('template'); 
 
    const clone = document.importNode(template.content, true); 
 
    shadowRoot.appendChild(clone); 
 
    } 
 
});
button { 
 
    height: 100px; 
 
    width: 100px; 
 
    background-color: red; 
 
    border: solid 1px black; 
 
} 
 

 
.class1 { 
 
    height: 100px; 
 
    width: 100px; 
 
    background-color: blue; 
 
} 
 

 
my-button { 
 
    background: red; /* does nothing visible */ 
 
}
<button></button> 
 
<button id="id1" class="class1"></button> 
 
<solid-button></solid-button> 
 
<solid-button class="class1"></solid-button> 
 

 
<template> 
 
    <style> 
 
    button { 
 
     width: 100px; 
 
     height: 100px; 
 
     background-color: green; 
 
     border: solid 1px black; 
 
    } 
 

 
    </style> 
 
    <button> 
 
    <slot name="content"></slot> 
 
    </button> 
 
</template>

+0

отличный ответ, даже если он не подходит для меня, как вы сказали. 'all: initial' сделал работу –

Смежные вопросы