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

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

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

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

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

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

    • If we define .foo .header { ... } and .bar .header { ... } anything not explicitly overwritten in foo will show up in bar.
    • Если мы определим .foo> .header и .bar> .header, но позже потребуется изменить foo, чтобы обернуть заголовок в div, наши стили сломаются.
  • Проблемы с наследованием, мы постоянно переопределяем шрифты виджета на 11 пикселей / нормальный, потому что в некоторых верхних контейнерах используется высота строки 12 пикселей / 18 пикселей.

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


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

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

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

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

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


person case nelson    schedule 15.09.2010    source источник


Ответы (2)


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

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

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

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

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

Используйте руководство по стилю в качестве модульного теста. Как только вы получите в нем важные части: сокращение, рефакторинг и комбинирование (вы, скорее всего, найдете некоторые коллизии между .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 по существу ПЛОСКИМ, но мы не видим другого способа организовать наш код в дальнейшем без столкновения с устаревшими стилями или каскадными проблемами, о которых я упоминал выше.

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

<div id="widget_email">
  <h2>One type of h2</h2>
</div>
<div id="widget_twitter">
  <h2>Another h2</h2>
</div>
person chelmertz    schedule 15.09.2010
comment
как насчет случая, когда он упоминает правила, противоречащие одной странице и другой? - person Adriano Varoli Piazza; 15.09.2010
comment
Идея руководства по стилю просто фантастическая. - person case nelson; 18.09.2010
comment
Используйте руководство по стилю в качестве модульного теста. Это, наверное, лучший совет по CSS, который я когда-либо читал. - person Will Tomlins; 15.02.2013
comment
Думаю, я понимаю его идею о читаемом руководстве по стилю, но за прошедшие годы кто-нибудь обнаружил пример или статью, расширяющую эту идею? - person Greg Bell; 02.04.2015
comment
@GregBell Я бы сказал так: Bootstrap, у CSS-трюков есть Руководства по стилю CSS, KSS - это инструмент для поддержки руководства по стилю внутри самого CSS. Примеров должно быть еще много. - person chelmertz; 02.04.2015

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

  • general css for all pages
    • css for pages in section A
    • css для страниц в разделе B

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

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

person Adriano Varoli Piazza    schedule 15.09.2010
comment
К сожалению, для этого текущего приложения у нас есть только одна страница - весь контент загружается с помощью ajax и шаблонов на стороне клиента, и наш единственный выбор здесь - загрузить ВСЕ css. - person case nelson; 15.09.2010
comment
Что ж, тогда, если нет возможности загрузить css с помощью ajax, я думаю, что в этом случае применим другой ответ. - person Adriano Varoli Piazza; 16.09.2010