Решение проблемы наследования CSS-стилей — Супер-пупер школа программирования — LiveJournal
Один мой хороший друг и коллега Юра Поздняков (ypozdnyakov ) подсказал решение для проблемы, опубликованной в статье Проблема наследования CSS стилей. Как оказалось, я не до конца понимал суть работы CSS-селекторов, и Юра открыл мне глаза. Оказывается, что всякий селектор, который выбирает некоторый элемент, не выбирает его дочерние элементы. Мне так всегда казалось, потому что когда я просматривал некий элемент в файрбаге, то в списке CSS-правил элемента фигурировали и селекторы родительских компонентов. На самом деле, стиль родительского компонента будет применен к дочернему лишь в том случае, если его значение в дочернем компоненте равно inherit. Вы скажете: «Ха! Так это ж очевидно!» Я понимаю, что это очевидно, но пока ты это сам не прочувствуешь, пока сам с этим не столкнешься, это будет лежать в твоей голове бессмысленным грузом.
О наследовании CSS
Вот пример, который полностью перевернул мое представление о CSS:
DOM:
<div>
<div>
<a href="#">blablabla</a>
</div>
</div>
CSS:
.
application .component
{
font-family: Comic Sans MS;
}
.mylink
{
font-family: Arial;
}
Как вы думаете, каким шрифтом будет выведена ссылка? Если исходить из понятия «Какой из селекторов круче?», то шрифт будет Comic Sans MS. Очевидно, первый селектор круче второго, потому что в нем целых два класса против одного. Но на самом деле правильный ответ — Arial! Почему? Потому что первый селектор выбирает только лишь компонент <div>, и его действие не распространяется на дочерний компонент <a href=»#»>blablabla</a>.
Как же так? А почему же тогда, если удалить второе CSS-правило, то шрифт будет Comic Sans MS, ведь этот селектор не выбирает дочерний компонент?
CSS:
.application .component
{
font-family: Comic Sans MS;
}
Все дело в том, что по умолчанию в любом браузере шрифт всех ссылок установлен в значение inherit. Последний приведенный CSS-файл эквивалентен следующему:
CSS:
a
{
font-family: inherit;
}
.application .
component
{
font-family: Comic Sans MS;
}
Так как ссылка наследует шрифт родителя, то мы и получаем шрифт Comic Sans MS. Честно, когда я это впервые понял, мой мозг просто взорвался =)
Решение
Решение проблемы наследования CSS-стилей, по нашему с Юрой мнению, заключается во внедрении стандарта построения DOM и CSS-файлов. Ниже перечислены правила, описывающие данный стандарт:
1. Не использовать !important
Все это знают, но все равно делают. Делают, потому-что так проще. Когда какой-то стиль в течение 20 минут не хочет прикручиваться куда надо, обычно сдаются и ставят этот проклятый !important. Но это плохо, потому что !important-important нету. И если этот самый !important испортит жизнь другим компонентам, то справиться с этим будет еще сложнее. Лучше поступить так: внимательно всмотреться в CSS-правила и найти-таки несоответствие стандартам, перечисленным в данной статье. Это несоответствие с большой долей вероятности и будет служить причиной проблемы.
2. Ни один CSS-селектор не должен содержать записи вида #myid
По той же самой причине, по которой нельзя использовать !important, нельзя использовать и селекторы по идентификаторам. Ибо они всегда круче. У них сильно высокий приоритет. Кроме того, вы не можете дать разным компонентам один и тот же идентификатор, поэтому подобные селекторы не дают возможности использовать CSS в полной мере. Лучше прикрутить к компонентам какие-то классы, и заменить все селекторы по идентификаторам селекторами по классам.
3. Правильно именовать классы
Для каждого компонента ввести уникальный класс x, и классы всех дочерних элементов определять как x-y. Пример:
DOM:
<div>
<div>
<a href="#">Update</a>
<a href="#">Cancel</a>
</div>
<a href="#">www.blablabla.com</a>
</div>
Это гарантирует, что все классы имеют уникальные имена.
4. CSS-файл приложения должен для всех тегов переопределить стили, использующие по умолчанию значение inherit
Пример:
a
{
font-family: Serif;
.
..
}
div
{
color: black;
...
}
...
Тем самым мы избавились от проблемы наследования. Мы объявили правила наиболее низкого приоритета, которые гарантируют, что непредсказуемого наследования стилей не будет. Если же вам хочется, чтобы какой-то стиль у некоторого компонента унаследовался от родителя, объявите его отдельно:
.my-favorite-component .my-favorite-component-toolbar
{
color: #700;
}
.my-favorite-component .my-favorite-component-toolbar-button
{
color: inherit;
}
5. Все остальные селекторы строятся только из классов и псевдоклассов
Можно, при желании, добавлять еще класс самого компонента. В итоге, получим примерно следующее:
CSS-файл моего любимого компонента
.my-favorite-component
{
background-color: #FDD;
border-radius: 4px;
border: 1px solid #999;
padding: 5px;
}
.my-favorite-component .my-favorite-component-toolbar-button
{
background-color: #008;
font-family: Helvetica;
}
.my-favorite-component .
my-favorite-component-link
{
color: black;
text-decoration: none;
}
.my-favorite-component:hover .my-favorite-component-link
{
color: blue;
text-decoration: underline;
}
...
Это гарантирует, что стили будут применяться ровно к тем компонентам, о которых мы говорим. Тем самым решается проблема приоретизации.
Важно! Не допускайте селекторов вида:
.application .application-main-panel a
{
color: black;
}
Это испортит вам всю жизнь. Данный стиль будет прикручиваться ко всем дочерним ссылкам и перебивать их своим высоким приоритетом. Используйте такие селекторы лишь в том случае, если совершенно уверены, что внутри .application-main-panel не может быть вложенных компонентов произвольного вида.
6. (опционально) Для компонентов определить стили по умолчанию
Пример:
.my-favorite-component a
{
color: black;
font-family: Comic Sans MS;
}
.my-favorite-component div
{
margin: 5px;
}
...
Делать это можно лишь в том случае, если ваш компонент не может содержать других вложенных компонентов или другого произвольного HTML, поскольку в таком случае все стили могут поплыть.
А если у вас есть два таких компонента, для которых определены стили по умолчанию, и которые содержатся один в другом, то результат будет зависеть от порядка подключения CSS-файлов. А это плохо: получается косвенная зависимость одного компонента от другого и от приложения в целом.
Заключение
Я надеюсь, что эта статья поможет вам решить многие проблемы, возникающие при верстке веб-страниц, избавит вас от необходимости добавлять !important где попало и сделает программирование еще проще и интереснее.
Я тоже постараюсь ближайшее время посвятить переверстке своего проекта, поскольку неразбериха в CSS файлах уже неоднократно давала о себе знать. По ходу дела буду вносить коррективы в данную статью, если предоставленные выкладки содержат ошибки или недоработки.
Продолжение: Решение проблемы наследования CSS-стилей — замечания
Tags: Проблема наследования CSS-стилей
Наследование в CSS. — it-black.ru
Наследование в CSS. — it-black.ru Наследованием называется перенос правил форматирования для элементов, находящихся внутри других.
Например, пусть у на web-странице есть заголовок и параграф, которые должны иметь текст красного цвета. Мы можем отдельно к параграфу и заголовку применить соответствующий стиль, который установит нужный цвет шрифта:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Наследование стилей в CSS3</title>
<style>
p {color: red;}
h3 {color: red;}
</style>
</head>
<body>
<h3>Наследование стилей</h3>
<p>Текст про наследование стилей в CSS 3</p>
</body>
</html>
Однако поскольку и элемент p, и элемент h3 находятся в элементе body, то они наследуют от этого контейнера – элемента body многие стили.
И чтобы не дублировать определение стиля, можно написать так:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Наследование стилей в CSS3</title>
<style>
body {color: red;}
</style>
</head>
<body>
<h3>Наследование стилей</h3>
<p>Текст про наследование стилей в CSS 3</p>
</body>
</html>
Значение inherit
С помощью inherit можно указать, чтобы элемент наследовал значение свойства у своего предка. Такое значение доступно практически для каждого свойства в CSS.
Например, чтобы заставить теги <p> унаследовать рамку border от своего предка <body>, необходимо записать:
p {
border: inherit;
}
Однако не ко всем свойствам CSS применяется наследование стилей.
Например, свойства, которые представляют отступы (margin, padding) и границы (border) элементов, не наследуются.
Узнать, наследуется ли то или иное свойство, можно в стандарте CSS. Если в колонке «Inherited?» напротив нужного свойства стоит «yes», значит оно наследуется.
Кроме того, браузеры по умолчанию также применяют ряд предустановленных стилей к элементам. Например, заголовки имеют определенную высоту и т.д.
!important
Если после значения CSS свойства поставить пробел и написать !important, то это свойство всегда и везде будет иметь наивысший приоритет. Пример записи:
p{
color:red !important;
}
Благодаря тому, что наследование существует, можно экономить очень большое количество времени, сил и места в коде. Если бы таких правил не существовало, трудно представить, насколько бы усложнилась работа программиста.
Поделиться в facebook
Поделиться в twitter
Поделиться в vk
VK
Поделиться в google
Google+
Группа в VK
Помощь проекту
Обнаружили опечатку?
Сообщите нам об этом, выделите текст с ошибкой и нажмите Ctrl+Enter, будем очень признательны!
Свежие статьи
Облако меток
Похожие статьи
CSS flexbox
CSS flexbox (Flexible Box Layout Module) — модуль макета гибкого контейнера — представляет собой способ компоновки элементов, в основе лежит идея оси.
Flexbox состоит из
Препроцессор Sass
Sass — это метаязык на основе CSS, предназначенный для увеличения уровня абстракции CSS-кода и упрощения файлов каскадных таблиц стилей. Язык Sass имеет два синтаксиса: sass
Программируемый язык стилей LESS
LESS (Leaner Style Sheets, компактная таблица стилей) — это динамический язык стилей, который разработал Alexis Sellier. Он создан под влиянием языка стилей Sass, и, в
CSS-фреймворки
CSS-фреймворки созданы для упрощения работы верстальщика, исключения ошибок при создании проекта и избавления от скучного монотонного написания одного и того же кода. Верстальщики получают продуманные
Instagram Vk Youtube Telegram Odnoklassniki
Полезно знать
Рубрики
Авторы
© it-black.
ru | 2016 — 2022
javascript — удалить/сбросить унаследованный css от элемента
спросил
Изменено 1 год, 10 месяцев назад
Просмотрено 111 тысяч раз
Я знаю, что этот вопрос уже задавали раньше, но прежде чем отметить его как дубликат, я хочу сказать вам, что моя ситуация немного отличается от того, что я нашел в Интернете.
Я создаю и встраиваю скрипт, чтобы люди могли размещать его на своих сайтах. Этот скрипт создает div с определенной шириной/высотой и некоторой информацией в нем.
Моя проблема в том, что некоторые веб-сайты объявляют стили для div, которые также наследуются моим div.
например:
дел {
цвет фона: красный;
}
, поэтому, если я не установлю цвет фона для своего div, он будет отображаться красным, даже если я этого не хочу.
Единственное решение, которое я нашел, это перезаписать как можно больше свойств css, таким образом мой div будет отображаться именно так, как я хочу. Проблема с этим решением заключается в том, что существует слишком много свойств css для перезаписи, и я хочу, чтобы мой скрипт был настолько легким, насколько это возможно.
Итак, мой вопрос: знаете ли вы другое решение моей проблемы. Это может быть в css/javascript/jQuery.
Спасибо
- javascript
- jquery
- css
- встроенный скрипт
1
«Сброс» стилей для определенного элемента невозможен, вам придется перезаписать все стили, которые вам не нужны/не нужны. Если вы делаете это с помощью CSS напрямую или с помощью JQuery для применения стилей (зависит от того, что вам проще, но я бы не рекомендовал использовать для этого JavaScript/JQuery, так как это совершенно не нужно).
Если ваш div представляет собой своего рода «виджет», который можно включить в другие сайты, вы можете попробовать заключить его в iframe.
Это «сбросит» стили, потому что его содержимое является другим документом, но, возможно, это влияет на работу вашего виджета (или, возможно, полностью его ломает), поэтому в вашем случае это может быть невозможно.
3
Установите только соответствующие/важные свойства CSS.
Пример (измените только те атрибуты, которые могут привести к тому, что ваш div будет выглядеть совершенно по-другому):
фон: #FFF; граница: нет; цвет: #000; дисплей: блок; шрифт: начальный; высота: авто; межбуквенный интервал: нормальный; высота строки: нормальная; маржа: 0; заполнение: 0; преобразование текста: нет; видимость: видимая; ширина: авто; межсловный интервал: нормальный; z-индекс: авто;
Выберите очень конкретный селектор, например div#donttouchme , . Кроме того, вы можете добавить `!important перед каждой точкой с запятой в объявлении. Ваши клиенты намеренно пытаются испортить макет, когда этот вариант не работает.
Вы можете попробовать перезаписать CSS и использовать auto
Я не думаю, что это будет работать конкретно с цветом, но я столкнулся с проблемой, когда у меня было родительское свойство, такое как
.parent {
слева: 0px;
}
, а затем я смог просто определить своего ребенка с помощью чего-то вроде
.child {
слева: авто;
}
, и он эффективно «сбрасывает» свойство.
1
Технически вы ищете неустановленное значение в сочетании с сокращенным свойством all:
Неустановленное ключевое слово CSS сбрасывает свойство к его унаследованному значению, если оно наследуется от своего родителя, и к исходному значению, если нет. Другими словами, оно ведет себя как ключевое слово inherit в первом случае и как исходное ключевое слово во втором случае. Его можно применить к любому свойству CSS, включая сокращение CSS all.
.пользовательский класс {
/* конкретный атрибут */
цвет: не установлен;
}
.
другой класс {
/* сбросить все атрибуты */
все: снято;
/* затем устанавливаем собственные атрибуты */
красный цвет;
}
Вы также можете использовать начальное значение, по умолчанию это будет начальное значение браузера.
.другой класс{
/* сбросить все атрибуты */
все: начальный;
/* затем устанавливаем собственные атрибуты */
красный цвет;
}
В качестве альтернативы:
Если возможно, рекомендуется инкапсулировать класс или идентификатор в некое пространство имен:
.namespace .customClass{
красный цвет;
}
<дел> <дел>дел>
из-за специфики селектора это повлияет только на ваши собственные классы
Это проще сделать на «языках сценариев препроцессора», таких как SASS, с возможностями вложенности:
.namespace{
.пользовательский класс {
красный цвет
}
}
2
Попробуйте следующее: Создайте простой div без какого-либо стиля или содержимого за пределами красного div .
Теперь вы можете использовать цикл по всем стилям простого div и назначить его внутреннему div для сброса всех стилей.
Конечно, это не работает, если кто-то назначает стили всем div (т.е. без использования класса. CSS будет div { ... } ).
Обычное решение подобных проблем — присвоить вашему div отдельный класс. Таким образом, веб-дизайнеры сайтов могут настроить стиль вашего div , чтобы он соответствовал остальной части дизайна.
Пока они являются атрибутами, такими как классы и идентификаторы, вы можете удалить их с помощью модификаторов класса javascript/jQuery.
document.getElementById("MyElement").className = "";
Невозможно удалить определенные теги CSS, кроме как переопределить их (или использовать другой элемент).
вы можете использовать эту опцию ниже.
<стиль>
div: не (.no_common_style) {
цвет фона: красный;
}
стиль>
теперь, если вы не хотите применять стиль по умолчанию, вы можете использовать класс no_common_style в качестве класса.
пример:
<дел> Он не будет отображаться красным

application .component
{
font-family: Comic Sans MS;
}
.mylink
{
font-family: Arial;
}
component
{
font-family: Comic Sans MS;
}
..
}
div
{
color: black;
...
}
...

другой класс {
/* сбросить все атрибуты */
все: снято;
/* затем устанавливаем собственные атрибуты */
красный цвет;
}
Как правило, это означает наследование стилей сайта. Однако в этом случае клиент хотел, чтобы это приложение соответствовало новой системе дизайна, которая еще не применялась к сайту.

Если вы установите
д.
После проверки нашего приложения у нас был только один экземпляр элемента 