Code.Yuのコーディング品質ガイドライン

コーディング

Code.Yuでは品質担保のため、以下のガイドラインを設けています。
日々進化するWeb技術に対応し、ガイドラインは随時アップデートしていきます。

HTML

セマンティックなマークアップ

Webサイトは視覚的に認識するユーザーだけに向けたものではありません。
スクリーンリーダーや検索エンジンへ向けたマシンリーダブルなマークアップを心がけます。

タグ用途
h1h6見出し
見出しに使用します。
適切な見出し構造になってることを意識したマークアップをします。
hgroup見出しグループ
サブタイトルを持つ見出しはhgroupで囲います。
p段落
文字、段落に使用します。
内容の長さに制約はありません。
ul > li順番が重要ではないリスト
ulタグはリスト
liタグはそのリストのアイテムに使用します。
ol > li順序つきリスト
olタグは順序つきリスト
liタグはその順序つきリストのアイテムに使用します。
※数字つきリストではありません。
dl dt dd説明リスト
dlタグは定義リスト
dtは項目名
ddはその説明に使用します。

dlタグの直下にdiv タグを入れてグループ化することも可能です。
em強調
文章や文字を強調するのに使用します。
重要性を表す場合には、strongを使用します。

<p>本日の<em>おすすめ</em></p>
strong重要
文章や文字の重要性を表すために使用します。

<p><strong>重要</strong>なお知らせ。</p>
small小さい文字
副次的なコメントや、補足、注意書きなどに使用します。

<p>10,000円<small>税別</small></p>
time日時
日付や時間を表すために使用します。
日付や時間のデータを正確にブラウザが解釈しやすくなります。
また、カレンダーアプリケーションなどがこの情報を活用することもできます。
iイタリック文字
斜体文字に使用します。

iはアイコンを表すタグではありません。
br改行
単純な行の改行に使用します。
※段落のスペースや、段落の区切りには使用しません。
aリンク
他のページ、ファイル、メールアドレス、位置などにリンクするために使用します。
aタグにはhref属性を必須とし、JavaScriptのクリックイベントのきっかけにはbuttonタグを使用します。
buttonボタン
主にフォーム送信やクリックイベントのきっかけに使用します。
sectionセクション
区切りに使用します。
sectionタグの中には、1つ以上のhタグを入れます。
article自己完結型のコンテンツ
お知らせ記事や、ブログ記事などの独立したコンテンツに使用します。

※ブログ詳細ページへのリンクが本文を省略している場合、articleタグには適合しません。
headerヘッダー
主にサイト全体のヘッダー部分に使用します。
ロゴやグローバルナビゲーションが含まれることが一般的です。
footerフッター
主にサイト全体のフッター部分に使用します。
ページの終わりを明示する役割もあります。
連絡先情報、サイトマップ、関連するリンクが含まれることが一般的です。
main主要なコンテンツ
ページの主要なコンテンツに使用します。
スクリーンリーダーユーザーがmain要素にスキップすることも期待できます。
aside主要なコンテンツから分離した要素
サイドバーや、記事の目次、関連記事などに使用します。
navナビゲーションリンクの集合
グローバルナビゲーションなどに使用します。
フッターに配置された少量のリンクの集合などには使用しません。
使いすぎに注意して使用します。
address連絡先情報
フッターなどの連絡先情報に使用します。
メールアドレス、電話番号、住所などの情報が含まれます。
figure > figcaption独立したイラストや写真
figureタグは独立した図表や画像などに使用します。
figcaptionタグはその説明やタイトルに使用します。

むやみに標準の動きを無効にして、イベントトリガーに使用しません。
クリックイベントにはbuttonタグを使用します。

<!-- ❌NG むやみに標準の動きを無効にしない -->
<a id="js-menu-open">メニュー</a>

<script>
  const menuOpen = document.querySelector("#js-menu-open");
  menuOpen.addEventListener("click", (e) => {
    e.preventdefault()
    // メニューオープンの処理
  });
</script>

div span について

