CSS Explosionの管理


682

私が取り組んでいるWebサイトはCSSに大きく依存しています。現在、すべてのCSSスタイルがタグごとに適用されているので、将来の変更に対応するために、より多くの外部スタイルに移動しようとしています。

しかし今問題は、「CSS爆発」が発生していることに気付いたことです。CSSファイル内のデータを最適に整理および抽象化する方法を決定するのが難しくなっています。

divテーブルベースのウェブサイトから移動して、ウェブサイト内で多数のタグを使用しています。そのため、次のようなCSSセレクターを多数取得しています。

div.title {
  background-color: blue;
  color: white;
  text-align: center;
}

div.footer {
  /* Styles Here */
}

div.body {
  /* Styles Here */
}

/* And many more */

それほど悪くはありませんが、私は初心者なので、CSSファイルのさまざまな部分を整理するための最良の方法について推奨できるかどうか疑問に思いました。ウェブサイトのすべての要素に個別のCSS属性を設定したくありません。CSSファイルを常に直感的で読みやすいものにしたいのです。

私の最終的な目標は、CSSファイルを簡単に使用できるようにし、Web開発の速度を向上させる力を実証することです。このようにして、将来このサイトで作業する可能性のある他の個人も、私が行った方法を取り上げる必要はなく、優れたコーディング手法を使用する習慣に入るでしょう。


122
これは素晴らしい質問ですが、多くの企業にとって本当に解決できない問題です。主にCSSは、用語を認識できない場合がありグラフィックデザイナーによって作成および管理されているのでsimplicitycomplexitymaintenancestructurerefactoring
cherouvim

8
@cherouvim-おかしいのは、この質問をする私の理由はすべて、グラフィックアーティストがデザインした恐ろしいCSSを見るところから始まったからです。多分私達はそれらのためのいくつかのより良いトレーニングが必要ですか?
JasCav 2010年

13
私の解決策(理想的な世界における)は、チームの専任のスタッフがPSDをhtml + cssにカットし、その後維持することです。これらの人々は、プログラマーやデザイナーの近くにいる必要があります。
cherouvim

@cherouvim同意する必要があります-特にCSSがより複雑になるにつれ、それが代理店のやり方とほぼ同じです。
ジョンパーカー

27
@JasCav、グラフィックアーティストはCSSに触れないでください。Webデザイナー、およびフロントエンドWeb開発者はCSSを扱う必要があります。グラフィックデザイナーの仕事はグラフィックを作ることです。
zzzzBov 2011年

回答:


566

これは非常に良い質問です。どこを見ても、CSSファイルはしばらくすると制御不能になる傾向があります。特に、チームで作業しているときだけではありません。

以下は私自身が守ろうとしているルールです(いつも守っているわけではありません)。

  • 早期にリファクタリングし、頻繁にリファクタリングします。CSSファイルを頻繁にクリーンアップし、同じクラスの複数の定義を融合します。廃止された定義をすぐに削除します。

  • バグの修正中にCSSを追加する場合は、変更内容についてコメントを残します(「これは、IEが7未満の場合にボックスを左揃えにするためです」)

  • で同じことを定義するなど、冗長性を避ける.classname.classname:hover

  • コメント/** Head **/を使用して、明確な構造を構築します。

  • 一定のスタイルを維持するのに役立つPrettifierツールを使用します。私はPolystyleを使用しています。これにはとても満足しています(15ドルの費用がかかりますが、十分に費やされています)。同様に無料のものもあります(オープンソースツールであるCSS Tidyに基づくコードビューティファイアーなど)。

  • 賢明なクラスを構築します。これに関するいくつかの注意事項については、以下を参照してください。

  • セマンティクスを使用し、DIVスープを避け<ul>ます- たとえば、メニューにはsを使用します。

  • すべてを可能な限り低いレベルで定義し(たとえば、デフォルトのフォントファミリー、色、サイズbody)、inherit可能な限り使用します。

  • 非常に複雑なCSSを使用している場合は、CSSプリコンパイラが役立ちます。同じ理由でxCSSをすぐに調査する予定です。他にもいくつかあります。

  • チームで作業している場合は、CSSファイルの品質と標準の必要性も強調します。誰もがプログラミング言語でのコーディング標準に力を入れていますが、CSSにもこれが必要であるという認識はほとんどありません。

  • チームで作業している場合は、バージョン管理の使用を検討してください。これにより、追跡がはるかに簡単になり、競合の編集がはるかに簡単に解決されます。HTMLとCSSに「ちょうど」慣れていても、それは本当に価値があります。

  • で作業しないでください!important。IE = <7はそれを処理できないためだけではありません。複雑な構造では、の使用は!important、多くの場合、そのソースが見つからない動作を変更するたくなるが、それはだ長期維持のために。

賢明なクラスを構築する

これは私が賢明なクラスを構築する方法です。

最初にグローバル設定を適用します。

body { font-family: .... font-size ... color ... }
a { text-decoration: none; }

次に、ページのレイアウトの主要セクション(上部領域、メニュー、コンテンツ、フッターなど)を特定します。適切なマークアップを作成した場合、これらの領域はHTML構造と同じになります。

次に、CSSクラスの作成を開始し、可能な限り祖先を可能な限り指定し、関連するクラスを可能な限りグループ化します。

div.content ul.table_of_contents 
div.content ul.table_of_contents li 
div.content ul.table_of_contents li h1
div.content ul.table_of_contents li h2
div.content ul.table_of_contents li span.pagenumber

