Как удалить CSS спагетти в устаревшем веб-приложении? - PullRequest
10 голосов
/ 15 сентября 2010

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

Как вы переходите от устаревшего беспорядка CSS к очищенным, красиво каскадным таблицам стилей DRY?

Приложение, над которым я сейчас работаю, содержит 12000 строк CSS.Он вырос до этого размера органично, так как на ранних этапах не было стандартов или пересмотра CSS, единственное правило состояло в том, чтобы приложение соответствовало дизайну.Некоторые из проблем, которые у нас постоянно возникают:

  • Конфликтующие стили: один разработчик добавляет .header {font-weight: bold;}, но .header уже использовался в других модулях и не долженвыделите их жирным шрифтом.

  • Каскадные проблемы: Виджет Foo имеет .header, но также содержит список виджетов Bar с классами .header.

    • Еслимы определяем .foo .header {...} и .bar .header {...} все, что явно не перезаписано в foo, будет отображаться в строке.
    • Если мы определим .foo> .header и .bar> .header, но позже нужно изменить foo, чтобы обернуть заголовок в div, наши стили ломаются.
  • Проблемы наследования, мы постоянно переопределяем шрифты виджетов до 11px / normal, потому что некоторые верхниеКонтейнер использует высоту строки 12px / 18 px.

  • Борьба с библиотеками виджетов с использованием таких библиотек, как dojo / dijit или jquery ui, которые добавляют тонны стилей для функциональности, означает, что наш кодусеяны местами, где мы должны переусердствоватьИдея стилей библиотеки, чтобы все выглядело правильно.Существует около 2000 строк CSS только для настройки встроенных стилей dijit


Мы находимся в стадии, когда мы думаем о реализации следующих правил:

Пространство имен всех новых классов виджетов - если у вас есть виджет foo, все имена подклассов будут .foo_, поэтому мы получаем: .foo, .foo_header, .foo_content, .foo_footer.Это делает наш css по сути FLAT, но мы не видим другого способа организовать наш код дальше, не сталкиваясь с устаревшими стилями или каскадными проблемами, о которых я упоминал выше.

Полицейские универсальные стили - естьнебольшая кучка общих классов, которые должны применяться только в очень специфических ситуациях.например .editable - применяется к частям предложения, которые должны вызывать редактор - должен содержать только текстовые узлы.

Использовать миксины компилятора css Чтобы избежать многократного определения одних и тех же стилей в разных виджетах, определитеи использовать миксин.Хотя мы обеспокоены тем, что миксины тоже выйдут из-под контроля.

Как еще мы можем перейти от CSS-беспорядка, который постоянно вводит регрессии к чему-то поддерживаемому в будущем.

Ответы [ 2 ]

11 голосов
/ 15 сентября 2010

Мы используем руководство по стилю в виде простой HTML-страницы с примерами каждого правила CSS в таблице стилей.Очень просто сказать, добавляешь ли ты новое несовместимое правило, поскольку примеры выровнены друг над другом.

Пример, который мне нравится: http://getbootstrap.com/components/ (добавлено 2015)

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

Когда вы вносите изменения в стили, уже внесенные вИспользование: проверьте руководство по стилю.Если оно не меняется, это, вероятно, хорошо (вам может понадобиться немного поискать, если вы только что что-то изменили, включая проблемы с блочной моделью или шириной, высотой, отступами, полями в целом).

Как перейти от устаревшего беспорядка CSS к очищенным, красиво каскадным таблицам стилей DRY?

Использовать руководство по стилю в качестве модульного теста .После того, как вы получили в нем важные части: уменьшите, измените рефакторинг и объедините (вы, скорее всего, найдете некоторые коллизии между .campaign_1 span и вашими обычными правилами, наследование может стать вашим другом).

Конфликтующие стили:один разработчик добавляет .header {font-weight: bold;}, но .header уже использовался в других модулях и не должен выделяться жирным шрифтом в них.

В ответ на комментарий Адриано Вароли Пьяццы ицитата выше: я не вспоминаю это как проблему, полностью принадлежащую CSS, но больше к разметке HTML.Неважно, что вы делаете, это будет тяжелая работа.Решите, какое правило вы хотите сохранить, и примите меры по его устранению;например: через наследование: #news a .header { ... } или переименование HTML-класса a .stand_out_header { ... }.

Об этой идее

Пространство имен всех новых классов виджетов - если у вас есть виджет fooвсе имена подклассов будут .foo_, поэтому мы получаем: .foo, .foo_header, .foo_content, .foo_footer.Это делает наш css по сути FLAT, но мы не видим другого способа организовать наш код вперед, не сталкиваясь с устаревшими стилями или каскадными проблемами, о которых я упоминал выше.

Вместо этого используйте содержащий элемент, который будетгораздо проще в обслуживании:

<div id="widget_email">
  <h2>One type of h2</h2>
</div>
<div id="widget_twitter">
  <h2>Another h2</h2>
</div>
1 голос
/ 15 сентября 2010

Я считаю, что метод «пространства имен» и ограничения конфликтов в CSS разделен на разные, включая то, что вы хотите применить, поэтому каждая страница вызывает только то, что ей нужно. Конфликтующие правила можно затем сделать более конкретными, просто определив их более конкретно:

  • общие css для всех страниц
    • CSS для страниц в разделе A
    • CSS для страниц в разделе B

Так что, если вы найдете модификацию .header, добавленную вами в общий css, работающую в A, но не в B, вы просто переместите ее в нижний файл CSS.

Да, это предполагает загрузку большего количества файлов. Есть способы обойти это с серверными языками, такими как чтение всех файлов с помощью php и отправка только одного блока контента.

...