0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Vue3]なんとしても今書いているcssを優先させる

Last updated at Posted at 2024-05-26

VueでUIライブラリを使っていると今作業しているvueファイルではないところでcssファイルを読み込んでいて、今書いているcssの適用されないことがある。

Cacading Style Sheetsと言う名前に反することにはなるが、そんな時に個人的に使っている方法を何個か挙げてみようと思う。

結論

  1. <style scope></style>の中に書く
  2. !importantをつける
  3. Vanilla JSの書き方で当てる

環境

UIライブラリはElement Plusを使っている。
vuetifyみたいなもので使いやすい。

package.json
{
    "vue": "^3.4.21",
    "sass": "^1.76.0",
    "element-plus": "^2.7.2",
}

cssが適用されない時

スクリーンショット 2024-05-26 22.32.03.png

今回はElement Plusのselectを例にしてみた。
デザインは白黒を中心にしているため、Element Plusのデフォルト色である青が気になる。

上記画面のコード

<template>
  <div class="update-container">
    <div>
      <el-select v-model="selectedCategory" placeholder="select">
        <el-option 
          v-for="(category, index) in categories"         
          :key="category.id"
          :label="category.name"
          :value="category"
        />
      </el-select>
      <input type="file" @change="uploadPhoto($event)" accept="image/*" />
      <div v-if="uploading">Uploading...</div>
      <div v-if="uploadError">{{ uploadError }}</div>
    </div>
  </div>
</template>
<style lang="scss" scoped>
.update-container {
  margin-top: 80px;
}
</style>

デベロッパーツールで見ると下画像のような構造になっている。

スクリーンショット 2024-05-26 22.38.05.png

今回はspanを黒にしてみたい。クラス名を当ててcssを書いてみる。

<style lang="scss" scoped>
.update-container {
  margin-top: 80px;
}
.el-select-dropdown__item {
  span {
    color: black;
  }
}
</style>

変化なし。

スクリーンショット 2024-05-26 22.42.22.png

方法1scopeに書く

コード

<style lang="scss" scoped>
.update-container {
  margin-top: 80px;
}
</style>
<style lang="scss" scope>
.el-select-dropdown__item {
  span {
    color: black;
  }
}
</style>

変わった!

スクリーンショット 2024-05-26 22.45.30.png

問題点

普段は他のコンポーネントに影響を与えないためscopedを使っている。

しかし、今回のように他のコンポーネントでも使われる可能性のあるクラス名でコードを書いていくと後でこのファイルに戻って処理する必要が出てくる。

そのため、scssを使っているなら親要素にクラス名を当ててあげると少し安全になる。
同じクラス名の使われる可能性があるため、完全回避はできないが...

<style lang="scss" scope>
.update-container { // 親要素のクラスを当てる
  .el-select-dropdown__item {
    span {
      color: black;
    }
  }
}
</style>

方法2 !importantを使う

今回はscopeの中に書くことで解決できたが、同じファイル内で同じUIコンポーネントを使っていて、どうしても今作業している方を優先したい時がある。

そんな時は!importantを使うとできる。

<style lang="scss" scope>
.update-container { // 親要素のクラスを当てる
  .el-select-dropdown__item {
    span {
      color: black !important;
    }
  }
}
</style>

方法3 Vanilla JSの書き方で当てる

やはり純正が一番効く。

しかし仮想DOMを使っているvueで直接この作業をすることが正しいかはわからない。
特に、onUpdatedの中じゃないと上手く操作できない時がある(できる時もある)

ここはもっとライフサイクルの勉強が必要そう。

<script setup lang="ts">
onUpdated(() => {
    const select = document.getElementById('select');
    select.style.color = 'black';
});
</script>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?