Я сильно полагался на CSS для веб-сайта, над которым я работаю. Прямо сейчас все стили CSS применяются для каждого тега, и поэтому сейчас я пытаюсь переместить его в более внешний стиль, чтобы помочь с любыми будущими изменениями.
Но теперь проблема в том, что я заметил, что получаю «CSS Explosion». Мне становится трудно решить, как лучше организовать и абстрагировать данные в файле CSS.
Я использую большое количество div
тегов на веб-сайте, переходя от веб-сайта с большим количеством таблиц. Так что я получаю много CSS-селекторов, которые выглядят так:
div.title {
background-color: blue;
color: white;
text-align: center;
}
div.footer {
/* Styles Here */
}
div.body {
/* Styles Here */
}
/* And many more */
Это еще не так уж плохо, но, будучи новичком, мне было интересно, можно ли дать рекомендации о том, как лучше организовать различные части файла CSS. Я не хочу иметь отдельный атрибут CSS для каждого элемента на моем веб-сайте, и я всегда хочу, чтобы файл CSS был достаточно интуитивно понятным и легким для чтения.
Моя конечная цель - упростить использование файлов CSS и продемонстрировать их способность увеличивать скорость веб-разработки. Таким образом, другие люди, которые могут работать на этом сайте в будущем, также начнут использовать хорошие методы кодирования, вместо того, чтобы использовать их, как я.
источник
simplicity
,complexity
,maintenance
,structure
иrefactoring
.Ответы:
Это очень хороший вопрос. Куда бы я ни посмотрел, CSS-файлы имеют тенденцию выходить из-под контроля через некоторое время, особенно, но не только при работе в команде.
Ниже приведены правила, которых я сам пытаюсь придерживаться (не то, что мне всегда удается.)
Рефакторинг рано, рефакторинг часто. Часто очищайте CSS-файлы, объединяйте несколько определений одного и того же класса. Удалите устаревшие определения немедленно .
При добавлении CSS во время исправления ошибок, оставьте комментарий о том, что делает изменение («Это нужно, чтобы окно было выровнено в IE <7»)
Избегайте избыточностей, например, определяя то же самое в
.classname
и.classname:hover
.Используйте комментарии,
/** Head **/
чтобы построить четкую структуру.Используйте инструмент prettifier, который помогает поддерживать постоянный стиль. Я использую Polystyle , которым я вполне доволен (стоит 15 долларов, но деньги потрачены не зря). Также есть бесплатные (например, Code Beautifier на основе CSS Tidy , инструмента с открытым исходным кодом).
Стройте разумные занятия. Смотрите ниже несколько заметок по этому вопросу.
Используйте семантику, избегайте супа DIV - используйте
<ul>
s для меню, например.Определите все на как можно более низком уровне (например, семейство шрифтов по умолчанию, цвет и размер в
body
) и используйте,inherit
где это возможноЕсли у вас очень сложный CSS, возможно, прекомпилятор CSS поможет. Я планирую заглянуть в xCSS по той же причине в ближайшее время. Есть несколько других вокруг.
Если вы работаете в команде, подчеркните необходимость качества и стандартов для CSS-файлов. Все хорошо разбираются в стандартах кодирования на своих языках программирования, но мало кто знает, что это необходимо и для CSS.
При работе в команде, действительно рассмотреть возможность использования управления версиями. Это делает вещи, которые намного легче отслеживать, и редактирование конфликтов, которые намного легче разрешить. Это действительно того стоит, даже если вы «просто» знакомы с HTML и CSS.
Не работать с
!important
. Не только потому, что IE = <7 не может справиться с этим. В сложной структуре использование!important
часто заманчиво для изменения поведения, источник которого не может быть найден, но это яд для долгосрочного обслуживания.Создание разумных классов
Вот как мне нравится создавать разумные занятия.
Сначала я применяю глобальные настройки:
Затем я идентифицирую основные разделы макета страницы - например, верхнюю область, меню, содержимое и нижний колонтитул. Если бы я написал хорошую разметку, эти области будут идентичны структуре HTML.
Затем я начинаю создавать классы CSS, определяя как можно больше предков, насколько это возможно, и группируя связанные классы как можно ближе.
Думайте о всей структуре CSS как о дереве со все более конкретными определениями, которые находятся дальше от корня. Вы хотите, чтобы количество классов было как можно ниже, и вы хотите повторять себя как можно реже.
Например, допустим, у вас есть три уровня навигационных меню. Эти три меню выглядят по-разному, но они также имеют определенные характеристики. Например, все
<ul>
они имеют одинаковый размер шрифта, и все элементы расположены рядом друг с другом (в отличие от отображения по умолчанию для anul
). Кроме того, ни одно из меню не имеет маркеров (list-style-type
).Сначала определите общие характеристики в классе с именем
menu
:затем определите конкретные характеристики каждого из трех меню. Уровень 1 - 40 пикселей в высоту; уровни 2 и 3, 20 пикселей.
Примечание: вы также можете использовать несколько классов для этого, но Internet Explorer 6 имеет проблемы с несколькими классами , поэтому в этом примере используется
id
s.Разметка для меню будет выглядеть так:
Если у вас есть семантически похожие элементы на странице - например, эти три меню - попробуйте сначала определить общие черты и поместить их в класс; затем определите конкретные свойства и примените их к классам или, если вам нужно поддерживать Internet Explorer 6, идентификаторы.
Разные советы по HTML
Если возможно, присвойте телу каждой страницы уникальный класс:
<body class='contactpage'>
это позволяет очень легко добавлять специфичные для страницы настройки в таблицу стилей:При автоматическом создании меню добавьте как можно больше контекста CSS, чтобы позже можно было использовать расширенные стили. Например:
Таким образом, каждый элемент меню доступен для стилизации в соответствии с его семантическим контекстом: будь то первый или последний элемент в списке; Будь то активный элемент в данный момент; и по номеру.
источник
font-weight: bold
здесь ... дисциплина - единственное лекарство :)id
но это точно звучит так. Может быть, концепцию можно уточнить?id
тоже может быть .Вот только 4 примера:
На все 4 мои ответы включали советы по загрузке и чтению PDF CSS-систем Натали Даун . (В PDF включены тонны заметок, которых нет на слайдах, так что читайте PDF!). Принять к сведению ее предложения по организации.
РЕДАКТИРОВАТЬ (2014/02/05) четыре года спустя, я бы сказал:
источник
Не пишите заголовки в CSS
Просто разделите разделы на файлы. Любые комментарии CSS, должны быть просто комментариями.
Используйте сценарий, чтобы объединить их в один; если необходимо. Вы даже можете иметь хорошую структуру каталогов, и просто ваш скрипт рекурсивно сканирует
.css
файлы.Если вы должны написать заголовки, имейте оглавление в начале файла
Заголовки в оглавлении должны полностью совпадать с заголовками, которые вы напишете позже. Больно искать заголовки. Чтобы добавить к проблеме, как кто-то должен знать, что у вас есть еще один заголовок после вашего первого? пс. не добавляйте doc-like * (звездочку) в начале каждой строки при написании оглавлений, это только делает более раздражающим выделение текста.
Пишите комментарии с правилами или в пределах правил, а не вне блока
Прежде всего, когда вы редактируете скрипт, есть вероятность 50/50, что вы обратите внимание на то, что находится за пределами блока правил (особенно, если это большой текстовый фрагмент;)). Во-вторых, нет (почти) ни одного случая, когда вам понадобился бы «комментарий» снаружи. Если это за пределами, это 99% времени названия, так что держите это так.
Разделить страницу на компоненты
Компоненты должны иметь
position:relative
, нетpadding
и нетmargin
, большую часть времени. Это упрощает% правила много, а также позволяют гораздо прощеabsolute:position
«ИНГИ элементов, так как если есть абсолютный позиционированный контейнер абсолютный позиционируемый элемент будет использовать контейнер при вычисленииtop
,right
,bottom
,left
свойства.Большинство DIV в документе HTML5 обычно являются компонентом.
Компонент также является чем-то, что можно считать независимой единицей на странице. С точки зрения непрофессионалов, относитесь к чему-то как к компоненту, если имеет смысл относиться к чему-то, как к черному ящику .
Повторюсь с примером страницы QA:
Разбивая страницу на компоненты, вы делите свою работу на управляемые блоки.
Положите правила с совокупным эффектом на одной линии.
Например
border
,margin
иpadding
(но неoutline
) все добавляют к размерам и размеру элемента, который вы стилизуете.Если они просто не читаются в одной строке, по крайней мере, поместите их в непосредственной близости:
Используйте стенографию, когда это возможно:
Никогда не повторять селектор
Если у вас есть больше экземпляров одного и того же селектора, есть большая вероятность, что вы неизбежно получите несколько экземпляров одних и тех же правил. Например:
Избегайте использования тегов в качестве селекторов, когда вы можете использовать идентификатор / классы
Прежде всего, теги DIV и SPAN являются исключением: вы никогда не должны их использовать, никогда! ;) Используйте их только для прикрепления класса / идентификатора.
Эта...
Должно быть написано так:
Потому что лишние висящие DIV там ничего не добавляют к селектору. Они также вынуждают ненужное правило тега. Например, если бы вы изменили
.answer
с adiv
на a,article
ваш стиль сломался бы.Или, если вы предпочитаете больше ясности:
Причина в том, что
border-collapse
свойство является специальным свойством, которое имеет смысл только применительно кtable
. Если.statistics
это не так, этоtable
не должно применяться.Общие правила - это зло!
Они не экономят ваше время, они заставляют вашу голову взорваться; а также сделать обслуживание кошмаром. Когда вы пишете правило, вы можете знать, где оно применяется, однако это не гарантирует, что ваше правило не будет связываться с вами позже.
Добавить к этому общие правила непонятно и сложно для чтения, даже если у вас есть представление о документе, который вы разрабатываете. Это не значит, что вы не должны писать общие правила, просто не используйте их, если вы действительно не хотите, чтобы они были общими, и даже они добавляют столько информации о области действия в селектор, сколько вы можете.
Вещи, как это ...
... имеет ту же проблему, что и использование глобальных переменных в языке программирования. Вы должны дать им возможности!
В основном это читается как:
Мне нравится использовать идентификаторы, когда компонент, который я знаю, является одиночным на странице; ваши потребности могут быть разными.
Примечание: в идеале, вы должны написать достаточно. Упоминание большего количества компонентов в селекторе, однако, является более прощающей ошибкой по сравнению с упоминанием меньшего количества компонентов.
Предположим, у вас есть
pagination
компонент. Вы используете его во многих местах на вашем сайте. Это было бы хорошим примером того, когда вы будете писать общее правило. Допустим, вамdisplay:block
даны ссылки на отдельные номера страниц и выделите темно-серый фон. Чтобы они были видны, у вас должны быть такие правила:Теперь предположим, что вы используете свою нумерацию страниц для списка ответов, вы можете столкнуться с чем-то вроде этого
Это сделает ваши белые ссылки черными, чего вы не хотите.
Неправильный способ исправить это:
Правильный способ исправить это:
Сложные «логические» комментарии не работают :)
Если вы напишите что-то вроде: «это значение зависит от бла-бла в сочетании с высотой бла-бла», это просто неизбежно, вы допустите ошибку и все упадет, как карточный домик.
Сделайте ваши комментарии простыми; если вам нужны «логические операции», рассмотрите один из тех языков шаблонов CSS, как SASS или LESS .
Как вы пишете цветной поддон?
Оставь это на конец. Есть файл для всего вашего цветового поддона. Без этого файла ваш стиль должен по-прежнему иметь пригодный для использования цветовой палитру в правилах. Ваш цветной поддон должен быть перезаписан. Вы связываете селекторы, используя родительский компонент очень высокого уровня (например
#page
), а затем пишете свой стиль как самодостаточный блок правил. Это может быть просто цвет или что-то еще.например.
Идея проста, ваша цветовая палитра - это таблица стилей, независимая от базового стиля, в который вы каскадируете .
Меньше имен, требуется меньше памяти, что облегчает чтение кода
Лучше использовать меньше имен. В идеале используйте очень простые (и короткие!) Слова: текст, тело, заголовок.
Я также считаю, что комбинация простых слов легче понять, чем суп из длинных «подходящих» слов: postbody, posthead, userinfo и т. Д.
Сохраняйте словарный запас небольшим, таким образом, даже если какой-то незнакомец придет, чтобы прочитать ваш суп стиля (как и вы через несколько недель;)), нужно только понимать, где используются слова, а не каждый селектор. Например, я использую
.this
каждый раз, когда элемент считается «выбранным элементом» или «текущим элементом» и т. Д.Убери за собой
Написание CSS - это как еда, иногда вы оставляете беспорядок. Убедитесь, что вы убрали этот беспорядок, иначе код мусора просто скопится. Удалите классы / идентификаторы, которые вы не используете. Удалите правила CSS, которые вы не используете. Убедитесь, что все хорошо, и у вас нет противоречивых или дублирующих правил.
Если вы, как я предлагал, рассматривали некоторые контейнеры как черные ящики (компоненты) в своем стиле, использовали эти компоненты в ваших селекторах и хранили все в одном выделенном файле (или правильно разделяли файл с оглавлением и заголовками), тогда ваш работать существенно проще ...
Вы можете использовать такой инструмент, как расширение Dust-Me Selectors для Firefox (совет: укажите его на свой sitemap.xml), чтобы помочь вам найти некоторые ненужные вещи, спрятанные в ваших ядерных бомбах css и карни.
Сохранить
unsorted.css
файлДопустим, вы разрабатываете сайт QA, и у вас уже есть таблица стилей для «страницы ответов», которую мы будем называть
answers.css
. Если вам теперь нужно добавить много нового CSS, добавьте его вunsorted.css
таблицу стилей, а затем рефакторинг в вашуanswers.css
таблицу стилей.Несколько причин для этого:
источник
Взгляните на 1. SASS 2. Компас
источник
Лучший способ борьбы с
CSS
раздутием - это использование объектно-ориентированных принципов CSS.Есть даже структура OOCSS , которая довольно хороша.
Некоторые из идеологий противоречат многим из того, что было сказано здесь в ответах, но как только вы поймете, как проектировать
CSS
объектно-ориентированным способом, вы увидите, что на самом деле это работает, чтобы поддерживать код в худшем состоянии.Ключевым моментом здесь является идентификация «объектов» или шаблонов строительных блоков на вашем сайте и разработка с их помощью.
Facebook наняла создателя OOCSS, Николь Салливан, чтобы получить большую экономию в своем коде внешнего интерфейса (HTML / CSS). Да , вы действительно можете получить экономию не только в вашем CSS, но в вашем HTML тоже, что по звуку, очень возможно для вас , как вы упоминаете преобразование
table
макета , основанного на многоdiv
-хЕще один замечательный подход в некоторых аспектах аналогичен OOCSS, заключается в том, чтобы с самого начала планировать и писать свой CSS, чтобы он был масштабируемым и модульным. Джонатан Снук (Jonathan Snook ) сделал блестящую книгу и книгу / книгу о SMACSS - масштабируемой и модульной архитектуре для CSS
Позвольте мне связать вас с некоторыми ссылками:
5 ошибок массивного CSS - (видео)
5 ошибок массивного CSS - (слайды)
CSS Bloat - (слайды)
источник
Вы также должны понимать каскад и вес, и как они работают.
Я заметил, что вы используете только идентификаторы классов (div.title). Знаете ли вы, что вы также можете использовать идентификаторы, и что идентификатор имеет больший вес, чем класс?
Например,
заставит все эти элементы иметь общий размер шрифта, скажем, или цвет, или каковы бы ни были ваши правила. Вы можете даже заставить все DIV, которые являются потомками # page1, получить определенные правила.
Что касается веса, помните, что оси CSS перемещаются от самых общих / самых легких к самым конкретным / самым тяжелым. То есть в селекторе CSS спецификатор элемента отменяется спецификатором класса, а спецификатор идентификатора. Числа учитываются, поэтому селектор с двумя спецификаторами элементов (ul li) будет иметь больший вес, чем селектор с одним спецификатором (li).
Думайте об этом как цифры. Число 9 в столбце единиц по-прежнему меньше единицы в столбце десятков. Селектор с идентификатором идентификатора, спецификатором класса и двумя спецификаторами элемента будет иметь больший вес, чем селектор без идентификатора, 500 спецификаторов класса и 1000 спецификаторов элемента. Конечно, это абсурдный пример, но вы поняли идею. Дело в том, что применение этой концепции поможет вам очистить CSS.
Кстати, добавление спецификатора элемента в класс (div.title) не является необходимым, если вы не столкнетесь с конфликтами с другими элементами, которые имеют class = "title". Не добавляйте ненужный вес, потому что вам может понадобиться использовать этот вес позже.
источник
.myclass
, вы выбираете все с помощью классаmyclass
. В CSS классы идентичны идентификаторам в этом отношении.Могу ли я предложить меньше CSS Dynamic Framework
Это похоже на SASS, как упоминалось ранее.
Это помогает поддерживать CSS для родительского класса.
Например
Что это делает: Применяет width: 100% к # child1 и # child2.
Кроме того, # child1 специфический CSS принадлежит #parent.
Это сделало бы
источник
Я считаю, что трудным является перевод необходимого дизайна для сайта в ряд правил. Если дизайн сайта понятен и основан на правилах, то из этого могут исходить имена ваших классов и структура CSS. Но если люди со временем случайным образом добавляют на сайт небольшие кусочки, которые не имеют особого смысла, то в CSS мало что можно сделать с этим.
Я склонен упорядочивать свои файлы CSS примерно так:
Сброс CSS, основанный на Эрике Мейере . (Потому что в противном случае я обнаружил, что для большинства элементов у меня есть по крайней мере одно или два правила, которые просто сбрасывают стили браузера по умолчанию - большинство моих списков, например, не выглядят как стиль HTML по умолчанию для списков.)
Грид-система CSS, если сайт требует этого. (Я основываю свой на 960.gs )
Стили для компонентов, которые появляются на каждой странице (верхние и нижние колонтитулы и т. Д.)
Стили для компонентов, которые используются в разных местах на сайте
Стили, которые актуальны только на отдельных страницах
Как видите, многое из этого зависит от дизайна сайта. Если дизайн понятен и организован, ваш CSS может быть. Если нет, вы облажались.
источник
Мой ответ на высоком уровне, чтобы ответить на проблемы высокого уровня, которые вы подняли в своем вопросе. Могут быть организационные уловки низкого уровня и настройки, которые вы можете сделать, чтобы сделать их красивее, но ни один из них не может исправить методологические недостатки. Есть несколько вещей, которые влияют на взрыв CSS. Очевидно, общая сложность сайта, но также такие вещи, как семантика имен, производительность CSS, организация файлов CSS и тестируемость / приемлемость.
Вы, кажется, находитесь на правильном пути с семантикой именования, но это может быть сделано еще дальше. Разделы HTML, которые неоднократно появляются на сайте без структурной модификации (так называемые «модули»), можно рассматривать как корни селектора, и оттуда вы можете настроить внутреннюю компоновку относительно этого корня. Это основной принцип объектно-ориентированного CSS , и вы можете прочитать / посмотреть больше об этом в этом выступлении инженера Yahoo .
Важно отметить, что этот чистый подход может работать вопреки заботе о производительности, которая предпочитает короткие селекторы на основе идентификатора или имени тега . Нахождение этого баланса зависит от вас, но если у вас нет массивного сайта, это должно быть просто руководство в задней части головы, напоминающее вам, чтобы ваши селекторы были короткими. Подробнее о производительности здесь .
И, наконец, у вас будет один файл CSS для всего сайта или несколько файлов (один базовый файл, используемый с файлами на страницу или раздел)? Один файл лучше для производительности, но может быть труднее понять / поддерживать с несколькими членами команды, и может быть сложнее для тестирования. Для тестирования я рекомендую иметь одну страницу CSS-теста, которая включает каждый поддерживаемый модуль CSS для тестирования коллизий и непреднамеренного каскадирования.
В качестве альтернативы вы можете использовать многофайловый подход , чтобы распространить правила CSS на страницу или раздел. Для этого браузер должен загрузить несколько файлов, что является проблемой производительности. Вы можете использовать программирование на стороне сервера для динамического определения и объединения (и минимизации) файлов CSS в один файл. Но так как эти файлы являются отдельными и тестирование для них будет отдельным, вы вводите возможность несовместимого внешнего вида на страницах / разделах. Таким образом, тестирование становится сложнее.
Это зависит от вас, чтобы проанализировать конкретные потребности клиента, соответственно сбалансировать эти проблемы.
источник
Как сказал до меня: попасть в OOCSS. Sass / Less / Compass заманчиво использовать, но пока ванильный CSS не будет использоваться правильно, Sass / Less / Compass будет только усугублять ситуацию.
Прежде всего, прочитайте о эффективной CSS. Попробуйте Google Page Speed и прочитайте, что Соудерс написал об эффективном CSS.
Затем введите OOCSS.
Это будет революционизировать каждый бит о написании CSS. Я полностью обновлен и люблю это.
ОБНОВЛЕНИЕ: SMACSS похож на OOCSS, но в целом проще для адаптации.
источник
Основные принципы разумного CSS, извлеченные из CSS Refactoring: от добавления только к модульному CSS
источник
Много раз я видел, как люди разбивают файл на разделы с заголовком комментария между разделами.
Что-то вроде
Он работает довольно хорошо и позволяет легко вернуться позже и найти то, над чем вы работаете.
источник
Вы должны посмотреть на БЭМ .
теория
BEM - это попытка предоставить набор инструкций для организации и присвоения имен селекторам css в попытке сделать вещи более пригодными для повторного использования и модульными и избежать столкновений между селекторами такого рода, которые часто приводят к спагетти-коду и головным болям специфичности.
Когда он используется правильно, он действительно имеет некоторые очень положительные эффекты.
BEM хорошо работает с SASS, чтобы привнести в CSS почти объектно-ориентированный стиль. Вы можете создавать модульные файлы, которые обрабатывают отображение одного элемента пользовательского интерфейса и содержат переменные, такие как цвета и «методы», например, как обрабатываются внутренние элементы. Хотя хардкорный ОО-программист может отказаться от этой идеи, на самом деле, применяемые концепции привносят множество более приятных частей ОО-структур, таких как модульность, слабая связь и тесная связь, а также возможность повторного использования без контекста. Вы даже можете создать способ, который выглядит как инкапсулированный объект, используя Sass и
&
оператор .Более подробную статью из Smashing Magazine можно найти здесь ; и один из Гарри Робертса из CCS Wizardry (который должен прочитать любой, кто связан с css) находится здесь .
На практике
Я использовал это несколько раз, наряду с использованием SMACSS и OOCSS, то есть у меня есть кое-что для их сравнения. Я также работал в некоторых больших беспорядках, часто моего собственного, неопытного создания.
Когда я использую БЭМ в реальном мире, я дополняю технику парой дополнительных принципов. Я использую служебные классы - хороший пример - класс-оболочка:
И я также несколько полагаюсь на каскад и специфику. Здесь модуль БЭМ будет
.primary-box
и.header
будет контекстом для конкретной перегрузки(Я изо всех сил стараюсь сделать все как можно более универсальным и контекстно-свободным, а это означает, что хороший проект - почти все в модулях, которые можно использовать повторно)
И последнее замечание, которое я хотел бы здесь отметить, заключается в том, что каким бы небольшим и несложным ни был ваш проект, вы должны сделать это с самого начала по двум причинам:
Веб-компоненты
В 2015 году мы начинаем смотреть на веб-компоненты. Я пока не знаю об этом огромном количестве, но они стремятся объединить все функциональные возможности внешнего интерфейса в автономные модули, эффективно пытаясь применить принципы BEM к внешнему интерфейсу в целом и разбросать компоненты, но полностью связанные друг с другом такие элементы, как фрагменты DOM, Js (MVC) и CSS, которые создают один и тот же виджет пользовательского интерфейса.
Делая это, они будут решать некоторые из первоначальных проблем, которые существуют с css, которые мы пытались решить с помощью таких вещей, как BEM, в то же время делая некоторые другие интерфейсные архитектуры более разумными.
Там какое - то дальнейшее чтение здесь , а также рамочное Polymer здесь что стоит посмотреть
в заключение
Я также думаю, что это превосходное, современное руководство по CSS, разработанное специально для того, чтобы не допустить беспорядка в больших проектах CSS. Я стараюсь следовать большинству из них.
источник
Я бы порекомендовал вам взглянуть на CSS-фреймворк "Compass Style" .
источник
здесь есть какой-то замечательный материал, а некоторые заняли много времени, чтобы ответить на этот вопрос, однако, когда речь идет о отдельных или отдельных таблицах стилей, я бы пошел с отдельными файлами для разработки, а затем перешел бы к использованию всех ваших общих CSS для объединенных сайтов. в один файл при развертывании.
таким образом вы получаете лучшее из обоих миров, повышаете производительность (меньше запросов HTTP запрашивается из браузера) и разделяете проблемы кода при разработке.
источник