8

CSS用のスケーラブルでモジュラーなアーキテクチャを読んだばかりですが、いくつかのことを考えさせられます。スヌークの2つの主要なテネットは次のとおりです。

  1. HTMLとコンテンツのセクションのセマンティック値を増やす
  2. 特定のHTML構造の期待値を減らします

つまり、これは、ターゲティングに非セマンティック要素タイプに依存するのではなく、セマンティッククラス名を使用することを意味します。たとえば、.someClass h5ターゲットにするのではなく、代わりにターゲット.someClass-titleを設定して、h5が別のものに交換された場合に、問題が発生しないようにすることができます。

個人的には、要素の階層をその名前でエンコードするのは不快だと思います(意味的に正しい場合でも)。私はやりたい.someClass .titleです。ただし、タイトルと同じくらい一般的なクラスを使用するには、このクラスがさまざまなコンテキストで使用されることを受け入れる必要があります。

それで、セレクターの前のアイテムによって名前空間が付けられることがわかっている場合、まったく異なるコンテキストで同じクラスを使用することに何か問題がありますか?

たとえば、私のサイトに「タイトル」のクラスが意味をなす3つの異なる場所があるとします。

HTML

<header class="pageHeader">
   <h1 class="title">Some Title</h1>
</header>

...

<article class="leadArticle>
   <h3 class="title">Some Article Title</h3>
</article>

...

<ul class="productPreviews">
   <li class="product">
      <h5 class="title">Some Product Name</h5>
   </li>
</ul>

CSS

.pageHeader .title
{

}

.leadArticle .title
{

}

.productPreview .product .title
{

}

編集:Alohciが以下の回答で述べているように、ヘッダータグは意味がないわけではないので、おそらくこれは使用するのに最適な例ではありませんでした。

明らかに、私はこれらのコンテキストでタイトルとはまったく異なることをしているかもしれませんが、タイトルはそのモジュールの名前空間で絶対的に意味があり、一般的なセレクターとしてタイトルを使用するつもりはありません。

これはすべてのボックスをチェックしているようです。それは意味的に豊富で、実装か​​ら完全に切り離されています。たとえば、最後の例がolまたはdivのスタックに変更された場合、何も壊れることはなく、タイトルがdivにラップされている場合でも、ターゲットになります。

これは私には理にかなっていますが、このアプローチがあまり使用されていないので、なぜだろうと思っています。明らかな欠点は、セレクターでクラスをチェーンしていることですが、これは各クラス名の名前空間よりも望ましいと思います。

4

4 に答える 4

5

HTMLをCSSから分離していると感じるので、h5要素だけを選択するのではなく、.titleのようなクラスを使用する方が好きです。何らかの理由で、h4またはh6がドキュメントのアウトライン、またはその他の要素/理由に適していると判断した場合、要素(h5)とクラス()を選択する場合は、CSSをリファクタリングする必要があります。タイトル)。

これが、マークアップが時間の経過とともに変化する可能性があるため、すべてのものと要素セレクターを分類することを好む理由です。多くの更新が表示されていない小規模なサイトで作業している場合、これは問題ではない可能性がありますが、注意するのは良いことです。

セレクターの前の項目によって名前空間が付けられることがわかっている場合、まったく異なるコンテキストで同じクラスを使用することに問題がある限り、私はそれについてさまざまな考えを持っています。

一方では、いくつかの懸念が思い浮かびます。たとえば、.titleの使用/意味/役割は、親セレクターがないと空になる可能性があります。(.pageHeader .title).titleは完全に優れたクラス名だと思いますが、他の開発者にとって、その意味が次のような親セレクターから来ていることを理解するのは難しいかもしれません。.pageHeader .title

もう1つの懸念は、モジュール内の「タイトル」の複数のインスタンスにクラス.titleを使用している場合、問題が発生する可能性があることです。基本的な考え方は、モジュール内で.titleの再利用性を拡張しようとすると、ローカルスコープの子孫セレクターが提供する制限が厳しすぎる場合があるということです。ここで話していることを示すために、コードデモを設定しました。

一方、子孫セレクターは、特にスコーピングの目的で最も使用されるセレクターの1つです。

A ListApartの開発者の1人であるTimMurtaugh(彼がリード開発者であるかどうかはわかりません)は、彼の個人サイトで彼のスタイルの大部分に子孫セレクターを使用しています。

私は最近これとBEMを調査しており、「これは各クラス名の名前空間よりも望ましい」というあなたの結論に同意します。

私は.pageHeader.title{...}よりも.pageHeader__title{...}の方が好きですが、ある状況で一方のアプローチが他方よりも有益な場合が常にあります。

