Właściwa struktura aktywów SCSS w Rails
Więc mam app/assets/stylesheets/
strukturę katalogów, która wygląda mniej więcej tak:
|-dialogs
|-mixins
|---buttons
|---gradients
|---vendor_support
|---widgets
|-pages
|-structure
|-ui_elements
W każdym katalogu znajduje się wiele częściowych sass (Zwykle *.css.scss, ale jeden lub dwa *.css.scss.erb).
Mogę zakładać wiele, ale rails powinien automatycznie kompilować wszystkie pliki w tych katalogach z powodu *= require_tree .
w aplikacji.css, tak?
Ostatnio próbowałem zrestrukturyzować te pliki, usuwając wszystkie zmienne kolorów i umieszczając je w pliku w katalogu głównym app/assets/stylesheets
folder (_colors.css.scss). Następnie utworzyłem plik w katalogu głównym app/assets/stylesheets
o nazwie master.css.scss który wygląda tak:
// Color Palette
@import "colors";
// Mixins
@import "mixins/buttons/standard_button";
@import "mixins/gradients/table_header_fade";
@import "mixins/vendor_support/rounded_corners";
@import "mixins/vendor_support/rounded_corners_top";
@import "mixins/vendor_support/box_shadow";
@import "mixins/vendor_support/opacity";
Nie bardzo rozumiem, jak rails radzi sobie z kolejnością kompilacji aktywów, ale oczywiście nie jest to na moją korzyść. Wygląda na to, że żaden z plików nie zdaje sobie sprawy, że mają jakieś zmienne lub mixiny importowane, a więc rzuca błędy i nie mogę skompilować.
Undefined variable: "$dialog_divider_color".
(in /home/blah/app/assets/stylesheets/dialogs/dialog.css.scss.erb)
Undefined mixin 'rounded_corners'.
(in /home/blah/app/assets/stylesheets/widgets.css.scss)
Zmienna $dialog_divider_color
jest jasno zdefiniowana w _colors.css.scss, a _master.css.scss
importuje kolory i wszystkie moje mixiny. Ale widocznie rails nie dostali tej notki.
Czy Jest jakiś sposób, aby naprawić te błędy, czy będę musiał uciekać się do umieszczania wszystkich definicji zmiennych z powrotem w każdym pojedynczym pliku, jak również wszystkich importów Mixin?
Niestety, ten facet nie myśli, że to możliwe, ale mam nadzieję, że się myli. Wszelkie myśli są bardzo mile widziane.5 answers
Problem z CSS polega na tym, że nie chcesz automatycznie dodawać wszystkich plików. Kolejność wczytywania i przetwarzania arkuszy przez przeglądarkę jest niezbędna. Tak więc zawsze będziesz wyraźnie importować cały swój css.
Jako przykład, powiedzmy, że masz normalizować.arkusz css , aby uzyskać domyślny wygląd zamiast wszystkich okropnych różnych implementacji przeglądarki. Powinien to być pierwszy plik wczytany przez przeglądarkę. Jeśli przypadkowo umieścisz ten arkusz gdzieś w Twój css importuje, wtedy nie tylko nadpisuje domyślne style przeglądarki, ale także wszelkie style zdefiniowane we wszystkich plikach css, które zostały załadowane przed nim. To samo dotyczy zmiennych i mieszanin.
Po obejrzeniu prezentacji przez Roy Tomeij na Euruko2012 zdecydowałem się na następujące podejście, jeśli masz dużo CSS do zarządzania.
Generalnie stosuję takie podejście:
- Zmień nazwę wszystkich istniejących .pliki css do .scss
- Usuń całą zawartość z podanie.scss
Zacznij dodawać dyrektywy @ import do application.scss
.
Jeśli używasz Twittera Bootstrap i kilku własnych arkuszy css, musisz najpierw zaimportować bootstrap, ponieważ ma arkusz do resetowania stylów.
Więc dodajesz @import "bootstrap/bootstrap.scss";
do swojego application.scss
.
Bootstrap.plik scss wygląda następująco:
// CSS Reset
@import "reset.scss";
// Core
@import "variables.scss";
@import "mixins.scss";
// Grid system and page structure
@import "scaffolding.scss";
// Styled patterns and elements
@import "type.scss";
@import "forms.scss";
@import "tables.scss";
@import "patterns.scss";
A Twój application.scss
Plik wygląda następująco:
@import "bootstrap/bootstrap.scss";
Ze względu na kolejność importu, możesz teraz używać zmiennych, ładowanych z @import "variables.scss";
w dowolnym innym .scss
plik zaimportowany po nim. Więc mogą być używane w type.scss
w folderze bootstrap, ale także w my_model.css.scss
.
Następnie utwórz folder o nazwie partials
lub modules
. To będzie miejsce większości innych plików. Możesz po prostu dodać import do pliku application.scss
, aby wyglądał następująco:
@import "bootstrap/bootstrap.scss";
@import "partials/*";
Teraz, jeśli zrobisz trochę css do stylu artykułu na swojej stronie głównej. Wystarczy utworzyć partials/_article.scss
i zostanie ona dodana do skompilowanego application.css
. Ze względu na kolejność importu możesz również użyć dowolnych mixinów bootstrap i zmiennych we własnych plikach scss.
Jedyną wadą tej metody, jaką do tej pory znalazłem, jest to, że czasami trzeba wymusić przekompilowanie częściowego/*.pliki scss, ponieważ rails nie zawsze robi to za Ciebie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-28 16:46:49
Utwórz następującą strukturę folderów:
+ assets
|
--+ base
| |
| --+ mixins (with subfolders as noted in your question)
|
--+ styles
|
--+ ...
W folderze base
Utwórz plik " globals.css.scss". W tym pliku zadeklaruj wszystkie importowane pliki:
@import 'base/colors';
@import 'base/mixins/...';
@import 'base/mixins/...';
W aplikacji.css.scss, powinieneś wtedy mieć:
*= require_self
*= depends_on ./base/globals.css.scss
*= require_tree ./styles
I jako ostatni krok (jest to ważne) zadeklaruj @import 'base/globals'
w każdym pliku stylu, w którym chcesz użyć zmiennych lub mieszanin. Możesz wziąć to pod uwagę, ale podoba mi się pomysł, że musisz deklarować zależności swoich stylów w każdym pliku. Z oczywiście ważne jest, aby importować tylko mixiny i zmienne w globalach.css.scss, ponieważ nie dodają definicji stylów. W przeciwnym razie definicje stylów będą zawarte wiele razy w wstępnie skompilowanym pliku ...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-08 13:18:42
Aby używać zmiennych i takich między plikami, musisz użyć dyrektywy @ import. pliki są importowane w określonej kolejności.
Następnie użyj aplikacji.css wymaga pliku deklarującego import. to jest sposób na osiągnięcie pożądanej kontroli.
Wreszcie, w twoim układzie.plik erb, możesz określić, którego pliku css użyć
Przykład będzie bardziej pomocny:
Załóżmy, że masz dwa moduły w swojej aplikacji, które wymagają różnych zestawów css: "aplikacja" i "admin"
Pliki
|-app/
|-- assets/
|--- stylesheets/
| // the "master" files that will be called by the layout
|---- application.css
|---- application_admin.css
|
| // the files that contain styles
|---- config.scss
|---- styles.scss
|---- admin_styles.scss
|
| // the files that define the imports
|---- app_imports.scss
|---- admin_imports.scss
|
|
|-- views/
|--- layouts/
|---- admin.html.haml
|---- application.html.haml
Oto jak wyglądają pliki w środku:
-------- THE STYLES
-- config.scss
// declare variables and mixins
$font-size: 20px;
-- app_imports.scss
// using imports lets you use variables from `config` in `styles`
@import 'config'
@import 'styles'
-- admin_imports.scss
// for admin module, we import an additional stylesheet
@import 'config'
@import 'styles'
@import 'admin_styles'
-- application.css
// in the master application file, we require the imports
*= require app_imports
*= require some_other_stylesheet_like_a_plugin
*= require_self
-- application_admin.css
// in the master admin file, we require the admin imports
*= require admin_imports
*= require some_other_stylesheet_like_a_plugin
*= require_self
-------- THE LAYOUTS
-- application.html.haml
// in the application layout, we call the master css file
= stylesheet_link_tag "application", media: "all"
-- admin.html.haml
// in the admin layout, we call the admin master css file
= stylesheet_link_tag "application_admin", media: "all"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-17 20:51:30
Zgodnie z to pytanie , można tylko używać application.css.sass
w celu zdefiniowania importu i współdzielenia zmiennych między szablonami.
= > wydaje się, że to tylko kwestia nazwy.
Innym sposobem może być dołączenie wszystkiego i wyłączenie tego potoku .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:37
Miałem bardzo podobny problem. Pomogło mi umieszczenie podkreślenia do instrukcji @ import podczas importowania częściowego. Więc
@import "_base";
Zamiast
@import "base";
To może być dziwny błąd...Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-13 08:20:42