CSSOM(CSS Object Model)

編集

概要

編集

CSSOMは、JavaScriptを使用してCSSを操作するためのプログラミングインターフェースです。HTMLのDOMと同様に、CSSのスタイルルールをプログラムから動的に読み取り、変更することができます。

基本構造

編集

CSSOMツリー

編集

CSSOMは、CSSルールをツリー構造で表現します。

基本的な構造:
CSSStyleSheet
├── CSSRule
│  ├── セレクタ
│  └── スタイル宣言
└── CSSRule
    ├── セレクタ
    └── スタイル宣言

インターフェース階層

編集
CSSOMの主要インターフェース
インターフェース 説明 主な用途
CSSStyleSheet スタイルシート全体を表す スタイルシートの操作
CSSRuleList ルールの集合 ルールの列挙
CSSRule 個々のCSSルール ルールの操作
CSSStyleDeclaration スタイル宣言のセット プロパティの操作

プログラミングインターフェース

編集

スタイルの取得

編集

要素のスタイル取得

編集
コンピューテッドスタイルの取得:
const element = document.querySelector('.example');
const style = window.getComputedStyle(element);
console.log(style.backgroundColor);

インラインスタイルの操作

編集
style属性の操作:
element.style.backgroundColor = 'red';
element.style.setProperty('background-color', 'red');

スタイルシートの操作

編集

スタイルシートの追加

編集
新規スタイルシートの作成:
const sheet = new CSSStyleSheet();
sheet.replaceSync('body { background: yellow; }');
document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];

ルールの追加と削除

編集
CSSルールの操作:
const stylesheet = document.styleSheets[0];
stylesheet.insertRule('body { background: blue; }', 0);
stylesheet.deleteRule(0);

パフォーマンスと最適化

編集

レイアウトスラッシング

編集
問題のある実装:
// レイアウトスラッシングを引き起こす
elements.forEach(el => {
  const height = el.offsetHeight;
  el.style.height = height * 2 + 'px';
});
最適化された実装:
// バッチ処理による最適化
const heights = elements.map(el => el.offsetHeight);
elements.forEach((el, i) => {
  el.style.height = heights[i] * 2 + 'px';
});

アニメーションの最適化

編集

requestAnimationFrameの使用

編集
スムーズなアニメーション:
function animate() {
  element.style.transform = `translateX(${position}px)`;
  position += 1;
  requestAnimationFrame(animate);
}

requestAnimationFrame(animate);

アニメーションとトランジション

編集

CSSアニメーションの制御

編集
アニメーションイベントの処理:
element.addEventListener('animationstart', (e) => {
  console.log('アニメーション開始:', e.animationName);
});

element.addEventListener('animationend', (e) => {
  console.log('アニメーション終了:', e.animationName);
});

トランジションの制御

編集
トランジションイベントの処理:
element.addEventListener('transitionend', (e) => {
  console.log('プロパティ:', e.propertyName);
  console.log('所要時間:', e.elapsedTime);
});

メディアクエリ

編集

メディアクエリの監視

編集
matchMediaの使用:
const mql = window.matchMedia('(max-width: 600px)');

mql.addEventListener('change', (e) => {
  if (e.matches) {
    console.log('モバイルビュー');
  } else {
    console.log('デスクトップビュー');
  }
});

ブラウザ互換性

編集

主要ブラウザのサポート状況

編集
CSSOM機能のサポート状況
機能 Chrome Firefox Safari Edge
getComputedStyle
CSSStyleSheet
adoptedStyleSheets

演習問題

編集
  1. 要素のスタイルを動的に変更するプログラムを作成してください。
  2. メディアクエリを使用して、画面サイズに応じてスタイルを変更するプログラムを実装してください。
  3. アニメーションの進行状況を監視し、特定のタイミングで処理を実行するプログラムを作成してください。

参考文献

編集