CSS в отдельном файле или нет? - PullRequest
10 голосов
/ 30 мая 2009

Какой вариант лучше: хранить CSS в отдельном файле или на той же странице?

Давайте забудем тот факт, что изменение CSS в файле заставляет его применять все HTML-страницы напрямую. Я использую динамические языки для генерации всего вывода - так что это не имеет значения.

Несколько вещей, о которых я могу думать:

  1. CSS в отдельном файле генерирует меньшую нагрузку на полосу пропускания.
  2. CSS для отдельного файла требуется еще один HTTP-запрос.

С другой стороны, если я сожму передачу данных с помощью Zlib, CSS на той же странице не должен иметь значения с точки зрения пропускной способности, правильно? Итак, я получаю на один HTTP-запрос меньше?

Ответы [ 7 ]

30 голосов
/ 30 мая 2009

Основным преимуществом внешнего файла CSS является то, что:

  • Может использоваться на нескольких страницах; и
  • Он может быть кэширован, поэтому его не нужно загружать на каждую страницу.

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

Существует несколько общих шаблонов для динамически генерируемого CSS.

1. Генерация подмножества для страницы

Я видел это иногда. Разработчик решает ограничить количество CSS на странице, отправляя только то, что необходимо. Я не думаю, что это так, но я упоминаю это для полноты. Это ошибочное усилие при оптимизации. Дешевле отправить весь лот и просто эффективно его кешировать.

2. Выбранная пользователем тема

Если пользователь выбирает конкретный вид вашего сайта, это то, о чем я говорю. Это подразумевает, что они могут выбрать целый пакет CSS, и их выбор может быть ограниченным. Обычно это делается с помощью одного или нескольких базовых CSS-файлов, а затем одного или нескольких тематических CSS-файлов. Лучшее решение здесь - отправить правильную комбинацию внешних файлов CSS, динамически генерируя заголовок страницы с правильными <link> элементами и затем эффективно кэшируя эти файлы.

3. Пользовательская тема

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

Динамическое содержимое может быть лучшим на странице, или вы все еще можете использовать внешние файлы, потому что нет никаких причин, по которым <link> не может указывать на скрипт вместо статического файла . Например:

<link rel="stylesheet" href="/css/custom.php?user=bob" type="text/css"> 

где строка запроса генерируется динамически вашим заголовком от того, кто вошел в систему. Этот скрипт будет искать пользовательские настройки и генерировать динамический файл CSS. Это может быть эффективно кэшировано, тогда как размещение его непосредственно в файле HTML невозможно (если только весь файл HTML не может быть эффективно кэширован).

4. Генерация CSS на основе правил

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

<link rel="stylesheet" href="/css/report.annual-sales.0001.css" type="text/css"> 

где 'year-sales' - идентификатор отчета, а 0001 - как версия. Когда правила меняются, вы создаете новую версию, и каждая версия для каждого отчета может эффективно кэшироваться.

Заключение

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

Я писал о проблеме эффективного CSS в Повышение качества CSS в PHP , но принципы и методы применимы на любом языке, не только в PHP.

Вы также можете обратиться к связанному вопросу Несколько файлов javascript / css: лучшие практики?

14 голосов
/ 30 мая 2009

Существует метод, который применяют и Google, и Yahoo, который использует встроенный CSS. В первый раз посетители ради быстрой загрузки встраивают CSS (и даже JavaScript) в HTML, а затем в фоновом режиме скачивают отдельные файлы CSS и JS в следующий раз.

Стив Соудерс (Yahoo!) пишет следующее:

[...] лучшее решение, как правило, развернуть JavaScript и CSS как внешние файлы. Единственное исключение Я видел, где встраивание предпочтительнее с домашними страницами, такими как Yahoo! титульный лист (http://www.yahoo.com) и Мой Yahoo! (http://my.yahoo.com). Главная страницы, на которых мало (возможно, только одна) просмотр страницы за сеанс может обнаружить, что включение JavaScript и CSS приводит к быстрое время отклика конечного пользователя.

1 голос
/ 31 мая 2009

Да и нет. Используйте файл .css для большинства правил; Ваш сайт должен выглядеть одинаково. Для редких, особых случаев или динамически генерируемых правил вы можете использовать встроенный 'style = ""'. Все, что прилипает, должно перемещаться в .css, хотя бы для того, чтобы облегчить переход, смешивание и т. Д.

1 голос
/ 30 мая 2009

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

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

  1. Перечислите все несколько сотен изображений в правилах в отдельном статическом файле CSS, затем сгенерируйте соответствующее имя класса в динамическом HTML или
  2. Сгенерируйте HTML с одним именем класса, затем при последующем запросе сгенерируйте CSS с правилом для этого имени, которое использует желаемое изображение, или
  3. Выполните (2), но сгенерируйте CSS, встроенный в HTML, в одном запросе

(1) избегает повторного выполнения дорогостоящих вычислений состояния, но требует большего удара по трафику (больше пакетов для перемещения намного большего файла CSS). (2) Делает вычисление состояния дважды, но обслуживает меньший файл CSS. Только (3) вычисляет состояние один раз и передает результат в одном HTTP-запросе.

1 голос
/ 30 мая 2009

Я всегда использую смесь обоих.

  • стили для всего сайта находятся в отдельном файле ( минимизировано & gzipped ),
  • любые специфичные для страницы стили помещаются в <style> (я настроил свои шаблоны страниц, чтобы в любое время можно было легко вставлять фрагменты CSS в <head>).
1 голос
/ 30 мая 2009

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

Так что, если CSS не совсем статичен, его размещение на странице требует меньше времени.

0 голосов
/ 30 мая 2009

Держите это отдельно. HTML для цента, CSS для стиля, JavaScript для логики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...