CSS構造全体を、現在のルートから離れるほど、具体的な定義が増えるツリーと考えてください。クラスの数をできるだけ少なくし、自分自身をできる限り繰り返さないようにします。

たとえば、3つのレベルのナビゲーションメニューがあるとします。これらの3つのメニューは異なって見えますが、特定の特性も共有しています。たとえば、それらはすべて<ul>であり、すべて同じフォントサイズであり、項目はすべて隣り合っています(のデフォルトのレンダリングとは対照的にul)。また、どのメニューにも箇条書き(list-style-type)はありません。

まず、次の名前のクラスで共通の特性を定義しますmenu

div.navi ul.menu { display: ...; list-style-type: none; list-style-image: none; }
div.navi ul.menu li { float: left }

次に、3つのメニューのそれぞれの特定の特性を定義します。レベル1の高さは40ピクセルです。レベル2および3、20ピクセル。

注:複数のクラスを使用することもできますが、Internet Explorer 6 では複数のクラス問題があるため、この例ではidsを使用しています。

div.navi ul.menu#level1 { height: 40px; }
div.navi ul.menu#level2 { height: 20px; }
div.navi ul.menu#level3 { height: 16px; }

メニューのマークアップは次のようになります。

<ul id="level1" class="menu"><li> ...... </li></ul>
<ul id="level2" class="menu"><li> ...... </li></ul>
<ul id="level3" class="menu"><li> ...... </li></ul>

これらの3つのメニューのように、ページに意味的に類似した要素がある場合は、最初に共通点を調べてクラスに入れてください。次に、特定のプロパティを調べてクラスに適用するか、Internet Explorer 6のIDをサポートする必要がある場合はそれらを適用します。

その他のHTMLヒント

これらのセマンティクスをHTML出力に追加すると、デザイナーは後で純粋なCSSを使用してWebサイトやアプリの外観をカスタマイズできます。これは大きな利点であり、時間を節約できます。

  • 可能であれば、すべてのページの本文に一意のクラスを指定します。<body class='contactpage'>これにより、スタイルシートにページ固有の調整を非常に簡単に追加できます。

    body.contactpage div.container ul.mainmenu li { color: green }
  • メニューを自動的に作成する場合は、できるだけ多くのCSSコンテキストを追加して、後で広範なスタイルを設定できるようにします。例えば:

    <ul class="mainmenu">
     <li class="item_first item_active item_1"> First item </li> 
     <li class="item_2"> Second item </li> 
     <li class="item_3"> Third item </li> 
     <li class="item_last item_4"> Fourth item </li> 
    </ul>

    このようにして、すべてのメニュー項目に、そのセマンティックコンテキストに従ってスタイルを設定するためにアクセスできます。それがリストの最初の項目か最後の項目か。現在アクティブなアイテムかどうか。そして番号で。

上記の例で概説されている複数のクラスのこの割り当ては、IE6では適切に機能しないことに注意しください。IE6が複数のクラスを処理できるようにする回避策があります。回避策を選択できない場合は、最も重要なクラス(項目番号、アクティブまたは最初/最後)を設定するか、IDを使用する必要があります。


3
@Andrewの主な理由は、動的環境(CMSなど)でIDを使用すると衝突が発生しやすいためです(たとえば、ユーザーがページの名前を「連絡先」に変更すると、その名前が本文のIDとして使用され、連絡先フォームと衝突します。 「連絡先」とも呼ばれます)。そのため、通常はIDをできるだけ使用しないことをお勧めします。
Pekka

4
@Pekkaあなたはwww.oocss.orgをチェックアウトする必要があります。その多くは、ここで述べたことに反しますが、CSSの肥大化を管理するために私が見た中で最良の方法です。あまりにも以下の私の答えを参照してください。stackoverflow.com/questions/2253110/how-to-manage-css-explosion/...
Moinザーマン

2
@サムありがとう!私はそれを非常に気に入っていますが、これらのガイドライン自分自身に従うのは非常に難しい場合があります。CSSスタイルシートがあるので、簡単に時間をかけてネジに-ここでは、色の変化、font-weight: boldそこ....規律が唯一の薬です:)
ペッカ

1
CSS爆発の研究の初心者といえば、「ユニーククラス」という言葉は混乱を招きます。それはそうではないという感覚を得ていますidが、確かにそれは1つのように聞こえます。たぶん、コンセプトが明確になるだろうか?
アリゴールド2017

2
@ariあなたもその通り技術的にはidである可能性があるということです。
ペッカ2017年

89

以下は4つの例です。

4つすべてについて、私の答えには、Natalie DowneのPDF CSSシステムをダウンロードして読むためのアドバイスが含まれています。(PDFには、スライドにはない大量のメモが含まれているので、PDFを読んでください!)組織に対する彼女の提案をメモしてください。

編集(2014/02/05) 4年後、私は次のように言います。

  • CSSプリプロセッサを使用して、ファイルをパーシャルとして管理します(個人的にはSassとCompassを好みますが、Lessも非常に優れており、他にもあります)
  • OOCSSSMACSSBEMまたはgetbemなどの概念について読んでください。
  • BootstrapZurb Foundationなどの一般的なCSSフレームワークがどのように構造化されているかを見てみましょう。そしてあまり人気のないフレームワークを割引しないでください- イヌイットは興味深いものですが、他にもたくさんあります。
  • 継続的インテグレーションサーバーやGruntやGulpなどのタスクランナーでビルドステップを使用してファイルを結合/縮小します。

