ホームページ > 記事 > ウェブフロントエンド > Vue3 学習による CSS モジュールとスコープの詳細な分析
vuejs ビデオ チュートリアル 、Web フロントエンド開発 ]変換前
<style module> .title { font-size: 14px; font-family: Microsoft YaHei, Microsoft YaHei-Bold; font-weight: 700; color: #13161b; } .name { display: flex; align-items: center; &-img { width: 24px; height: 24px; border-radius: 4px; } &-text { font-size: 14px; font-family: Microsoft YaHei, Microsoft YaHei-Regular; font-weight: 400; color: #13161b; } } </style>
cell: (h, { col, row }) => { // console.log(style); return ( <span class={style.name}> <img src={testImage} class={style['name-img']} /> <span class={style['name-text']}>{row.name}</span> </span> ); },
tag.name-img は _name_img_6hlfj_11 などに変換されます。
スコープ付き CSS
<template> <div class="example">hi</div> </template> <style module> .example { color: red; } </style>
<!-- 用自定义属性把类名封装起来了 --> <style> .example[data-v-f3f3eg9] { color: red; } </style> <template> <div class="example" data-v-f3f3eg9>hi</div> </template>
a6167d77ee734aaef6dcd2aa69de7b33
を追加します。a6167d77ee734aaef6dcd2aa69de7b33
コード ブロックは CSS モジュールにコンパイルされ、生成された CSS クラスは $style
オブジェクトのキーとしてコンポーネントに公開されます。テンプレート
$style で直接使用できます。
8784e2fd63a27a4a8fec0995a8e86d19 などの名前付き CSS モジュールの場合、コンパイルされた CSS クラスは、
content オブジェクトのキーとしてコンポーネントに公開されます。つまり
module 属性値が何であっても、オブジェクトは公開されます。
useCssModule モジュール名は
<script setup> import { useCssModule } from 'vue' // 不传递参数,获取<style module>代码块编译后的css类对象 const style = useCssModule() console.log(style.success) // 获取到的是success类名经过 hash 计算后的类名 // 传递参数content,获取<style module="content">代码块编译后的css类对象 const contentStyle = useCssModule('content') </script> <template> <div>普通style red</div> <div :class="$style.success">默认CssModule pink</div> <div :class="style.success">默认CssModule pink</div> <div :class="contentStyle.success">具名CssModule blue</div> <div :class="content.success">具名CssModule blue</div> </template> <!-- 普通style --> <style> .success { color: red; } </style> <!-- 无值的css module --> <style module> .success { color: pink; } </style> <!-- 具名的css module --> <style module="content"> .success { color: blue; } </style>
Jsx および Tsx コンポーネント内に適用
JSX および TSX コンポーネントの場合TSX コンポーネントはスコープ付きスタイルを使用できないため、CSS モジュールが適切な選択です。cell: (h, { col, row }) => { // console.log(style); return ( <span class={style.name}> <img src={testImage} class={style['name-img']} /> <span class={style['name-text']}>{row.name}</span> </span> ); },
<script> export default { props: { text: { type: String, default: '' } }, render(h) { return <span class={this.$style.span1}>hello 222 - {this.text}</span>; } }; </script> <style module> .span1 { color: blue; font-size: 40px; } </style>
:global selector
スコープまたはモジュールで global を使用する場合、ただし、次のようにする必要があります。クラスのカプセル化を外部で行うことが最善であることに注意してください。そうしないと、グローバル スタイル
に影響を与える可能性があります。:ディープ アクション セレクター
ディープ アクション セレクターを使用すると、親コンポーネントのスタイルを子コンポーネントに浸透させることができます。原則として、子孫セレクターを使用します。/* 转化前 */ <style scoped> .a :deep(.b) { /* ... */ } </style> /* 转化后 */ .a[data-v-f3f3eg9] .b { /* ... */ }実際のプロジェクトでは、使用するコンポーネント ライブラリのデフォルト スタイルを変更したい場合、スコープ付き CSS ソリューションを使用する場合、深さセレクターを使用してデフォルト スタイルを変更できます。
/deep/: Obsolete
'>>>': Sass pre を使用しない場合- プロセッサを使用する場合は
深さセレクター /deep および >>> は非推奨です。代わりに :deep(.child-class)
を使用してください::v -deep:slotted() セレクターは、スロット内のスタイルを制御するための :slotted(selector) の使用をサポートします。 global() selector whenonly 一部のルールがグローバルに有効になる必要がある場合、グローバル スコープでスタイル タグを繰り返し宣言することはできませんが、global(selector) を使用してグローバル スタイルとして宣言することが許可されます。
#概要
CSS モジュール | スコープ付き CSS |
---|---|
Vue Loader はデフォルトでサポートしており、追加の構成は必要ありません | |
要素のハッシュ属性をカスタマイズし、属性セレクターを使用して要素を選択し、スコープ分離を実現します | |
を宣言し、style タグ内でスコープ付き | |
/ | |
1. スタイルがスコープによって制限されないようにグローバル スタイルを定義できます。2深いアクションで選択できます ツールはサブコンポーネントにアクセスして、サブコンポーネントのスタイルを制御します |
以上がVue3 学習による CSS モジュールとスコープの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。