ほとんどの場合と同様に、状況によって異なりますが、ネストを深くしすぎず、使用方法を慎重に検討すれば、子孫セレクターは、ローカルスコープのスタイルを提供すると同時にグローバルなソリューションを提供するための強力で優れたソリューションになると思います。スコーピングスタイル。

例えば:

/* Globally scoped styles for all .title(s) */
.title{
   font-family: serif;
   font-weight: bold;
}

/* Locally scoped styles for individual .title(s) */
.pageHeader .title {
    color: #f00;
}

.leadArticle .title {
    color: #00f;
}

.productPreview .product .title {
   color: #0f0;
}
于 2013-02-13T21:48:24.610 に答える
2

これについて言うことはほとんどないと思います。CSSのマークアップを整理するためのアプローチはこれだけではありませんが、実行していることは問題ありません。理解しておくべき重要なことは、クラス名はCSSの一部ではなく、HTMLの一部であるということです。

したがって、要素に適用されるクラスは、HTML用語では、DOMツリー内の祖先によって「名前空間化」されるのではなく、それ自体で機能します。したがって、例の各要素のクラス名に「title」を使用するのは合理的です。これらはすべてタイトルであるという点で似ているからです。

反対の例は、「note」のクラス名を使用すると言うことです。ある要素ではコメントのタイプを示し、別の要素では音符を示し、祖先要素を調べることでそれらの意味を区別できると仮定します。 。これは、HTMLクラスが機能することになっている方法ではありません。

また、について非意味的なものは何もないことに注意して作業し<h5>ます。CSSセレクターで要素名を使用することは、スタイルを設定する要素間の関係を説明するもう1つの方法です。.product h5セレクターとしては、「このようなクラス'product'のサブツリーのコンテキストで第5レベルの見出しをスタイルする...」を意味します。.product .titleこれは、「このようなクラス'product'のサブツリーのコンテキストでのクラス'title'のスタイル要素...」を意味する別のステートメントです。どちらのステートメントも役立ちます。

于 2012-08-27T23:50:24.063 に答える
1

注意すべき非常に重要なことの1つは、ブラウザーはCSSを左から右ではなく右から左に読み取るため、セレクターを数レベル深く構造化すると、ブラウザーが行う作業が増えることです。

.pageHeader .title {}
.leadArticle .title {}
.productPreview .product .title {}

つまり、これは1つの.titleですが、コンテキストが異なります。レンダリング中のブラウザは、子要素が特定の親要素内に配置されているかどうかを確認し、対応するルールを適用します。

.pageHeader-title {}
.leadArticle-title {}
.productPreview .product-title {}

ここでは、3つの非常に異なるタイトル(1つではありません!)があるため、ブラウザーは追加の計算を実行せず、子が特定の親の子であるかどうかをチェックしません。ここにあるのは、モジュールのよりフラットな構造でもあり、常に優れています。

セレクターをネストし、同じ方法で名前を付けることは、パフォーマンスに影響を与えることを常に忘れないでください。これは、小さな個人のWebサイトを作成している場合でも、何百万人ものユーザーが閲覧できるソリューションを計画して提供する必要がある場合は、何の意味もありません。次に、マークアップを適切に構造化する方法を知ることが重要です。

于 2014-11-08T15:03:20.623 に答える
0

これは「親子関係」(http://thesassway.com/advanced/modular-css-naming-conventions)と呼ばれることもあり、多くの場合、と一緒に使用することをお勧めし.page-header-titleます。

あなたの場合、コンポーネントとして、そしてコンポーネントパーツとして.page-header扱うことができます。.titleRCSS(https://github.com/rstacruz/rscss/)標準の支持者.page-header > .title。個人的にはあまり良い考えではないと思います。次のことを検討してください。

<header class="page-header">
<h2 class="title">
  <span class="tooltip">
    <span class="title">..</span>
  </span>
</h2>
</header>

.tooltip > .title意図せずにから継承し.page-header > .titleます。

だから私はと行き.page-header-titleます。

見出しを基本クラスから継承する場合は、HTML要素にクラスを追加するだけです。

<header class="page-header">
<h2 class="page-header-title title">
</h2>
</header>

page-header-titleコンポーネント固有のスタイルとtitle抽象的なタイトルスタイルの拡張が含まれるようになりました。はい、それは冗長ですが、安全です。ここで、興味があれば、スタイルのカスケードを正気に保ち、クリーンで明白な抽象化を行う方法についての私の詳細な意見https://github.com/dsheiko/pcss

于 2015-02-19T15:30:39.203 に答える