CSSプリプロセッサーが問題の原因ではなく、解決策です。カスケードの概念を真に習得すれば、膨張を抑えることができます。
Daniel Sokolowski、2018

@DanielSokolowski不適切に使用されたツールは、解決策ではなく問題になる可能性があります。しかし、カスケードをマスターするという点については100%同意しています。
アンディフォード

73

CSSで見出しを書かない

セクションをファイルに分割するだけです。CSSのコメントは、それだけのコメントでなければなりません。

reset.css
base.css
somepage.css
someotherpage.css
some_abstract_component.css

スクリプトを使用してそれらを1つに結合します。必要であれば。素敵なディレクトリ構造にすることもでき、スクリプトで.cssファイルを再帰的にスキャンするだけです。

見出しを書く必要がある場合は、ファイルの先頭に目次を記述します

TOCの見出しは、後で作成する見出しと完全に一致している必要があります。見出しを探すのは大変です。問題に追加するには、最初のヘッダーの後に別のヘッダーがあることを誰かが正確にどのように想定しているのでしょうか?ps。目次を書き込むときに各行の先頭にdocのような*(スター)を追加しないでください。テキストを選択するのが面倒になります。

/* Table of Contents
   - - - - - - - - -
   Header stuff
   Body Stuff
   Some other junk
   - - - - - - - - -
 */
...
/* Header Stuff 
 */
...
/* Body Stuff 
 */

ブロックの外ではなく、ルール内またはルール内でコメントを書く

まず、スクリプトを編集するとき、50/50の確率で、ルールブロックの外側にあるものに注意を払います(特に、テキストの大きな塊である場合は;))。次に、外部に「コメント」が必要になるケースは(ほとんど)ありません。それが外にある場合、それはタイトルの時間の99%なので、そのように保ちます。

ページをコンポーネントに分割します

コンポーネントが持っている必要がありposition:relative、ノーpadding、ノーmargin、ほとんどの時間を。この簡素化%は単純はるかを可能にするだけでなく、多くの規則absolute:position絶対配置されたコンテナがあるかどう計算するときに、絶対位置指定要素は、容器を使用するので、素子のINGの」toprightbottomleftプロパティ。

HTML5ドキュメントのほとんどのDIVは通常、コンポーネントです。

コンポーネントは、ページ上の独立したユニットと見なすこともできるものです。素人の言葉では、ブラックボックスのようなものを扱うことが理にかなっている場合、コンポーネントのようなものを扱います。

QAページの例に戻ります。

#navigation
#question
#answers
#answers .answer
etc.

ページをコンポーネントに分割することにより、作業を管理しやすい単位に分割します。

累積効果を持つルールを同じ行に配置します。

たとえばbordermarginおよびpaddingoutlineすべてではありませんが)スタイリングする要素の寸法とサイズに追加されます。

position: absolute; top: 10px; right: 10px;

それらが1行でそれほど読みにくい場合は、少なくともそれらを近接させます。

padding: 10px; margin: 20px;
border: 1px solid black;

可能な場合は略記を使用します。

/* the following... */
padding-left: 10px;
padding-right: 10px;
/* can simply be written as */
padding: 0 10px;

セレクタを繰り返さないでください

同じセレクターのインスタンスが複数ある場合は、同じルールの複数のインスタンスが必ず発生する可能性があります。例えば:

#some .selector {
    margin: 0;
    font-size: 11px;
}
...
#some .selector {
    border: 1px solid #000;
    margin: 0;
}

ID /クラスを使用できる場合は、セレクターとしてタグを使用しないでください

まず、DIVタグとSPANタグは例外です。決して使用しないでください。;)クラス/ IDの添付にのみ使用してください。

この...

div#answers div.answer table.statistics {
    border-collapse: collapsed;
    color: pink;
    border: 1px solid #000;
}
div#answers div.answer table.statistics thead {
    outline: 3px solid #000;
}

このように書く必要があります:

#answers .answer .statistics {
    border-collapse: collapsed;
    color: pink;
    border: 1px solid #000;
}
#answers .answer .statistics thead {
    outline: 3px solid #000;
}

追加のぶら下がりDIVがあるため、セレクターには何も追加されません。また、不要なタグルールを強制します。たとえば、.answeraからa divに変更するとarticle、スタイルが壊れます。

または、より明確にしたい場合:

#answers .answer .statistics {
    color: pink;
    border: 1px solid #000;
}
#answers .answer table.statistics {
    border-collapse: collapsed;
}
#answers .answer .statistics thead {
    outline: 3px solid #000;
}

border-collapseプロパティである理由は、に適用された場合にのみ意味を持つ特別なプロパティですtable.statisticsでない場合はtable適用されません。

一般的なルールは悪です!

  • 可能であれば、汎用/マジックルールの記述を避けます
  • CSSリセット/リセット解除でない限り、すべての一般的な魔法は少なくとも1つのルートコンポーネントに適用する必要があります

彼らはあなたの時間を節約しません、あなたの頭を爆発させます。だけでなく、メンテナンスを悪夢のようにします。ルールを書いているときに、ルールがどこに適用されるかを知っているかもしれませんが、それによってルールが後で混乱しないという保証はありません。

この一般的なルールに追加すると、スタイリングしているドキュメントについてある程度の考えがあっても、混乱して読みにくくなります。これは、一般的なルールを記述すべきではないという意味ではありません。本当に一般的なルールを意図しない限り、それらを使用しないでください。さらに、可能な限り多くのスコープ情報をセレクターに追加します。

このようなもの...

.badges {
    width: 100%;
    white-space: nowrap;
}

address {
    padding: 5px 10px;
    border: 1px solid #ccc;
}

...プログラミング言語でグローバル変数を使用するのと同じ問題があります。それらにスコープを与える必要があります!

#question .userinfo .badges {
    width: 100%;
    white-space: nowrap;
}

#answers .answer .userinfo address {
    padding: 5px 10px;
    border: 1px solid #ccc;
}

基本的にそれは次のように読みます:

components                   target
---------------------------- --------
#answers .answer   .userinfo address
-------- --------- --------- --------
domain   component component selector 

私が知っているコンポーネントがページ上のシングルトンであるときはいつでもIDを使用するのが好きです。あなたのニーズは異なる場合があります。

注:理想的には、十分な量を書く必要があります。ただし、セレクターでより多くのコンポーネントに言及することは、より少ないコンポーネントに言及することに比べて、より寛大な間違いです。

paginationコンポーネントがあるとしましょう。サイト全体の多くの場所で使用します。これは、一般的なルールを作成する場合の良い例です。display:block個々のページ番号がリンクしていて、濃い灰色の背景になっているとしましょう。それらを表示するには、次のようなルールが必要です。

.pagination .pagelist a {
    color: #fff;
}

今あなたが答えのリストのためにあなたのページネーションを使うとしましょう、あなたはこのような何かに遭遇するかもしれません

#answers .header a {
    color: #000;
}
...
.pagination .pagelist a {
    color: #fff;
}

これにより、白いリンクが黒くなり、不要になります。

それを修正する誤った方法は次のとおりです。

.pagination .pagelist a {
    color: #fff !important;
}

それを修正する正しい方法は次のとおりです。

#answers .header .pagination .pagelist a {
    color: #fff;
}

複雑な「ロジック」コメントは機能しません:)

「この値は、何とか何とか何とか何とか何とか何とかに依存している」のように書いた場合、間違いを犯し、カードの家のようにすべてが倒れることは避けられません。

コメントはシンプルにしてください。「論理演算」が必要な場合は、SASSLESSなどのCSSテンプレート言語の1つを検討してください。

カラーパレットを作成するにはどうすればよいですか。

これは最後まで残しておきます。カラーパレット全体のファイルを用意します。このファイルがなくても、スタイルにはルールに使用可能なカラーパレットが含まれているはずです。カラーパレットが上書きされます。非常に高レベルの親コンポーネント(例:)を使用してセレクターをチェーンし、#pageスタイルを自己完結型のルールブロックとして記述します。それは単なる色か何かであることができます。

例えば。

#page #header .description,
#page #categories .description,
#page #answers .answer .body
{
    color: #222; background: #fff; 
    border-radius: 10px;
    padding: 1em;
}

アイデアは単純です。カラーパレットは、カスケードする基本スタイルとは独立したスタイルシートです。

名前が少なく、必要なメモリが少ないため、コードが読みやすくなります

使用する名前の数は少ないほど良いです。理想的には、テキスト、本文、ヘッダーなどの非常にシンプルな(そして短い!)単語を使用します。

また、シンプルな単語の組み合わせの方が理解しやすく、長い「適切な」単語のスープを持っていることもわかります。postbody、posthead、userinfoなど。

あなたのスタイルスープを読むために見知らぬ人(数週間後の自分のように)が来たとしても、語彙を小さくしておくと、すべてのセレクターが使用されている場所ではなく、単語が使用されている場所を理解するだけで済みます。たとえば.this、要素が「選択されたアイテム」または「現在のアイテム」であると思われる場合は常に使用します。

自分の後片付け

CSSを書くことは食べるようなものです。その混乱をクリーンアップすることを確認してください。そうしないと、ガベージコードが積み重なっていきます。使用しないクラス/ IDを削除します。使用しないCSSルールを削除します。すべてがタイトでいいことを確認し、競合するルールや重複するルールがないことを確認します。

私が提案したように、いくつかのコンテナーをスタイルでブラックボックス(コンポーネント)として扱い、セレクターでそれらのコンポーネントを使用し、すべてを1つの専用ファイルに保持(またはTOCとヘッダーでファイルを適切に分割)した場合、作業はかなり簡単です...

Firefoxの拡張機能であるDust-Meセレクター(ヒント:sitemap.xmlをポイントする)などのツールを使用して、CSSの核と肉食動物に隠れているジャンクを見つけることができます。

unsorted.cssファイルを保持する

QAサイトのスタイルを設定していて、「回答ページ」のスタイルシートがすでにあるとしますanswers.css。新しいcssをたくさん追加する必要がある場合は、それをunsorted.cssスタイルシートに追加してから、スタイルシートにリファクタリングしますanswers.css

これにはいくつかの理由があります:

  • 完了後にリファクタリングする方が高速です。次に、ルール(おそらく存在しないもの)を検索してコードを挿入します。
  • 削除するものを書いて、コードを注入すると、そのコードを削除するのが難しくなります
  • 元のファイルに追加すると、ルール/セレクターの複製が簡単に発生します

1
非タグセレクターは、タグベースのセレクターよりもはるかに低速です。すべてのブラウザには、たとえば「div」(またはその他のタグ)を取得するためのネイティブメソッドがあります。汎用的過ぎると( '.class')、レンダリングエンジンはDOMのすべての要素を調べて、一致が存在するかどうかを確認する必要があります。
Miguel Ping、

@MiguelレンダリングエンジンがDOMのすべての要素を調べて、DIVかどうかを確認する必要がないのはなぜですか。特別な最適化がある場合、なぜそれがクラス/ IDに適用されないのですか?ソースはありますか?CSSで気付いた唯一の目に見えるパフォーマンスキラーは、フロートスパムによるものでした。ページをスクロールするときに、レンダリングエンジンが一部のブラウザーでひどく遅れる可能性があります(おそらく計算が多すぎる)。
srcspider 2011年

3
tagNamesをターゲットにしないようにと言ってこれに賛成票を投じようとしました(そうです!)が、ジェネリックではないという部分がありました(boo!)
mwilcox

1
@ミゲル、それはそのようには機能しません。ブラウザはCSS文字列を逆方向に読み取るため、「div .myclass」ですべての「.myclass」クラスを見つけ、それがdivの祖先であるかどうかを確認します。
mwilcox、2011年

5
一般的なルールとグローバル変数を比較することは、CSSについて聞いた中で最も誤解されています。
gblazex 2011年

55

1. SASS 2. コンパスをご覧ください


11
これは百万倍。Sassを使用することで、私はかつてないほど整理された強力なCSSラングラーになりました。複数のファイルにまたがってスタイルを整理したり、スタイルをネストしたり、変数を使用したりできます。など
Alan H.

2
sass、compassなどはすべて、1日の終わりに通常のCSSを生成しますが、依然として醜く爆発する可能性があります。それ自体はCSSの膨らみに対する解決策ではありません。
Moin Zaman、2011年

8
@Moin_Zaman私の控えめな意見では、先生、あなたの発言は純粋な謙遜です。sass / compass / lessで記述し、コードをファイルに整理します。出力cssがどのように見えるかは気にしません。また、少なくとも(少ないアプリを介して)少なくすると、出力を小さくすることができます。
bzx

1
@bzxあなたは私のポイントを証明しています:)ブラウザはsass / compass / lessを理解しません。これらはすべて、クライアントサイドで、またはビルドの一部として、プレーンな古いCSSにコンパイルする必要があります。最終的にCSSとして何が生成されるかを知らずにこのようなツールを使用すると、無意識にそれらを悪用して、最適なCSSファイルよりも大きくなる可能性があります。
Moin Zaman、2011年

ここでgzip圧縮が始まります...ほとんどのWebサーバーとブラウザは、可能な場合はgzip圧縮されたコンテンツと通信します。セレクタフラグメントを複数回繰り返すことになった場合、それは単一のハッシュテーブルエントリに圧縮されます。この場合の唯一の実際の問題は、ブラウザーでCSSルールを解析するために必要なRAMの量です。
サードパーティ、2013

31

CSS肥大化に対抗するために私が見た最良の方法は、オブジェクト指向のCSS原則を使用することです。

かなり良いOOCSSフレームワークもあります。

いくつかのイデオロギーは、ここで上位の回答で述べられている多くのことに反対しますがCSS、オブジェクト指向の方法で設計する方法を理解すると、実際にコードを無駄のない意味のあるものに保つことがわかります。

ここで重要なのは、サイト内の「オブジェクト」またはビルディングブロックパターンを識別し、それらを使用して設計することです。

FacebookはOOCSSの作成者を雇いました、 Nicole Sullivanを、フロントエンドコード(HTML / CSS)を大幅に節約しました。はい、実際にはCSSだけでなく、HTMLでも節約できます。これは、tableベースのレイアウトを多くdiv

別の優れたアプローチは、一部の点ではOOCSSと似ています。CSSを最初からスケーラブルでモジュール化するように計画および作成することです。 Jonathan SnookSMACSS-CSS向けのスケーラブルでモジュール式のアーキテクチャに関する見事な記事と本/電子書籍を作成しました

いくつかのリンクをご紹介しましょう:
大規模なCSSの5つの間違い-(ビデオ)
大規模なCSSの5つの間違い-(スライド)
CSSブロート-(スライド)


16

カスケード、重量、およびそれらがどのように機能するかも理解する必要があります。

クラス識別子(div.title)のみを使用しています。IDも使用でき、IDはクラスよりも重要であることをご存知ですか?

例えば、

#page1 div.title, #page1 ul, #page1 span {
  // rules
}

これらの要素はすべて、フォントサイズ、たとえば、色、またはルールが何であれ共有します。#page1の子孫であるすべてのDIVに特定のルールを適用することもできます。

重みに関しては、CSS軸が最も一般的な/最も軽いものから最も特定的な/最も重いものに移動することを覚えておいてください。つまり、CSSセレクターでは、要素指定子がクラス指定子によってオーバーライドされ、ID指定子によってオーバーライドされます。数値は重要なので、2つの要素指定子(ul li)を持つセレクターは、1つの指定子(li)のみを持つセレクターよりも重みが大きくなります。

数字のように考えてください。1の列の9は、10の列の1よりも小さいです。ID指定子、クラス指定子、および2つの要素指定子を持つセレクターは、IDがないセレクター、500クラス指定子、1,000要素指定子よりも重みが大きくなります。もちろんこれはばかげた例ですが、あなたはその考えを理解します。重要なのは、この概念を適用すると、多くのCSSをクリーンアップするのに役立つことです。