HTMLの可読性にフォーカスすれば、できるだけdivspanの使用を控え、ネストは少なくするべきですが、divを減らすことに注力すると各タグへのCSSの負担は大きくなります。
そのため、Webサイト全体での保守性を重視してHTMLのネストを使います。
以下の順でマークアップすることで、セマンティックなマークアップ保守性の高いCSS設計を両立します。

デザインの再現は考慮せず、まずはセマンティック要素だけでマークアップします。

<header>
  <h1><a href="/">ロゴ</a></h1>
  <nav>
    <ul>
      <li><a href="/news/">お知らせ</a></li>
      <li><a href="/contact/">お問い合わせ</a></li>
    </ul>
  </nav>
  <button>メニュー</button>
</header>

<section>
  <h2>お知らせ</h2>
  <a href="/article-01/">
    <h3>お知らせタイトルが入ります。</h3>
    <p>お知らせの抜粋が入ります。</p>
  </a>
  <a href="/news/">お知らせの一覧をみる</a>
</section>

デザインの再現に必要なdivspan を追加していきます。

インナーのような特定の役割を担うdivタグも、CSSの保守性を重視して使用します。
この時点で使い回すパーツを意識します。使い回すパーツがBEM記法のBlock(起点)になるようにマークアップしていきます。

<header class="header">
  <div class="header__inner">
    <div class="header__logo">
      <h1 class="logo-header"><a href="/">ロゴ</a></h1>
    </div>
    <nav class="header__nav nav-header">
      <ul class="nav-header__list">
        <li class="nav-header__list-item">
          <a href="/news/" class="nav-header__link">お知らせ</a>
        </li>
        <li class="nav-header__list-item">
          <a href="/contact/" class="nav-header__link">お問い合わせ</a>
        </li>
      </ul>
    </nav>
    <div class="header__menu">
      <button class="button-menu">
        <span class="button-menu__icon"></span>
        メニュー
      </button>
    </div>
  </div>
</header>

<section class="news section">
  <div class="news__inner inner">
    <div class="news__heading">
      <h2 class="heading-section">お知らせ</h2>
    </div>
    <div class="news__articles">
      <a href="/article-01/" class="news__article article-news">
        <h3 class="article-news__title">お知らせタイトルが入ります。</h3>
        <p class="article-news__text">お知らせの抜粋が入ります。</p>
      </a>
    </div>
    <div class="news__more">
      <a href="/news/" class="button-primary">お知らせの一覧をみる</a>
    </div>
  </div>
</section>

参考サイト

「SEOに強いHTMLの書き方」についての個人的な見解

チェックツール

HTMLの品質チェックに以下のツールを使用します。

CSS(Sass)

Sass

Dart Sass、SCSS記法を使用します。
公式で非推奨とされているモジュールシステムは使用を控えます。

コンパイル環境

「gulp」または「VS CodeプラグインLive Sass Compiler」を使用します。

CSS設計

FLOCSS」または「BEM」を使用します。

CSSファイルの出力

ファイル分割はSassで行い、CSSは1つにまとめて出力します。ページ特有のCSSファイルや、リセットCSSなどを分割しません。

.scssファイルの分割

BlockごとにBlock名.scssファイルを作成します。
ファイル数が増える、ファイル作成の手間が増えるなどのデメリットはありますが、得られる恩恵も大きいです。

  • チーム開発の場合コンフリクトが減る
  • 可読性の向上
  • ブロック単位で管理するため、別プロジェクトへ再利用しやすい
  • どこに何が書いてあるか探す手間が省ける
  • クラス名の衝突を回避できる

ファイル構造

FLOCSSをベースに拡張したものを使用します。
GitHubはこちら

クラス名の命名規則

予測しやすいクラス名を付けます。

  • btnbutton
  • tittitle
  • headheading

上下右左のような場所ではなく、要素の情報をクラス名にします。

例えば、navタグをheader__rightというクラス名にした場合を見ていきます。

<!-- ❌ NG -->
<header class="header">
  <h1 class="header__left">ロゴ</h1>
  <nav class="header__right">
    <ul>
      <li><a href="#">ニュース</a></li>
      <li><a href="#">お知らせ</a></li>
    </ul>
  </nav>
</header>

上記のコードは、何か要素を追加した際に意味が通じなくなる恐れがあります。
場合によってはheader__centerに書き換えが必要になります。

要素の情報をクラス名にすることで、「予測しやすい」「保守しやすい」コードになります。

<!-- ⭕️ OK -->
<header class="header">
  <h1 class="header__logo">ロゴ</h1>
  <nav class="header__menu">
    <ul>
      <li><a href="#">ニュース</a></li>
      <li><a href="#">お知らせ</a></li>
    </ul>
  </nav>
  <div class="header__tel">
    <a href="tel:03-1234-5678">03-1234-5678</a>
  </div>
</header>

〇〇__top〇〇__bottomも同様の理由でなるべく使用しません。
また、上部を表すtopと、トップページを表すtopが混合すると、クラス名の予測が難しくなります。
クラス名を決める際には「上部をtop」「トップページをhome」で表すようにしています。

Block__Element–Modifyのルールで命名します。

FLOCSS、BEMの命名ルールに沿って命名します。
Blockの命名は役割-補足 で統一します。

  • 例) ヘッダーボタン → c-button-header
  • 例) セクション見出し → c-heading-section

主な役割には以下を使用します。

役割クラス名
カードcard
アイテムitem
リストlist
見出しheading
テキストtext
ボタンbutton
ロゴlogo
row
ナビゲーションnavigation

役割を先に持ってくることで、クラスの役割が直感的に理解できますし、名前順にソートされた時の可読性もよくなります。

使い回しを意識したCSS設計

使い回すパーツは、BEMの起点(block)になるように設計します。
blockには外側の余白を付けず、block__elementに外側の余白を付けます。

例えば以下の場合、c-heading p-item-news c-button には外側の余白を付けず、p-news__heading p-news__item p-news__button に外側の余白を付けます。
このようにすることで、外側に余白を持たない使い回しやすいblockになります。

<div class="p-news">
  <h2 class="p-news__heading c-heading">ニュース</h2>
  <div class="p-news__item p-item-news">
    <h3 class="p-item-news__title">ニュースのタイトル</h2>
    <p class="p-item-news__text">ニュースのテキスト</p>
  </div>
  <div class="p-news__item p-item-news">
    <h3 class="p-item-news__title">ニュースのタイトル</h2>
    <p class="p-item-news__text">ニュースのテキスト</p>
  </div>
  <div class="p-news__button">
    <a href="/news" class="c-button">ニュース一覧をみる</a>
  </div>
</div>

参考サイト

チェックツール

CSS(Sass)の品質チェックに以下のツールを使用します。

JavaScript

ライブラリの使用について

  • なるべくライブラリは使用せず、素のJavaScriptを使用します。
  • すでにjQueryが使用されているサイトではjQueryを使用します。
  • スライダーUIのような複雑な機能はライブラリを使用します。
    • その際の選定基準として、アクセシビリティと軽さを重視しています。

変数について

可能な限りconst を使って定義します。
constでの定義を徹底していれば変数に関する問題はある程度回避できます。

  • 意図しない書き換えによるエラーを防ぐことができる。
  • 変数名がバッティングした際にエラーで知らせてくれる。

さらに、変数の使用範囲を限定して、グローバル汚染を防ぐアプローチをしています。

/**
 * アコーディオンの初期化
 */
const initAccordion = () => {
  const button = document.querySelector("#js-button-accordion");
  button?.addEventListener("click", () => {
    // アコーディオンの処理
  });
};

/**
 * ドロワーの初期化
 */
const initDrawer = () => {
  const button = document.querySelector("#js-button-hamburger");
  button?.addEventListener("click", () => {
    // ドロワーの処理
  });
};

関数を使ったモジュール化

各処理を名前付き関数でモジュール化しています。
即時関数でまとめる方法もありますが、名前付き関数の方が扱いやすいと考えています。

/**
 * viewport切り替えの初期化
 */
const initSwitchViewport = () => {};

/**
 * トップへ戻るボタンの初期化
 */
const initToTop = () => {};

/**
 * アコーディオンメニューの初期化
 */
const initAccordion = () => {};

// 関数の実行
initSwitchViewport();
initToTop();
initAccordion();

