Nadpisywanie stylów czyli ładowanie określonego pliku css jako ostatni

Witam,
posiadam obecnie aplikację (rails3) do której chciałbym zmienić część stylów - chciałbym jednak te zmiany zapisywać w nowym pliku (żeby nie naruszać oryginalnej, dość rozbudowanej struktury zdefiniowanych już reguł css) - chodzi mi np. o to, że ten plik przechowywałby tylko te wartości, które chciałbym zmienić w bieżącym layoucie np.:

plik: main.css .image{ display: inline-block; width: 100px; height: 50px; }

plik: superduperchanges.css .image{ display: block; }
Jak sprawić, żeby wartość display z pliku main.css została nadpisana przez tą z superduperchanges.css? Słyszałem, że trzeba sprawić, żeby ten plik superduperchanges.css był ładowany przez aplikację jako ostatni - ale jak to zrobić? plz help

w application.css musisz ustawić po kolei, które pliki mają być łądowane których z railcastów, dotyczących rails 3.1 pokazywał jak to dokładnie rozwiązać. Oczywiście musisz mieć rails >=3.1 w starszych wersjach to w pliku szablonu określasz kolejność plików.

ok ustawione, niestety nie działa - tzn. style nie są nadpisywane - czy może powinienem do każdej modyfikacji z pliku superduperchanges.css dodać !important;?

EDIT:

ok znalazłem tego railscasta (#268), dzięki za pomoc, spróbuję zrobić wg. wskazówek

niestety, tipsy z railscasta odnośnie zastosowania sass i @import “plik.css” nie zadziałało :confused: jakieś jeszcze pomysły/sugestie?

która wersja Railsów, i jak zapisujesz odwołania do plików styli, bez kod to można tylko strzelać.

Rails 3.2.1

odwołania znajdują się w pliku application.css.
Samo odniesienie się do niego w głównym layoucie(haml) wygląda tak:

= stylesheet_link_tag :application, :media => "all"

nie jestem pewien czy o to chodziło?

a jak wygląda plik application.css[.scss/.sass]

najpierw było coś takiego:

[code]/*
*= require main
*= require_self
*= require_tree .
*= require changes

*/[/code]
później było odkomentowane wszystko - też nie działało, później zgodnie z raislcastami usunięte _tree, zmiana rozszerzenia na .css.scss i dodanie @import - też nic :confused:

Nadpisywanie css w ten sposób jest moim zdaniem najgorsza rzeczą jaką możesz zrobić…

Zamiast kombinować z kolejnością ładowania plików spróbuj swoje nowe style zdefiniowac tak aby były bardziej dokładne niż oryginały, czyli jak masz w oryginale:

 a {color: red}

to u siebie daj np:

 body a {color: green}

Css ma to do siebie ze najważniejsze są dla niego style najdokładniej dopasowane do danego elementu. I tak to powinno banglać. W kodzie ruby chyba nie nadpisujesz metod w plikach ładowanych na koncu?

ok, spróbuję zrobić tak jak mi polecałeś. Co do tego nadpisywania metod - tylko gdzieś słyszałem/czytałem że taki myk można zrobić - tylko nie wiem czy railsach i czy nie trzeba czegoś dodatkowo dopisać (jakiś js czy coś)

możesz również w w application.css ladować każdy css z osobna, wtedy będziesz w pełni panował nad kolejnością ładowania plików, ale uwaga, jak będziesz chciał skorzystać z tego rozwiązanie to nie używaj require_tree . bo ono ładuje wszystkie pliki z drzewa, możesz też zrobić tak że wrzucisz wszystkie css do jakiegos podfolderu a ten jeden zostawisz na obecnym miejscu, wtedy wszystkie css poza tym jednym możesz załadować za pomocą require_tree podfolder/ (lub jakoś tak) a ten jeden ladujesz przez require. O tym też chyba było na railscast

problem rozwiązany: działa sposób z dodaniem kolejnego *= require w pliku application.css, ale zadziałało dopiero po tym, jak zmieniłem nazwę pliku na main_defaults.css (nadpisuje style z main.css i innych - nie czaję dlaczego wcześniej to nie działało - na pewno nie miałem nigdzie literówki - ktoś to potrafi wytłumaczyć?) anyway, dzięki za pomoc :slight_smile:

Nie zgodzę się. Tzn. nie bezwarunkowo. Jeśli to jest ogólna praktyka w jakichkolwiek plikach css, to krzyż na drogę.

Za to jest miejsce, w którym coś takiego się sprawdza. Jeśli masz jakiś css bazowy, który raczej się nie zmienia, jeśli chodzi o konwencję (na przykład ostatnio modny bootstrap.css lub znany reset.css od Erica Meyera).

Polecam technikę:

  1. Plik z requireami o nazwie layoutu, na przykład application, admin itp.
  2. Folder o tej samej nazwie z ogólnymi plikami

Wtedy na przykład zawartość pliku wygląda tak:

admin.css.sass:

//=require bootstrap //=require_tree ./admin
Wtedy style z bootstrap lub reset zostaną wczytane pierwsze. Wczytanie całego katalogu admin wymusi tworzenie szerszych definicji pomiędzy poszczególnymi cssami, ale oszczędzi nam tego przy nadpisywaniu definicji bootstrap / reset (co tym bardziej w przypadku tego drugiego jest porządane.

dzięki sarniak, w sumie też dobry pomysł :slight_smile: