Использование ресурсов Rails 3.1 для условного использования определенных CSS - PullRequest
166 голосов
/ 20 августа 2011

Я нахожусь в процессе создания моего первого сольного приложения на Rails с использованием Rails 3.1.rc5. Моя проблема в том, что я хочу, чтобы мой сайт отображал различные CSS-файлы условно. Я использую Blueprint CSS и пытаюсь заставить звездочки / рельсы рендерить screen.css большую часть времени, print.css только при печати и ie.css только при доступе к сайту из Internet Explorer.

К сожалению, команда *= require_tree по умолчанию в манифесте application.css включает в себя все, что находится в каталоге assets/stylesheets, и приводит к неприятному беспорядку CSS. Мой текущий обходной путь - это своего рода метод грубой силы, в котором я задаю все индивидуально:

В приложении. Css:

*= require_self
*= require home.css
...
*= require blueprint/screen.css

В моих таблицах стилей частично (haml):

<!--[if lt IE 9]
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
![endif]-->
= stylesheet_link_tag "application"
= stylesheet_link_tag 'blueprint/print', media: 'print'
<!--[if lt IE8]]
= stylesheet_link_tag 'blueprint/ie'
![endif]-->
= javascript_include_tag "application"

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

Спасибо!

Ответы [ 3 ]

223 голосов
/ 01 сентября 2011

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

То, что вы хотите сделать, это использовать отдельные файлы манифеста, чтобы разбить вещи. Сначала вам нужно реорганизовать папку app/assets/stylesheets:

app/assets/stylesheets
+-- all
    +-- your_base_stylesheet.css
+-- print
    +-- blueprint
        +-- print.css
    +-- your_print_stylesheet.css
+-- ie
    +-- blueprint
        + ie.css
    +-- your_ie_hacks.css
+-- application-all.css
+-- application-print.css
+-- application-ie.css

Затем вы редактируете три файла манифеста:

/**
 * application-all.css
 *
 *= require_self
 *= require_tree ./all
 */

/**
 * application-print.css
 *
 *= require_self
 *= require_tree ./print
 */

/**
 * application-ie.css
 *
 *= require_self
 *= require_tree ./ie
 */

Затем вы обновите файл макета приложения:

<%= stylesheet_link_tag "application-all", :media => "all" %>
<%= stylesheet_link_tag "application-print", :media => "print" %>

<!--[if lte IE 8]>
    <%= stylesheet_link_tag "application-ie", :media => "all" %>
<![endif]-->

Наконец, не забудьте включить эти новые файлы манифеста в ваш config / environment / production.rb:

config.assets.precompile += %w( application-all.css application-print.css application-ie.css )

Обновление:

Как отметил Макс, если вы следуете этой структуре, вы должны помнить о ссылках на изображения. У вас есть несколько вариантов:

  1. Перемещение изображений в соответствии с тем же шаблоном
    • Обратите внимание, что это работает, только если изображения не являются общими для всех
    • Я ожидаю, что это будет не стартер для большинства, поскольку это слишком усложняет
  2. Укажите путь к изображению:
    • background: url('/assets/image.png');
  3. Используйте помощника SASS:
    • background: image-url('image.png');
10 голосов
/ 18 октября 2012

Сегодня столкнулся с этой проблемой.

Закончилось помещение всех специфических для IE таблиц стилей в lib / assets / stylesheets и создание одного файла манифеста для каждой версии IE.Затем в application.rb добавьте их в список вещей для прекомпиляции:

config.assets.precompile += ["ie9.css", "ie7.css", "ie8.css", "ie.css"]

И в ваших макетах условно включите эти файлы манифеста, и все готово!

2 голосов
/ 25 апреля 2012

Это довольно аккуратный способ сделать это. Я использую условные классы на html или modernizr. Смотрите эту статью для хорошего представления о том, что делает что. Modernizr-против-условных классов-на-HTML

...