1関数1処理

例えばハンバーガーメニューという1つのUIでも、その中で複数の処理が必要な場合があります。
全ての処理を長々と書くと可読性が悪くなるため、1関数1処理でまとめるようにしています。

/**
 * ドロワーメニューの初期化
 */
const initDrawer = () => {
  /**
   * ドロワーのトグル処理
   */
  const toggleDrawer = () => {};

  /**
   * フォーカストラップ処理
   */
  const focusTrap = () => {};

  // 関数の実行
  toggleDrawer();
  focusTrap();
};

// 関数の実行
initDrawer();

ハードコーディングしない

名前付き関数にすることで、関数内で使用する値はある程度予測できますが、いきなり値が出てくると理解に苦労します。

// ❌ NG いきなり3.14という値が出てくると、何の値か理解しずらい
const calCircleArea = (radius) => {
  return radius * radius * 3.14;
}

できるだけ値のハードコーディングは避けます。

// ⭕️ OK 値の役割が分かりやすいい
const calCircleArea = (radius) => {
  const pai = 3.14
  return radius * radius * pai;
}

DOCコメントを書く

DOCコメントを書くことで、メンテやレビューする人の負担を減らします。

基本は関数にDOCコメントを残します。
理解が難しい変数にもDOCコメントを残します。

/**
 * 円の面積を計算する関数。
 * 
 * @param {number} radius - 円の半径。
 * @returns {number} 計算された円の面積。
 */
const calCircleArea = (radius) => {
  const pai = 3.14;
  return radius * radius * pai;
};

チェックツール

JavaScriptの品質チェックに以下のツールを使用します。

  • Chrome コンソールタブ
  • ES Lint

参考サイト

WordPress

クラシックテーマ開発

現在はクラシックテーマでの開発にご対応しています。
テンプレートはPHPでハードコーディングし、更新が必要な機能に限りWordPressの機能を組み込んでいます。

  • カスタムフィールド
  • ブログやお知らせなどの投稿機能
    • 使用頻度の高いブロックの組み合わせは、パターンかプラグインを使ってカスタムブロックを作成しています。
  • カスタム投稿タイプ
  • 特定の要望に応じたカスタマイズ

WordPressコーディング規約

開発環境にPHPCodeSnifferを導入し、WordPressのコーディング規約を導入しています。

チェックツール

レスポンシブコーディング

モバイルファースト、デスクトップファースト

PCとSPのデザインカンプが揃って支給されるされる場合にはモバイルファーストでコーディングします。

個人的にはどちらが優れているというのはあまり感じません。
display: flex;display: block; の打ち消しが生じるという理由から、モバイルファーストが適してるという意見を目にしますが、flex-derectionの切り替えでさほど変わらない印象です。

// モバイルファースト
.card-box {
  display: flex;
  flex-direction: column;
  gap: 20px;

  @media (min-width: 768px) {
    flex-direction: row;
  }
}
// デスクトップファースト
.card-box {
  display: flex;
  flex-direction: row;
  gap: 20px;

  @media (max-width: 767px) {
    flex-direction: column;
  }
}

ブレイクポイント

ブレイクポイントはSassのマップ型変数で管理し、Bootstrapのブレイクポイントを参考にします。

// ブレイクポイントのサイズ定義
$breakpoint-size: (
  "sm": 576,
  "md": 768,
  "lg": 992,
  "xl": 1200,
  "xxl": 1400,
);

// ブレイクポイント (SP基準)
$breakpoints: (
  sm: "(min-width: #{map.get($breakpoint-size,'sm')}px)",
  md: "(min-width: #{map.get($breakpoint-size,'md')}px)",
  lg: "(min-width: #{map.get($breakpoint-size,'lg')}px)",
  xl: "(min-width: #{map.get($breakpoint-size,'xl')}px)",
  xxl: "(min-width: #{map.get($breakpoint-size,'xxl')}px)",
);

メディアクエリはmin-widthmax-widthで統一します。双方から指定が必要な場合はnotを使用します。

$breakpoints: (
  sp: "not (min-width: 768px)",
  pc: "(min-width: 768px)",
);