ところで、class = "title"を持つ他の要素と競合しない限り、要素指定子をクラス(div.title)に追加する必要はありません。後でそのウェイトを使用する必要がある場合があるため、不要なウェイトを追加しないでください。


IDの使用は、Visual Basicコードでグローバル変数を使用するのと同じように良くありません。
alpav

2
@alpav:すみません、それは間違いです。IDは、新しいクラス名を作成する手間をかけずに、ページのさまざまな部分で同様の要素を異なるように表示するための優れた方法です。
Robusto

@Robusto:新しいクラス名を作成するよりも新しいID名を作成する方が難しいのはなぜですか?
alpav

@Robusto:新しいクラス名を作成することは、実際にはID名よりも簡単です。IDではグローバルスコープを気にする必要があり、クラス名ではローカルスコープの一意性のみを気にする必要があるため、ローカル変数と同じ利点があります。
alpav

1
@alpav「これはカプセル化の目的に反します。グローバルに考えることなくローカルで名前を付けることができるようになります。」そうですが、CSSセレクターは本質的にグローバルです。.myclassつまり、を書くとき、クラスですべてを選択しますmyclass。CSSでは、クラスはその点でIDと同じです。
ポールD.ウェイト

12

提案してもいいですか CSS動的フレームワーク

前述のSASSに似ています。

親クラスごとにCSSを維持するのに役立ちます。

例えば

 #parent{     
  width: 100%;

    #child1
    {    
     background: #E1E8F2;    
     padding: 5px;    
    }

    #child2
   {
     background: #F1F8E2;
     padding: 15px
   }
 }

これが行うこと:#child1と#child2の両方にwidth:100%を適用します。

また、#child1固有のCSSは#parentに属します。

これは

#parent #child1
{
 width: 100%;
 background: #E1E8F2;
 padding: 5px;
}

#parent #child2
{
 width: 100%;
 background: #F1F8E2;
 padding: 15px;
}

1
私はsassを使用していますが、これはsassとlessの違いかもしれませんが、 `#parent {width:100%;としてコンパイルされると確信しています。} #parent#child1 {background:#E1E8F2; パディング:5px; } #parent#child2 {background:#F1F8E2; パディング:15px; } `
emik

12

難しいのは、サイトに必要な設計を一連のルールに変換することです。サイトのデザインが明確でルールベースの場合、クラス名とCSS構造はそこから流用できます。しかし、時間が経つにつれ、無意味にサイトに無作為に少しずつ追加されてきた場合、CSSでできることは多くありません。

