ようこそ、CSSの沼へ!
とりあえず結論を書きます。
セレクタはクラス名の指定だけにしましょう
全てのクラス名をユニークにしましょう
まず、ひとつのサイトで同じコンポーネント(ページの部品)は同じデザインである、ということが前提です。
あるページのサイドバーのリンクが、別のページでは全然別の場所に別のデザインで配置されている、となると閲覧する人のためにならないからです。
ですので、同じコンポーネントに対するスタイルは、『干渉』を気にしなくていいというか、原則として同じになるべきです。
違うコンポーネントについて『干渉』が起きてしまう場合、これはおおむねクラスの名づけが悪いです。
原則として、完全に同じ意味を持つためデザインが完全に同じであるべき要素以外は、全て別のクラス名にすれば『干渉』はしません。
簡単に言うと、
html
1<style>
2 .user-card {
3 /* ... */
4 }
5
6 .user-card h1 {
7 /* ... */
8 }
9
10 .user-card .info {
11 /* ... */
12 }
13</style>
14<div class="user-card">
15 <h1></h1>
16 <div class="info"></div>
17</div>
↑こうではなくて↓こう書きましょう、ということです。
html
1<style>
2 .user-card {
3 /* ... */
4 }
5
6 .user-card__name {
7 /* ... */
8 }
9
10 .user-card__info {
11 /* ... */
12 }
13</style>
14<div class="user-card">
15 <h1 class="user-card__name"></h1>
16 <div class="user-card__info"></div>
17</div>
これについては、BEMというCSS設計手法(とその分派)が一般に使われています。
ただ、BEMにせよ、その派生のOOCSSにせよ、SassやCSS変数が本格的に使われるようになる前の思想でして、2025年現在に古典的なCSS設計を忠実に使うのが正しいのか、疑問が残るところです。
さらに、@layer
や@scope
の実装により、これらの手法は今後使われなくなっていくかもしれません。
また、別の設計思想を持つBootstrapやTailwindのようなユーティリティクラスベースのCSSライブラリなどもありますし、VueやReactなどではスコープ付きCSSなどのライブラリを使ってクラス名をユニークにビルドすることもあります。
質問の変更を受けて追記
もし、ご質問の内容が「あるページのスタイルを別のスタイルの干渉を受けずに書きたいが、別のスタイルを変更できない|したくない」ということであるなら、カスケードレイヤーはどうでしょうか。
html
1 <div class="test">.test は、赤字イタリック</div>
2 <style>
3 @layer test{
4 .test {
5 color: red;
6 font-style: italic;
7 }
8 }
9 </style>
10 <h1 class="test">h1.test は、赤字イタリックではない</h1>
11 <style>
12 h1 {
13 all: revert;
14 }
15 </style>
ただし、完全に干渉から逃れられるかというと、そういうことはないだろうと思います。
CSSファイルからの読み込みであれば、@import test.css layer(test)
のように、@import
ルールで読み込んでください。