私の経験では、柔軟性とモジュール性のために、ブロックが幅やマージンに責任を持つべきではないことに気付きました。プロジェクトに「弾力性のある」ブロックがあると、機能やレイアウトを壊すことなく、ページのさまざまな領域 (さまざまなサイズ) を占めるようにブロックを移動できます。マージンに関しては、より高いレベルで定義されている場合、ブロック間に一貫したスペースを維持する方が簡単です.テンプレートブロックのようなものだと思いt-news
ます(「t」はテンプレート用であると考えてください)。
BEM はモジュール性がすべてであり、特定のブロックに関連するすべてのコードはファイル システムのブロックのフォルダーにとどまるため、CSS の一部にすぎないメディア クエリと同じであるべきです。重要なことは、CSS が何を行っているかを知ることです。たとえば、一連のルールがテンプレートの領域と余白を定義している場合、そのためのメディア クエリが必要かどうかに関係なく、これらのルールはブロックの一部である必要があります。これらの定義を担当しています。
このアプローチでは大量のメディア クエリが生成される可能性があり、レンダリング パフォーマンスに懸念が生じる可能性がありますが、この記事によると、複数のメディア クエリは互いに異なる場合にのみパフォーマンスに影響を与える可能性があります。のような同じルールの繰り返しは、@media (max-width: 850px)
シリアル化され、1 つとして解釈されます。
このように、領域とマージンに関連するメディア クエリはテンプレート ブロックに入り、コンポーネント自体に関連する追加のメディア クエリはコンポーネント ブロックに入ります。テンプレートはサイズを担当するので、あなたの例では、「小さい」修飾子をテンプレート ブロックに変更します。
また、プロジェクトの存続期間中に色が変わる可能性があるため、修飾子としてgreen
andを使用することを再検討します。やred
など、要素の外観を説明していないものを試すことをお勧めします。correct
alert
最後に、修飾子は のように HTML の要素クラスに従う必要があることを覚えておいてくださいb-post__text b-post__text--alert
。
更新されたコードは次のとおりです。
HTML :
<div class="t-news">
<div class="t-news__post b-post">
<div class="b-post__title">Title 1</div>
<div class="b-post__text">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam eget ligula eu lectus lobortis condimentum. Aliquam nonummy auctor massa. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla at risus. Quisque purus magna, auctor et, sagittis ac, posuere eu, lectus. Nam mattis, felis ut adipiscing.</div>
</div>
<div class="t-news__post b-post">
<div class="b-post__title">Title 2</div>
<div class="b-post__text b-post__text--correct">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam eget ligula eu lectus lobortis condimentum. Aliquam nonummy auctor massa. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla at risus. Quisque purus magna, auctor et, sagittis ac, posuere eu, lectus. Nam mattis, felis ut adipiscing.</div>
</div>
<div class="t-news__post t-news__post--small b-post">
<div class="b-post__title">Title 3</div>
<div class="b-post__text">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</div>
</div>
<div class="t-news__post t-news__post--small b-post">
<div class="b-post__title">Title 4</div>
<div class="b-post__text b-post__text--alert">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</div>
</div>
</div>
SCSS :
.t-news {
display: flex;
flex-flow: row wrap;
justify-content: flex-start;
margin: -0.5rem;
&__post {
margin: 0.5rem;
width: calc(50% - 1rem);
@media (max-width: 800px) { width: calc(100% - 1rem); }
&--small {
width: calc(25% - 1rem);
@media (max-width: 800px) { width: calc(50% - 1rem); }
}
}
}
.b-post {
box-sizing: border-box;
border: 1px solid #eeb;
background: #ffc;
padding: 0.5rem;
&__title {
font-size: 1.5rem;
@media (max-width: 800px) { font-size: 1.25rem; }
}
&__text {
font-size: 1rem;
&--correct {
color: green;
}
&--alert {
color: red;
}
}
&--small {
border: none;
font-style: italic;
}
}
お役に立てれば。