デザインカンプにないブラウザ幅の対応

リキッドデザインでコーディングします。
リキッドデザインとは画面サイズに合わせてコンテンツが柔軟に調整されるデザインです。
その反対にソリッドデザインがありますが、ソリッドデザインはレイアウトが固定されたデザインのことで、画面サイズによって水平スクロールするのが特徴です。

対応ブラウザサイズ

320px〜1980pxで表示崩れがないか確認します。

ジャンプ率を意識したレスポンシブコーディング

よしなに対応する場合には、全体のジャンプ率を意識してコーディングします。

種類スマートフォンデスクトップ
本文16px18px
小見出し20px22px
中見出し24px28px
大見出し30px34px

フォントサイズの可変やrem変換

font-sizeremで指定する際には、htmlタグのfont-sizeに依存しない形で指定します。

pxをremに計算する方法

// rem計算
@function rem($font-size-px) {
  @return calc($font-size-px / 16 * 1rem);
}

h1 {
  font-size: rem(30);
}

中間サイズを可変にする方法

ジェネレーターやSassの関数を使って、要素に直接指定します。

p {
  font-size: 16px;

  @media (min-width: 768px) {
    font-size: clamp(18px, ブラウザ幅に応じた可変サイズ, 22px);
  }
}

ジェネレーター
https://min-max-calculator.9elements.com/

参考
https://zenn.dev/hilosiva/articles/e9ae1bee08bdfc

以下のような実装はあまり良い方法ではないと考えています。

  • htmlタグのfont-size をvwで調整して、各要素をremで可変にする方法
  • htmlタグのfont-size を62.5%にして、remの計算を容易にする方法

画像について

命名規則

ページ/役割_位置-詳細+番号_状態を基本の型とします。
※詳細はハイフンで繋いで複数指定できます。
※不要な項目は省略します。

例) contact/img_top-swiper1_sp.webp
お問い合わせページのトップスワイパー1枚目スマホ画像

例) common/icon_arrow-right-red.svg
共通の赤い右向き矢印アイコン

役割の命名

役割には以下を使用します。なるべく種類を絞って使用します。

役割クラス名
画像、図、写真img
背景bg
ロゴlogo
アイコンicon
テキストtext
装飾deco

役割を付けることで、altを書く際にも迷いを減らすことができます。

  • bg と deco → 装飾のためalt不要
  • logo と text → ロゴやテキストの文字をそのままaltに書く
  • img → 「写真:〇〇」や「グラフ:〇〇」や「〇〇な様子」のように、画像の説明まで付ける。

画像の書き出しサイズと圧縮について

画像は全て2倍サイズで書き出し、圧縮とWebp変換を行います。

遅延読み込みとdecoding

様々な考え方があるかと思いますが、imgタグにはdecoding="async" を付けます。
また、遅延読み込みをするimgタグにはloading="lazy" を付けます。

レイアウトシフト対策

画像にはwidth属性とheight属性を書きます。
最終的なimgタグは以下のようになります。

<img src="パス" alt="代替えテキスト" width="300" height="300" loading="lazy" decoding="async">

レスポンシブ対応

PCとSPで比率や表示が異なる画像は picture タグを使って切り替えます。
画像サイズのみ切り替える場合はimgタグのsrcset属性を使用します。

サポートブラウザは限られますが、pictureタグにもwidth属性とheght属性を付けます。
サポートされていないことで、何か不具合が起きるものではありません。

<picture>
  <source media="(min-width: 768px)" srcset="./img/bg_top_pc.webp" width="1440" height="800">
  <img src="./img/bg_top_sp.webp" alt="代替えテキスト" width="375" height="700" loading="lazy" decoding="async">
</picture>

アクセシビリティーの取り組み

Code.Yuのホームページ制作では、JIS X 8341-3:2016 達成基準A を目指します。
コーディング代行業務では、指示された仕様やデザインを優先します。

カルーセルUIや動画埋め込みは自動再生しない。

原則自動再生では再生ボタンで動作を開始し、一時停止機能を実装します。

袋小路に陥らせないようにする