私はCSSファイルを大まかに次のように整理する傾向があります。

  1. CSSリセット、Eric Meyerの。(そうでなければ、ほとんどの要素で、デフォルトのブラウザースタイルをリセットするだけのルールが少なくとも1つまたは2つあることがわかります。たとえば、ほとんどのリストは、リストのデフォルトのHTMLスタイルのようには見えません。)

  2. グリッドシステムCSS(サイトで必要な場合)。(私は960.gsをベースにしています

  3. すべてのページに表示されるコンポーネントのスタイル(ヘッダー、フッターなど)

  4. サイト全体のさまざまな場所で使用されるコンポーネントのスタイル

  5. 個々のページにのみ関連するスタイル

ご覧のとおり、そのほとんどはサイトのデザインに依存しています。デザインが明確で整理されていれば、CSSはわかりやすいでしょう。そうでなければ、あなたはねじ込まれています。


7

私の答えは、質問であなたが提起した高レベルの懸念に対処する高レベルです。低レベルの組織トリックとそれをきれいにするためにあなたができる微調整があるかもしれません、しかしそれらのどれも方法論的欠陥を修正することができません。CSSの急増に影響する要素がいくつかあります。明らかに、サイトの全体的な複雑さだけでなく、セマンティクスの命名、CSSパフォーマンス、CSSファイルの編成、テスト容易性/受け入れ可能性なども含まれます。

あなたはセマンティクスを命名することで正しい道を進んでいるようですが、それはさらに一歩踏み出すことができます。構造を変更せずにサイトに繰り返し表示されるHTMLのセクション(「モジュール」と呼ばれます)は、セレクタールートと見なすことができ、そこから、そのルートを基準にして内部レイアウトのスコープを設定できます。これはオブジェクト指向CSSの基本的な考え方です。この話では、Yahooエンジニアによる詳細を読んだり、見たりできます

このクリーンなアプローチは、idまたはタグ名に基づく短いセレクターを優先するパフォーマンスの懸念とは逆に実行できることに注意することが重要です。そのバランスを見つけるのはあなた次第ですが、大規模なサイトがない限り、これは頭の後ろにあるガイドにすぎず、セレクターを短くしておくように促します。 パフォーマンスの詳細はこちら

最後に、サイト全体で1つのCSSファイルを作成するのですか、それとも複数のファイル(ページごとまたはセクションファイルで使用する1つのベースファイル)を作成するのですか?単一のファイルはパフォーマンスには優れていますが、複数のチームメンバーと一緒に理解/維持するのが難しく、テストするのが難しい場合があります。テストの場合、CSSテストページを1つ用意することをお勧めします衝突と意図しないカスケードをテストするために、サポートされているすべてのCSSモジュールを含むを。

別の方法として、CSSルールのスコープをページまたはセクションに設定するために、複数ファイルアプローチを使用することができます。これには、ブラウザーが複数のファイルをダウンロードする必要がありますが、これはパフォーマンスの問題です。サーバー側のプログラミングを使用して、CSSファイルを指定および集約(および縮小)して動的に単一のファイルにすることができます。ただし、これらのファイルは個別であり、それらのテストは個別であるため、ページ/セクション間でルックアンドフィールに一貫性がない可能性があります。したがって、テストは難しくなります。

顧客の特​​定のニーズを分析し、それに応じてこれらの懸念のバランスを取るのはあなた次第です。


5

私の前に言ったように:OOCSSに入る。Sass / Less / Compassは使いたくなりますが、バニラCSSが正しく使用されるまで、Sass / Less / Compassは状況を悪化させるだけです。

まず、効率的なCSSについて読んでください。Google Page Speedを試して、Soudersが効率的なCSSについて書いたものを読んでください。

次に、OOCSSと入力します。

  • カスケードでの作業を学びます。(結局のところ、これをカスケードスタイルシートと呼びます)。
  • 粒度を正しくする方法を学ぶ(トップダウンではなくボトムアップ)
  • 構造とスキンを分離する方法を学びます(何がユニークで、これらのオブジェクトのバリエーションは何ですか?)
  • コンテナとコンテンツを分離する方法を学びます。
  • グリッドを愛することを学びます。

それはcssを書くことについてあらゆるビットに革命を起こすでしょう。私は完全に新たになり、それを愛しています。

更新:SMACSSはOOCSSに似ていますが、一般的に言えば適応が容易です。


2
「Sass / Less / Compassは事態を悪化させるだけです」-これはかなり主観的でプロジェクトに依存します。これらのいずれかをOOCSSと組み合わせて使用​​すると、多くの大規模プロジェクト(特に、スタイルが頻繁に変更される可能性があるプロジェクト)の保守性に本当にメリットがあると私は思います
Zach Lysobey

Zach L:OOCSS(さらに言えば、SMACSS)を正しく使用すると、Compass / Less / Sassはベンダープレフィックスにのみ必要になります。
madr

私はこれについてあまり論じようとはしません(特に、現在プリプロセッサを使用していないためです)が、そのようなことを組み合わせても、便利だと思う人はたくさんいると思います。ベンダープレフィックス以外のOOCSS / SMACSSを使用
Zach Lysobey 2013

4

CSSリファクタリングから抽出された賢明なCSSのコア原則:追加のみからモジュラーCSSへ

SASSで記述します。変数やミックスインなどの利点を放棄するのはおかしいでしょう。

スタイリングにHTML IDを使用しないでください。常にクラスを使用します。HTML IDは、正しく使用すると、ページ全体で1回だけ表示されます。これは、再利用性とは正反対です。これは、賢明なエンジニアリングにおける最も基本的な製品の1つです。さらに、IDを含むセレクターをオーバーライドするのは非常に難しく、多くの場合、1つのHTML IDを圧倒する唯一の方法は、別のIDを作成することです。これにより、IDは、害虫のようにコードベースに伝播します。変更されないJavascriptまたは統合テストフックのためにHTML IDを残した方がよい。

CSSクラスには、アプリケーション固有の機能ではなく視覚的な機能で名前を付けます。たとえば、「。bundle-product-discount-box」の代わりに「.highlight-box」と言います。この方法でコーディングすると、サイドビジネスを担当するときに既存のスタイルシートを再利用できます。たとえば、法律のメモの販売を始めましたが、最近法律の家庭教師に移りました。私たちの古いCSSクラスには、「。download_document_box」のような名前がありました。これは、デジタルドキュメントについて話すときに意味のあるクラス名ですが、プライベートチューターの新しいドメインに適用した場合にのみ混乱します。既存のサービスと将来のサービスの両方に適合するより良い名前は、「。pretty_callout_box」です。

特定のグリッド情報に基づいてCSSクラスに名前を付けることは避けてください。CSSコミュニティには恐ろしいアンチパターンがあり(現在もそうです)、CSSフレームワークのデザイナーと作成者(Twitter Bootstrapによる)は、「span-2」または「cols-8」がCSSクラスの妥当な名前であると信じています。CSSのポイントは、マークアップに影響を与えずにデザインを変更できるようにすることです(大幅に)。グリッドサイズをHTMLにハードコーディングすると、この目標が妨げられるため、週末よりも長く続くことが予想されるプロジェクトでは、これをお勧めしません。グリッドクラスを後で回避する方法の詳細。

CSSをファイル間で分割します。理想的には、すべてを「コンポーネント」/「ウィジェット」に分割し、デザインのこれらのアトムからページを作成します。ただし、現実的には、一部のWebサイトページに特異性(例:特別なレイアウト、または1つの記事にしか表示されない奇妙なフォトギャラリー)があることがわかります。これらの場合、その特定のページに関連するファイルを作成し、要素が他の場所で再利用されることが明らかになったときにのみ本格的なウィジェットにリファクタリングすることができます。これはトレードオフであり、実際の予算上の懸念によって動機付けられます。

ネストを最小化します。セレクターをネストする代わりに新しいクラスを導入します。SASSがネスト時にセレクターを繰り返す手間を省くという事実は、5レベルの深さでネストする必要があることを意味しません。セレクターを過度に修飾しないでください(たとえば、「。nav」が同じジョブを実行できる場所で「ul.nav」を使用しないでください)。また、カスタムクラス名(たとえば、「h2.highlight」)と一緒にHTML要素を指定しないでください。代わりに、クラス名のみを使用して、ベースセレクターを削除します(たとえば、前の例は ".highlight"にする必要があります)。過剰修飾セレクタは値を追加しません。

アプリケーション全体で一貫している必要がある基本コンポーネントのスタイルを設定する場合にのみ、HTML要素のスタイル(「h1」など)を作成します。 とにかくいくつかの場所でオーバーライドする必要がある可能性があるため、「ヘッダーul」のような幅広いセレクターは避けてください。私たちが言い続けているように、ほとんどの場合、特定のスタイルが必要なときはいつでも、特定の適切な名前のクラスを使用する必要があります。

Block-Element-Modifierの基本を取り入れます。あなたは例えばここでそれについて読むことができます。非常に軽く使用しましたが、それでもCSSスタイルを整理するのに大いに役立ちました。


2

多くの場合、個人はファイルをセクションに分割し、セクション間の見出しコメントを付けて表示します。

何かのようなもの

/* Headings and General Text */

.... stuff here for H1, etc..

/* Main page layout */

.... stuff here for layout page setup etc.

これは非常にうまく機能し、後で戻って作業中のものを簡単に見つけることができます。


これは、「すべてのものに個別のCSS属性」があることについての質問者の懸念については何も述べていません。
G-Wiz

1

BEMを見てください。

理論

BEMは、物事をより再利用可能かつモジュール化し、スパゲッティコードや特異性の頭痛の原因となるようなセレクター間の衝突を回避するために、CSSセレクターを整理および命名するための一連の指示を提供する試みです。

正しく使用すると、実際に非常に良い効果が得られます。

  • スタイルは、要素に追加されたときに期待どおりに機能します
  • スタイルはリークせず、追加されたものにのみ影響します
  • スタイルはドキュメント構造から完全に切り離されています
  • スタイルを強制的に互いにオーバーライドする必要はありません

BEMはSASSとうまく連携して、ほぼオブジェクト指向のスタイルをCSSにもたらします。単一のUI要素の表示を処理し、色や内部要素の処理方法などの「メソッド」などの変数を含むモジュラーファイルを構築できます。筋金入りのOOプログラマーはこの考えに疑問を投げかけるかもしれませんが、実際には、適用される概念は、モジュール性、疎結合、緊密な結束、コンテキストフリーの再利用性など、OO構造の多くの優れた部分をもたらします。Sassと&Operaを使用して、カプセル化されたオブジェクトのように構築することもできます。

Smashing Magazineのより詳細な記事はここにあります。CCS WizardryのHarry Roberts(cssに関係する人は誰でも読む必要がある)の1人がここにいます

実際には

私はこれを何度か使用していますが、SMACSSとOOCSSを使用しているので、それらを比較するものもあります。私はまた、しばしば私自身の未経験の創造物である、いくつかの大きな混乱に取り組んできました。

私がBEMを現実の世界で使用するとき、私はいくつかの追加の原則でテクニックを増強します。私はユーティリティクラスを利用しています-良い例はラッパークラスです:

.page-section {
    width: 100%;
}
@media screen and (min-width: 1200px) {
    margin: 0 auto;
    width: 1200px;
}

また、カスケードと特定性にもある程度依存しています。ここではBEMモジュールは以下のようになります.primary-box.headerオーバーライド特定のコンテキストになります

.header {
  .primary-box {
    color: #000;
  }
}

(私はすべてを可能な限り一般的でコンテキストフリーにするために全力を尽くしています。つまり、優れたプロジェクトはほとんどすべてが再利用可能なモジュールにあることを意味します)

ここで最後に述べておきたいのは、プロジェクトが小さく複雑でない場合でも、最初からこれを実行する必要があるという2つの理由があります。

  • プロジェクトは複雑さが増すため、CSSを含め、適切な基盤を構築することが重要です
  • WordPressで構築されているためにシンプルに見えるプロジェクトでもJavaScriptがほとんどない場合でも、CSSで非常に複雑になる可能性があります。サーバー側のコーディングを行う必要がないので、その部分はシンプルですが、パンフレットのようなフロントエンドです。 20のモジュールとそれぞれの3つのバリエーションがあります。非常に複雑なCSSがあります。

Webコンポーネント

2015年には、Webコンポーネントの調査を開始します。これらについてはまだ詳しくは知りませんが、すべてのフロントエンド機能を自己完結型モジュールにまとめ、BEMからフロントエンドに一種の原則を全体として適用し、コンポーネント化して分散していますが完全に結合するようにしています。 DOMフラグメント、Js(MVC)、CSSなど、すべて同じUIウィジェットを構築する要素。

これを行うことにより、theybは、他のフロントエンドアーキテクチャのいくつかをより健全にする一方で、BEMなどで解決しようとしたcssに存在する元の問題のいくつかに対処します。

ここにいくつかのさらなる読書があります、そしてまたここに一見の価値があるフレームワークPolymerがあります

最終的に

また、これは優れた最新のベストプラクティスCSSガイドであると思います。これは、大規模なCSSプロジェクトが煩雑にならないように特別に設計されています。私はこれらのほとんどをフォローしようとします。



0

ここにはいくつかの素晴らしい資料があり、この質問に答えるのにかなりの時間を費やしている人もいますが、個別のスタイルシートまたは個別のスタイルシートのいずれかになると、開発用に個別のファイルを使用し、サイト全体で使用されるすべての一般的なcssをマージしますデプロイ時に単一のファイルに。

このようにすると、両方の長所を持ち、パフォーマンス(ブラウザーから要求されるHTTP要求が少なくなる)と開発中のコードの分離が向上します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.