[CSSチュートリアル】SCSS50%スタイルコード削減のための14の実践レッスン
前書き
SassはCSS3言語の拡張で、より良いスタイルシートをより少ない労力で書くことができ、重複した作業から解放され、よりクリエイティブな作業ができるようになります。変化をより早く受け入れることができるため、デザインの革新も敢行できるようになります。Sassの構文は比較的シンプルですが、難しいのは、Sassを実際のプロジェクトにどのように適用し、CSSのペインポイントを解決し、私たちの効率を向上させるか、ということです。実際のプロジェクトを経て、以下の14の実践的な経験をまとめ、共有することで、皆様の思考の幅を広げ、より良いSassの実プロジェクトへの適用に役立てたいと考えています。今回のプロジェクトでは、伝統的なCSSライクな構文であるScssを使用しましたので、以下のプロジェクト体験のまとめは、Scssを例にしています。
1. 変数 $ の使用
色、ボーダーサイズ、画像パスなどのプロパティ値を変数で再利用することで、一か所を変更すれば、グローバルに変更することができ、"スキニング"機能を実現することができるのです。
例1: 色やフォントサイズなどを変更するための変数で構成された、私たちのコンポーネントライブラリ。(例1:コンポーネントの色やフォントサイズなどを一律に変更するための変数を設定したコンポーネントライブラリ。
$color-primary: #3ecacb;
$color-success: #4fc48d;
$color-warning: #f3d93f;
$color-danger: #f6588e;
$color-info: #27c6fa;
例2:画像設定とグローバル導入
Scssで画像を使用する場合、以下のような2つの問題が考えられます。
(1) スタイルファイルとそれを使用するvueファイルが同じディレクトリにない場合、画像は見つかりません。
(2) vueファイルのスタイルに画像パス設定変数が書かれているが、その書き方で画像とスタイルが分離してしまう場合
画像パスを設定ファイルとして書き、それをグローバルに導入することで、画像パスを一律に変更する(そして、対応する画像が使用されるときのみメソッドがロードされ、追加のパフォーマンス問題を引き起こさない)という方法を使うことができました。
$common-path: '. /primary/assets/img/';
$icon-see: $common-path+'icon-see.png';
$icon-play: $common-path+'icon-play.png';
$icon-comment: $common-path+'icon-comment.png';
$icon-checkbox: $common-path+'icon-checkbox.png';
2. import Scssファイルをインポートする
(1) Cssの@importルールで、CSSファイル内に他のCSSファイルを取り込むことができる。しかし、結果として@importが実行されたときだけ他のcssファイルをブラウザがダウンロードすることになり、ページの読み込みが特に遅くなる。
(2) scssの@importルールは、cssファイル生成時に関連ファイルをインポートする点が異なります。つまり、追加のダウンロード要求を開始することなく、すべての関連するスタイルが同じcssファイルにグループ化されるのです。
例1:コンポーネントライブラリは一律にコンポーネントのスタイルファイルをindex.sccsにインポートし、プロジェクトのエントリポイントにコンポーネントライブラリを使用する部分があれば、以下のようにindex.scssファイルに各コンポーネントのスタイルファイルを導入するだけである。
@import ". /base.scss";
@import ". /webupload.scss";
@import ". /message-hint.scss";
3. 部分的なファイルネーミングの使用
scssの部分ファイルのファイル名はアンダースコアで始まります。こうすることで、scss はコンパイル時にこのファイルを出力 css と別々にコンパイルせず、このファイルをインポートとしてのみ使用します。ミキサーは出力される css ファイルを別途コンパイルする必要がないため、ミキサーミキシンは scss を使用する際に最も適したユースケースと言えます。
例1:ミキサーの名前を部分的にファイル名として、次のように書きます。
4. Scssのネスト機能と親セレクタの識別子
ネスティングと親セレクタ識別子 & を使用して、繰り返しコードを減らすことができます。特に、長いスタイルクラスの命名に問題のある BEM 命名規則を CSS クラスに使用している場合は、この方法を使用することができます。この機能を使用すると、BEM ネーミングの冗長性の問題が解決され、スタイルがより読みやすくなります。
例1:ネストした関数と親セレクタの識別子 & BEMの冗長性問題を解決する。
.tea-assignhw {
&__top {
margin: 0;
}
&__content {
padding-left: 45px;
}
&__gradeselect {
width: 158px;
}
}
**例2:** サブセレクター、兄弟セレクター、擬似クラスセレクターのネストでの使用
(1) サブセレクター
&__hint {
margin: 20px;
font-size: 14px;
> p:first-child {
font-weight: bold;
}
}
(2) 兄弟姉妹セレクタ
&__input {
width: 220px;
& + span {
margin-left: 10px;
}
}
(3) 擬似クラスセレクタ
&__browse {
background: url($btn-search) no-repeat;
&:hover {
background: url($btn-search) -80px 0 no-repeat;
}
&:visited {
background: url($btn-search) -160px 0 no-repeat;
}
}
5. mixinミキシンと@extendディレクティブの使用について
変数によって属性値を再利用することができますが、大きなルールセットを再利用したい場合はどうすればよいのでしょうか。従来のアプローチでは、スタイルシートを
の重複が見つかった場合、共通のルールを抜き出して、新しいCSSクラスに入れます。
Scssの継承ディレクティブである@mixinと@extendを使うことで、上記のような大量のルールを再利用するシナリオを解決することができます。しかし、この2つの使用シナリオの違いは何でしょうか?
(1) @mixinの最大の利点は、引数を受け取ることができることです。引数を渡したい場合、@extendよりも@mixinを選ぶのが自然でしょう、なぜなら@extendは引数を受け付けないからです
(2) mixinのルールが他のクラスに混在するため、出力されるスタイルシートの重複を完全に避けることができない。セレクタ継承は、あるセレクタが別のセレクタのスタイルをすべて再利用できることを意味しますが、出力にそれらのスタイル・プロパティを複製することはありません。
まとめると、パラメータを渡す必要がある場合は @mixin ミキシンを使用し、そうでない場合は @extend 継承を使用するのが望ましいということです。
例1:@mixin ミキシンを使用する場合
@mixin paneactive($image, $level, $vertical) {
background: url($image) no-repeat $level $vertical;
height: 100px;
width: 30px;
position: relative;
top: 50%;
}
&--left-active {
@include paneactive($btn-flip, 0, 0);
}
&--right-active {
@include paneactive($btn-flip, 0, -105px);
}
例2:@extend継承の利用
.common-mod {
height: 250px;
width: 50%;
background-color: #fff;
text-align: center;
}
&-mod {
@extend .common-mod;
float: right;
}
&-mod2 {
@extend .common-mod;
}
6. mixin ミキサーのデフォルトパラメータ値の使用
mixinでは、すべてのパラメータを渡す必要はありません。パラメータにデフォルト値を指定して、そのパラメータがデフォルト値であれば@includeから省略し、パラメータがデフォルト値でなければ新たにパラメータを渡すことが可能です。
例1:@mixin mixinのデフォルトのパラメータ値を使用する場合
@mixin pane($dir: left) {
width: 35px;
display: block;
float: $dir;
background-color: #f1f1f1;
}
&__paneleft {
@include pane;
}
&__paneright {
@include pane(right);
}
7. 補間の利用について
補間文#{}は、セレクタ名やプロパティ名に変数を使用することができます。似たようなスタイルのページが2つある場合、ページミキサーに似たスタイルを抽出しますが、BEMの命名規則では異なる2つのページスタイルの命名名は同じにできないので、補間を用いて動的な命名が可能になります。
例1: ページレベルミキサーで #{} 補間を用いてクラス名を動的に設定する。
@mixin home-content($class) {
. #{$class} {
position: relative;
background-color: #fff;
overflow-x: hidden;
overflow-y: hidden;
&--left {
margin-left: 160px;
}
&--noleft {
margin-left: 0;
}
}
}
8. 算術の使用
SassScript は、足し算、引き算、掛け算、割り算、数字の丸め(+、-、*、/、%)に対応しています。
例 1: input コンポーネントは、次のように入力ボックスの高さに基づいて左右の内余白を設定します。.
ps-input {
display: block;
&__inner {
-webkit-appearance: none;
padding-left: #{$--input-height + 10
};
padding-right: #{$--input-height + 10
};
}
}
9、関連するscssの自己充足的な関数の適用
scssには、hsl、mix関数など、いくつかの関数が付属しています。
**例1:ボタン部品のクリック後の色は、いくつかの色を一定の比率で混ぜ合わせ、別の色にする。**下図のように。
&:focus {
color: mix($--color-white, $--color-primary, $--button-hover-tint-percent);
border-color: transparent;
background-color: transparent;}
&:active {
color: mix($--color-black, $--color-primary, $--button-active-shade-percent);
border-color: transparent; background-color: transparent;
}
10、関連するscssの自己充足的な関数の適用
forディレクティブは、制限された範囲内で出力スタイルを繰り返し、毎回変数の値で出力を変化させることができます。
例1: 例えば、プロジェクトでは、hwiconクラスの下にある2番目から8番目のdivの子ノードのスタイルを以下のように設定する必要があります。
@for $i from 2 through 8 {
.com-hwicon {
> div:nth-child(#{$i}) {
position: relative;
float: right;
}
}
}
11.各探索、マップデータ型、@mixin/@include mixin、#{}補間 複合的な使用
各トラバーサル、マップデータ型、@mixin/@includeミキサー、#{}補間を組み合わせると、以下のように異なるセレクタクラスを生成でき、各セレクタクラスで異なる背景画像を使用することができます。
$img-list: (
(accessimg, $papers-access),
(folderimg, $papers-folder),
(bmpimg, $papers-bmp),
(xlsimg, $papers-excel),
(xlsximg, $papers-excel),
(gifimg, $papers-gif),
(jpgimg, $papers-jpg),
(unknownimg, $papers-unknown)
);
@each $label, $value in $img-list {
.com-hwicon__#{$label} {
@include commonImg($value);
}
}
12. スタイルコードチェックのチェックサム -- stylelint プラグイン
CSSは記述ベースのスタイルシートであり、ルールがなく混乱すると、他の開発者、特に強迫神経症を持つ開発者にとって時限爆弾のようなものです。そのため、CSSのルールを検証するためのアクションが差し迫っています。stylelintは強力な最新のCSS検出器で、開発者は一貫した規則に従い、スタイルシートのエラーを回避することができます。
**(1) gulp, stylelint, gulp-postscss , postcss-reporter, stylelint-config-standard のインストールが必要で、**インストールコマンドは以下の通りです。
npm install gulp stylelint gulp-postscss postcss-reporter
stylelint-config-standard--save-dev
(2) インストール後、プロジェクトのルートに gulpfile.js というファイルが作成され、そのファイルに
var reporter = require('postcss-reporter');
var stylelint = require('stylelint');
var stylelintConfig = {
'extends': 'stylelint-config-standard',
'rules': {
'at-rule-no-unknown': [
true, {
'ignoreAtRules': [
'extend',
'include',
'mixin',
'for'
]
}
]
}
};
gulp.task('scss-lint', function() {
var processors = [
stylelint(stylelintConfig),
reporter({
clearMessages: true,
throwError: true
})
];
return gulp.src(
['src/style/*.scss']// scss file to be checked by the tool
).pipe(postcss(processors));});
gulp.task('default', ['scss-lint']);
(3) stylelint-config-standardの検査ルール
stylelint-config-standardはstylelintの公式推奨標準チェックルールで、チェックルールの内容については公式サイトを参照してください。
(4) スタイルチェックのためのコマンドを実行する 13. スタイル自動修正プラグイン -- stylefmtプラグイン
stylefmtはstylelintのコード指定規約の設定に基づき、修正可能な部分の出力をフォーマットする、stylelintベースのコード修正ツールです。
(1) gulp.jsの設定ファイルは以下のようなものです。
var stylefmt = require('gulp-stylefmt'); // css formatting autotuning tool
gulp.task('stylefmt', function() {
return gulp.src(
['src/style/student/index.scss' // the scss file to be checked by the tool
]).pipe(stylefmt(stylelintConfig))
.pipe(gulp.dest('src/style/dest/student'));});
gulp.task('fix', ['stylefmt']);
(2) 以下のように、スタイルの修正を行うコマンドを実行します。
14. scss構文からcss構文へのコンパイル - gulp-sass プラグイン
初めてscssコードを書く場合、慣れない構文などで、思ったようなページが書けないことがあります。gulp-sassプラグインを使えば、scssコードを聞いてリアルタイムにcssコードを生成してくれるので、cssコードを見て正しいscssコードを書けたかどうか確認することができます。
(1) gulp.jsの設定ファイルは以下の通りです。
var gulpsass = require('gulp-sass');
gulp.task('gulpsass', function() {
return gulp.src('src/style/components/hwIcon.scss')
.pipe(gulpsass().on('error', gulpsass.logError))
.pipe(gulp.dest('src/style/dest'));});
gulp.task('watch', function() {
gulp.watch('src/style/components/hwIcon.scss', ['gulpsass']);
});
(2) 以下のように、scss ファイルをリスニングし、scss コードを動的にコンパイルして css コードファイルを生成するようにコマンドを実行します。
これは、SCSS50%スタイルコードを削減する14の実用的な経験についてのこの記事の終わりです、より多くのSCSSスタイルの内容を減らすことに関連するスクリプトハウスの過去の記事を検索してくださいまたは次の関連記事を閲覧を継続、私はあなたが将来よりスクリプトハウスをサポートして願っています!.
関連
-
[CSSチュートリアル】よくある2D変換を5つ実現するCSS
-
[css3]ピュアCSS3でdivのinとoutの効果を順番に実現する
-
[css3]css3はtransform-originを使用して、大きな円上のドット分布のレイアウトと回転を実現します。
-
[CSSチュートリアル】CSSで実現できるのなら、わざわざJavaScriptを使う必要はない
-
[css3]CSS3は本当にSCSSに取って代わるのだろうか?
-
[css3]CSS3ベジェ曲線サンプル:リンクホバーアニメーション効果の作成
-
[css3]CSS3アニメーションによるグラフィックドロップ効果
-
[css3]シンプルな白い雲の浮かぶ背景効果を実現するcss3
-
[CSSチュートリアル] Pure CSS to click to expand もっと読む
-
[CSSチュートリアル】display:olck/noneでメニューバーを完成させる方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[CSSチュートリアル】CSS たった1行のコードでアバターと国旗の一体化を実現
-
[CSSチュートリアル】Chromeのタブバーを実装するためのCSSのコツ
-
[Div+CSSチュートリアル】divの背景を透明にする設定例
-
[CSSチュートリアル]CSS気まぐれボーダーアニメーション効果
-
[css3]赤いパケットのジッター効果を実現するCSS3
-
[css3]CSS3遷移回転遠近法2D3Dアニメーションなどの効果を持つサンプルコード
-
[CSSチュートリアル]ドラッグ&ドロップ効果を実現するピュアCSSコード
-
[CSSチュートリアル]CSSのボーダーの半分または部分的に見えるコードは、ボーダーを達成するために
-
[CSSチュートリアル】CSS擬似クラス:empty makes my eyes shine(コード例)
-
[css3]css3 use transform to create walking 2D clock.