モーダルUIやドロワーUIが開いた状態で、元の画面に戻れなくならない配慮をします。
キーボード操作だけ閉じることができるかも確認します。

光の点滅などのアニメーションは避ける

ホバーアニメーションやスクロールアニメーションはコーダーがよしなに対応する場面も多いですが、光が点滅するアニメーションは避けます。

imgタグには代替えテキスト(alt)を適切に付与する

装飾画像

デザイン装飾やコンテンツとして意味を持たない画像はalt属性を空にします。

ロゴ画像

画像に書かれた文字をそのままalt属性とします。

テキスト画像

可能な限りテキストは画像化しないアプローチを行います。
やむをえず画像化する場合は、文字をそのままalt属性とします。

画像の種類を伝える

「〇〇の画像」「〇〇の写真」または、「画像:〇〇」「写真:〇〇」のように、画像の種類や状態を書きます。

図や表の画像について

図や表の意味が適切に伝わるようにaltを付与します。
alt="〇〇の表" のようにはしません。

<img src="path" alt="診療案内表:月曜から金曜、及び日曜は診療日で、土曜日は休診日です。診療時間は、前半の部が午前9時から正午まで、そして後半の部は午後1時から午後10時までとなります。">

複雑な表やグラフなどで、altの文字数があまりに多くなる場合にはaria-labelledbyを使ったアプローチも検討します。

<img src="path" alt="診療案内表" aria-labelledby="table-description">
<p id="table-description" class="u-hidden-visually">月曜から金曜、及び日曜は診療日で、土曜日は休診日です。診療時間は、前半の部が午前9時から正午まで、そして後半の部は午後1時から午後10時までとなります。</p>

キーボード操作でアクセスできるようにする

フォームの操作やドロワーメニューのオープンなど、すべてキーボード操作できるようにします。

  • JavaScriptのクリックイベントのきっかけになるタグにはbutton タグを使用します。
  • キーボード操作が無効になるため、チェックボックスやラジオボタンをdisplay: none; で消してスタイルの上書きをしません。要素本来の機能を損なわないアプローチをします。

操作に制限時間を設けない

操作に制限時間は設けません。

アイコンのみで情報を伝える場合

視覚的に認知できるユーザー以外も考慮します。
視覚的には要素を非表示にするユーティリティクラスを用意します。

.u-hidden-visually {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  padding: 0 !important;
  margin: -1px !important;
  overflow: hidden !important;
  clip: rect(0, 0, 0, 0) !important;
  white-space: nowrap !important;
  border: 0 !important;
}

3本線のアイコンのみでメニューを表す場合には、u-hidden-visuallyクラスを使って、メニューボタンであることを伝えます。

<button class="button-menu">
  <span class="button-menu__bar"></span>
  <span class="button-menu__bar"></span>
  <span class="button-menu__bar"></span>
  <span class="u-hidden-visually">メニュー</span>
</button>

もしくはaria-label を使って、メニューボタンであることを伝えます。

<button class="button-menu" aria-label="メニュー">
  <span class="button-menu__bar"></span>
  <span class="button-menu__bar"></span>
  <span class="button-menu__bar"></span>
</button>

スクリーンリーダーで読み上げた時に意味が通じるマークアップ

  • 文字間のスペースはCSSで調整を行います。文字列のスペースで調整すると、ツールによっては別の意味で読み上げられます。
    • 場 所 「ばしょ」ではなく「ばところ」
    • 時 間 「じかん」ではなく「ときあいだ」
<!-- ❌ NG -->
<dl>
  <dt>場  所</dt>
  <dd>東京都</dd>
  <dt>時  間</dt>
  <dd>11:00</dd>
</dl>

マークアップの順番

ヘッダーやトップへ戻るボタンのようなposition: fixed;で固定する要素は、どの順番でマークアップしても視覚的には問題ありません。
ですが、フォーカス順や読み上げツールを考慮した適切な順番でマークアップします。

<!-- ❌ NG -->
<button>トップへ戻る</button>

<h2>お知らせ</h2>

<header>ヘッダー</header>

<h2>お問い合わせ</h2>

テキストの拡大縮小機能で読み取れる設計にする

