Původně jsem psal všechny styly v CSS. Pak jsem přešel na less, ale skončil jsem u Sass (soubory s koncovkou .scss). Důvodem pro použití byla možnost psát proměnné (variables) pro barvy, ale to dnes CSS umí také (custom properties), i když ne tak elegantně. A hlavní důvod pro Sass je možnost rozdělovat styly do menších souborů podle použití a přes @import je spojovat.
Adresářová struktura scss (Sass)
Používám Webpack Encore a tak mám všechny assets soubory ve složce /assets/scss/.
/modules – např. barvy _colors.scss, _mixins.scss, _variables.scss
/partials – rozdělení podle použití např. _buttons.scss, _aside.scss, _main.scss
/responsive – rozdělení podle obrazovky _xs.scss, _sm.scss, _md.scss, _lg.scss, _xl.scss
/vendor – sem přidávám „cizí“ styly, které jsem nepsal já
Prefix „_“ (podtržítko) používám pro „privátní“ soubory, které pouze někde importuji, ale nepoužívám samostatně. V importech se mohou přidávat bez prefixu. např. @import „./scss/partials/main“;
Použití relativní cesty k obrázkům
Jak např. řeším styl ikonky „koupání“
background: url(../../images/fa/moje-koupani-zelena-16.png);
Webpack Encore přepíše url „../../images/“ na „/build/images/“ + kopíruje soubor „moje-koupani-zelena-16.png“ do /public/build/images/, takže vše funguje jak má.
Sass proměnné
Proměnné jsou základ pro znovupoužití hodnot bez kopírování znovu a znovu dokola.
Příklad proměnné v SASS:
$main-bg-color: brown
element {
background-color: $main-bg-color;
}
Příklad proměnné v CSS:
--main-bg-color: brown
element {
background-color: var(--main-bg-color);
}
Sass @import
S pomocí Sass lze styly rozdělovat do přehledných malých souborů podle jejich účelu a ty se pak s pomocí @import spojí při kompilaci do konečné podoby CSS.
Pozor, CSS zná také příkaz @import, ale ten funguje tak, že se soubor importuje až při vykreslování stránky v dalším HTTP requestu ! A CSS v importech neumí oddělovač čárku, každý soubor musí mít svůj vlastní @import.
// style.scss
@import 'foundation/code', 'foundation/lists';
Jak psát styly čistě, přehledně a bez chyb ?
Na odhalování chyb, zpřehlednění stylů a správného pořadí pravidel používám stylelint.
npm i -D stylelint
Pro snadné spouštění mám v package.json skript:
"stylelint": "stylelint \"**/*.scss\""
Nástroj stylelint např. háže chybu, pokud mám styl přiřazen ID místo class např.
#show-modal { display: inline-block; position: relative; float: right; } stylelint vyhodí chybu: Expected "#show-modal" to have no more than 0 ID selectors
Použití ID elementu pro selector je v pořádku, ale pokud komponentu začnu používat na jiném místě, tak nastane problém s duplicitou. Nebo pokud původní návrh stránky byl špatný a muselo se to přeskupovat. Proto se doporučuje používat selector přes „class“.
Přečtěte si článek How to lint SCSS with stylelint.
Pokyny pro stylelint se dají nastavit např. použitím sady https://github.com/bjankord/stylelint-config-sass-guidelines. Tato sada vychází z pokynů https://sass-guidelin.es/.
Instalace stylelint-config-sass-guidelines
npm i -D stylelint-config-sass-guidelines
Vytvořím soubor .stylelintrc.json v root projektu a přidám do něj:
{ "extends": "stylelint-config-sass-guidelines" }
Psaní bez prefixů s autoprefixerem
Nemuset řešit rozdíly v prohlížečích při psaní stylů urychlí práci. Nástroj autoprefixer bere nejpopulárnější prohlížeče a na základě nalezených stylů vytvoří prefixy např. pro webkit, moz, ie. Používat prefixy doporučuje Google, používá ho např. Twitter.
Autoprefixer se dá používat jako plugin pro PostCSS.
Např. pro barvu placeholderu
::placeholder { color: gray; }
vytvoří autoprefixer toto:
::-moz-placeholder { color: gray; } :-ms-input-placeholder { color: gray; } ::placeholder { color: gray; }
Instalace autoprefixer jako plugin Postcss
npm i autoprefixer -D
Vytvořím si soubor postcss.config.js v root složce projektu a přidám do něj:
module.exports = { plugins: [ require('autoprefixer') ] }
Ve Webpack Encore si přidám .enablePostCssLoader().