ブラウザの画面拡大機能で文字サイズを変更できるようにします。

<meta name="viewport" content="width=device-width, initial-scale=1">

*(アスタリスク)や※(米印)について

*や※だけで特定の表現をしません。記号が意味する情報を伝えます。

<label>
  お名前*<span class="u-hidden-visually">必須項目</span>
  <input type="text">
</label>
<p>「*」は必須項目です。</p>
<label>
  お名前*
  <input type="text" required>
</label>

スムーススクロールについて

スムーススクロールはaタグ本来の動きを損なわないようにします。
prevendDefault()で無効にしてアニメーションする場合、カバーしなければいけない項目が多いです。

  • フォーカス位置の考慮
  • 読み上げツールの考慮
  • デフォルトのクリックイベントとJavaScriptのクリックイベントの違いの吸収

上記を考慮して、aタグ本来の動きを損なわない実装をします。
細かいカスタマイズができないなどのデメリットはありますが、CSSでの実装が最適と考えています。

html {
  scroll-behavior: smooth;
}

参考サイト

チェックツール

品質チェックに以下のツールを使用します。

CoreWebVitalsに関する取り組み

CoreWebVitalsとは、Googleが発表したWebページ上でのユーザーエクスペリエンス(UX)を向上させるための重要な指標で、「LCP」「FID」「CLS」で評価されます。

  • LCP : 最も大きな画像やテキストブロックのようなコンテンツが完全に読み込まれて画面に表示されるまでの時間を測定します。
  • FID : ユーザーがページ上で何かの操作を試みたとき(例えばリンクをクリックするなど)に生じる遅延を測定します。
  • CLS : ページのロード中やインタラクションの間に起こる予期せぬレイアウトの変更の程度を測定します。

要約すると「表示が素早く(LCP)、スムーズに操作でき(FID)、画面がガタガタしない(CLS)サイト」を表します。
CoreWebVitalsに関する取り組みとして、以下を行っています。

画像の圧縮とWebP変換

サイトの表示スピードにおいて最も重要な部分です。
画像を圧縮して、WebP形式に変換します。

適切な画像サイズを使用

必要以上に大きな画像を読み込まないようにします。
画像サイズのみ切り替える際はimgタグのsrcset属性を使用します。
アートディレクションが必要な場合は、pictureタグを使用します。

遅延読み込み

すぐに読み込む必要がない画像はloading="lazy" で遅延読み込みします。
imgタグだけではなく、iframeタグにも使用できます。

レイアウトシフト対策

imgタグにはwidthheightを付けます。

外部ファイルはまとめる

CSSは1つにまとめて外部ファイルとして読み込みます。
ファイルの分割はSassで行います。

不要なライブラリやプラグインを見直す

jQueryや、その他ライブラリの使用を見直します。

フォントのサブセット化

サブセット化したフォントを、セルフホスティングして使用します。

CoreWebVitalsの計測ツール

サイト公開前にチェックを行うことが多いため、Lighthouseをチェックツールとして採用します。
PageSpeed Insightsもメジャーなチェックツールです。

CoreWebVitalsの計測環境について

Lighthouseのスコアは計測環境によってスコアが変動するため、以下の環境での計測を推奨しています。

  • 本番環境
    • 実際の環境でパフォーマンスを計測できます。
  • 本番環境と同じサーバーのステージング環境
    • 実際の環境に近い条件でパフォーマンスを計測できます。

開発中に上記環境をご用意できない場合には、当方エックスサーバーのステージング環境で計測します。ローカルホスト環境でのスコアは参考程度にとどめます。

まとめ

以上がCode.Yuのコーディング品質ガイドラインになります。
すべてのお客様に高品質なホームページをご提供するため、これからも品質向上に努めて参ります。

ホームページ制作・コーディングの
ご相談は無料です。
お気軽にお問い合わせください。

お問い合わせ

軽木雄太

Code.Yu(コードユー)代表。
Webサイト制作、HTMLコーディング、WordPressオリジナルテーマ開発を承っております。お気軽にご相談ください。

ブログ一覧へ戻る
ご相談は無料です
お気軽にお問い合わせください