ガイドライン
コーディングには様々な方法があります。
各々のやり方でコーディングしては品質のバラつきや複数人で作業する際に連携が難しくなるため、
以下のガイドラインに則ったコーディングを行ってください。
7つの方針
- 文書構造的に正しいマークアップを行なってください。
- 意味を持たないタグ(divやspanなど)を過剰に使用したコードを書かないでください。
- コンテンツの増減で崩れない構造にしてください。
- 同一サイトでダブルスタンダードなことをしないでください。
- 同一デザインのスタイルを2つ以上作成しないでください。
- 自分でコーディングしたものの品質に責任を持ってください。
解説
HTMLコーディングはクオリティが表面に現れにくい作業です。
どんなに無駄なコードが多くても見た目や動きがデザインと合っていれば、ユーザーが使うものとしては問題ないと言えます。
しかし、Webサイトは作って終わりではないく、その後には必ず更新があります。
それがコーディングを担当した人ではないことは多々ありますし、半年後、1年後ということもあります。
そのため、更新性を考えずにデザインをただ再現しただけの冗長なコードや、その場限りのコードを書いてしまうと、更新する人はコードの把握に時間がかかります。また、問題も起こりやすくなりますし、更には問題が起きたときにも原因の特定が難しくなります。
以上の理由から、HTMLコーディングは単にデザインを再現するだけではなく、後のことやを考え更新性のあるコードにする必要があり、そのための方針です。
マークアップ
マークアップはコーディングにおいてとても重要な作業です。
HTMLの本質は文書の構造化であり、マークアップはそのための手段です。
正しいマークアップを行なうためにはHTMLタグ一つひとつの意味を理解し適切に判断して使用する必要があります。
以下のガイドラインを参考に、正しいマークアップを心がけてください。
意味・用途 | HTMLタグ | 解説 |
---|---|---|
見出し | h1~6 |
見出しに使用してください。 dt要素との使い分けに迷うことがありますので以下の基準で判断してください。
HTML5のsectionタグで文書の階層構造を表している場合に、見出しレベルの数字は1~6のどれを使っても仕様上の問題はありませんが、コードを読んだ際に階層レベルがわかりにくいため、sectionタグを使っていたとしても階層レベルに合わせて数字を増やしてください。 ※h1のマークアップについては「SEOについて」の項目参照 |
段落 | p |
段落(複数の文から構成される文章)に使用してください。 Webならではの表現である「もっと見る」などのテキストに使うかどうかで判断に迷うことがありますが、ナビゲーション用のテキストの場合はaタグでリンクという意味をつけているため、それに対して更に段落という意味を付ける意味はないと考えます。 その他にも段落とは言えず、どのようなタグも適していないテキストがでてくることがあります。 |
リスト | ul > li |
順序に意味がないリスト(箇条書き)に使用してください。 間違えがちなケースとして、デザイン上で箇条書きのような装飾がされている文章に使ってしまうことや、順序に意味がある箇条書きに使ってしまうことが挙げられます。 これらの間違いは、文章の先頭に中黒(・)やその他記号、番号が付いているかどうかだけで判断してしまった際に起きます。 |
順序リスト | ol > li |
順序に意味があるリスト(箇条書き)に使用してください。 ulタグによるマークアップの考え方に加えて順序に意味があるかどうかで使い分けます。 間違えがちなケースとして、他に適切なものがあるのにもかかわらず、頭文字に番号が入っているからといって使ってしまうことがあります。 |
定義リスト | dl > dt + dd |
用語とその説明から構成される文章に使用してください。 用語以外にも、新着情報の年月日(dtタグ)と内容(ddタグ)や対話型の文章の中で話者(dtタグ)とその内容(ddタグ)にも使用します。 汎用性が高く、用途も広いため便利なタグですが、よく考えずに使ってしまうと見出しとその文章をdlタグでマークアップしてしまうなど誤った使い方をしてしまうことがあります。 |
表 |
table > thead > tr > th + td table > tfoot > tr > th + td table > tbody > tr > th + td table > caption |
表に使用してください。 他のタグとは違い対象となるテキストが明確なため、誤った使い方をすることは稀ですが、以下に注意してください。
|
注釈・細目 | smallHTML5 |
免責・警告・法的規制・著作権・ライセンス要件などを注釈・細目に使用してください。 一般的なWebサイトでよくあるものとしては、コピーライトが挙げられます。 HTML4(XHTML1.0)では意味を持たず、フォントを小さくするための装飾用のタグでしたが、HTML5になり意味が付与されました。 |
お問い合わせ・連絡先 | address |
そのページに関するお問い合わせ先・連絡先に使用してください。 間違えがちなケースとして、あらゆる住所・連絡先に使ってしまうことが挙げられます。 HTML4ではコピーライトのマークアップにも使われますが、HTML5ではその役割をsmallが担っているため使用しないでください。 |
記事 | articleHTML5 |
このタグでマークアップされた内容が独立したコンテンツとして成り立つものに使用してください。 ブログ記事・ニュース記事・新着情報などが対象になります。
それでも困った場合には使用しないでください。 |
セクション | sectionHTML5 |
見出しとその内容からなる構造の文書に使用してください。 間違えがちなケースとしては、bodyタグ直下に入れるべきh1タグをsectionタグで囲ってしまうことが挙げられます。 sectionタグ以外にも、セクショニング・コンテンツに属する以下のタグがセクションを作ります。他に適切なタグがある場合はsectionタグではなく、そちらを使うようにしてください。
以下のセクショニング・ルートに属するタグは独立したセクション構造を作ります。セクショニング・ルートの内部のセクション階層は、外側のセクション階層には含まれないことに注意してください。
|
ヘッダー | headerHTML5 |
セクショニング・コンテンツかbody(文書全体)のヘッダーに使用してください。 従来のdiv#headerとしていた部分をheader#headerと置き換えられます。 |
フッター | footerHTML5 |
セクショニング・コンテンツかbody(文書全体)のフッターに使用してください。 従来のdiv#footerとしていた部分をfooter#footerと置き換えられます。 |
余談・補足情報 | asideHTML5 |
文章の本筋ではないが、余談・補足程度で軽く触れている文章や関連する広告・商品に使用してください。 文章の意図や書き手の考えを汲み取らなければ正しく使用できないため、使用が難しいタグの一つです。
|
本文から参照 される図版 |
figureHTML5 |
本文から参照される図版(挿絵・動画・図表・写真・コードなど)に使用してください。 このタグも使用が難しいものの一つです。
|
キャプション | figcaptionHTML5 |
figureタグでマークアップされた内容のキャプションに使用してください。 稀にfigureタグの中で図版の前後にキャプションのような文章が存在する場合があります。 |
フォームの項目名 | label |
inputタグやselectタグなど入力要素に対する項目名に使用してください。 このタグでマークアップされた内容をクリックしたときに、フォーカスが対象の要素に移るようにfor属性を指定してください。 |
マークアップのコツ
マークアップをするうえで最大の障壁となるものがデザインです。
デザインの表現は、しばしば文書構造を無視し、見た目を優先してしまいます。
そういったデザインを見た目のままにマークアップしようとすると誤った文書構造になりがちです。
そのような状態に陥らないために、マークアップの際には一度デザインを無視し、「目次は何か」「見出しとそれに対応するコンテンツは何か」「その文章は段落なのか、箇条書きなのか」ということを考えながら1サイトを1冊の本としてまとめるイメージで行なうことで正しい文書構造のマークアップをすることができます。
スタイルシート
スタイルシートは複雑化しやすいため、統一されたルールに則った構造設計や記述を行ってください。
CSSファイルの分割
標準テンプレートではCSSファイルはコンパイル時に「style.css」に統一されるようになっています。
よって、以下のような場合以外はCSSファイルは1つにまとめることとします。
- 標準テンプレート更新前から継続して対応している案件
- クライアントからCSSファイルを分割するように指示があった場合
テンプレート更新前は、サイト共通のcommon.cssとページごとのCSSファイルに分割して制作していました。
そのようなサイトの更新作業などの場合は旧テンプレートの仕様に従ってください。
また、先方レギュレーションを適用する案件など、クライアントからファイルの分割に関して指示があるケースがあります。
その場合はそちらのルールを優先してください。
なお、旧テンプレート準拠のソースでも、CSSシグネチャを使用している場合はページ個別のCSSファイルが存在しないので、間違わないように注意してください。
理由
Sassを使用することが標準となったため、制作時にページごとやコンポーネントごとにファイルが存在していても、コンパイル時に1つのファイルにまとめることが可能になりました。
そのため、以前懸念されていたファイルをまとめることによるメンテナンス性の低下や、複数人での作業のしやすさの問題が解消されたため、CSSファイルは原則として1つにまとめることとします。
SCSSファイルの分割
標準テンプレートに基づき、SCSSファイルは以下の様に分割して制作します。
[scss] ├ style.scss----------:分割されたSCSSファイルを統合する役目を持ちます │ ├ [0_base]------------:スタイルの基本設定を記述したファイルを格納するディレクトリです │ ├ _develop.scss----:開発用のスタイルを記述するファイルです │ ├ _mixin.scss------:Sassのミックスインを記述するファイルです │ ├ _reset.scss------:スタイルのリセットやノーマライズをするファイルです │ ├ _utility.scss----:微調整用のクラスなどを定義するファイルです │ └ _vars.scss-------:変数設定用のファイルです │ ├ [1_layout]----------:全体のレイアウトに関するスタイルを記述したファイルを格納するディレクトリです │ ├ _breadcrumb.scss-:パンくずリストのスタイルを記述するファイルです │ ├ _footer.scss-----:フッターのスタイルを記述するファイルです │ ├ _header.scss-----:ヘッダーのスタイルを記述するファイルです │ ├ _layout.scss-----:全体のレイアウトのスタイルを記述するファイルです │ └ _side.scss-------:サイドバーのスタイルを記述するファイルです │ ├ [2_component]-------:各種コンポーネントのスタイルを記述したファイルを格納するディレクトリです │ ├ _01_btn.scss-----:ボタンのスタイルを記述するファイルです │ ├ _02_title.scss---:タイトル(見出し)のスタイルを記述するファイルです │ ├ _03_icon.scss----:アイコンのスタイルを記述するファイルです │ ├ _04_form.scss----:フォーム関連のスタイルを記述するファイルです │ ├ _05_text.scss----:テキストのスタイルを記述するファイルです │ ├ _06_navi.scss----:ナビゲーションのスタイルを記述するファイルです │ ├ _07_img.scss-----:画像のスタイルを記述するファイルです │ ├ _08_list.scss----:リストのスタイルを記述するファイルです │ ├ _09_table.scss---:テーブルのスタイルを記述するファイルです │ ├ _10_line.scss----:区切り線のスタイルを記述するファイルです │ ├ _11_video.scss---:ビデオのスタイルを記述するファイルです │ ├ _12_slide.scss---:スライドのスタイルを記述するファイルです │ └ _99_other.scss---:その他のスタイルを記述するファイルです │ └ [3_project]---------:各ページ独自のスタイルを記述したファイルを格納するディレクトリです ├ _index.scss------:トップページのスタイルを記述するファイルです └ _about.scss------:aboutページのスタイルを記述するファイルです
理由
CSSファイルにコンパイルした時にファイルを1つに統合するとしても、制作段階から1つのファイルで作業すると1つのファイルの記述量が膨大になってしまい、作業効率の低下に繋がります。
また、ファイルが1つしか存在しない状態では複数人での作業時にバッティングを起こしやすくなる危険もあります。
よって、ファイル管理のしやすさと複数人での作業がしやすさを考慮し、上記のようにファイルを分割します。
ID・Classの使い分け
アンカーリンクの対象となる要素を除き、原則としてClassのみを使用してコーディングしてください。
アンカーリンクの対象となる要素に関しても、通常通りにClassでスタイルを付与した後に、アンカーリンク用としてIDを付与して下さい。
理由
BEM+FLOCSSを前提としているため、レイアウト等も全てClassのみで表現できるようになり、結果としてIDを使用する必要性が低くなります。
よって、原則としてclassを使用し、機能として必要な部分にだけIDを使用することとします。
ID・Class名の付け方
- ID
- アンカーリンクに使用するので、対象となるコンテンツ名を英訳したIDを付与します。
- Class
- 原則としてBEM+FLOCSSのルールに従って命名して下さい。
子要素は「__」、バリエーションや兄弟要素は「--」で接続することとします。
セレクタの書き方
- セレクタにIDを使用しない
- 全称セレクタは使用しない
- 要素セレクタは必要性がなければ使用しない
- 抽象化したセレクタを先に記述し、個別のセレクタなどは抽象化したセレクタの後に記述する
- HTMLに出てくるコンテンツの順番とセレクタの順番を同じにする
解説
セレクタは書き方によってコーディングやメンテナンスに大きく影響を及ぼすため、よく考えて作成する必要があります。
ID・Class名の付け方のルールにもあるように、IDはスタイル指定には使用しません。
全称セレクタは意図しない要素に意図しないスタイルが適用されるのを防ぐため、使用しないでください。
要素セレクタは抽象化したセレクタでスタイル指定する場合は使用を許可します。
ただし、コンポーネント化したコーディングを前提とすると、hタグはマークアップの整合性が取れなくなってしまうので、セレクタでの使用はいかなる場合も許可しません。
また、意図しない上書きを防ぐため、セレクタの記述順はマークアップ上で出現する順序と揃えるようにしてください。
セレクタはカンマ区切りにすることで、複数個を並列で記述することができますが、改行せずに記述すると視認性・可読性が落ちるケースが多いので、適宜改行を入れて視認性・可読性を保つようにしてください。
ショートハンドの使い方
- スタイルが継承されているプロパティに使用しない
- 指定する値が一つのときは使用しない
解説
ショートハンドはコードを短くできるため素早くスタイルを記述できて便利な記述方法ですが、濫用すると同じ値を2重に指定してしまったり、省略したプロパティの初期値で上書きされてしまうことで意図しないスタイルが適用されてしまうなど、可読性や保守性に問題が発生します。
例えば、「共通スタイルのmarginを特定のコンテンツで変えたい。」というときにショートハンドを使う場合、変更しないプロパティには継承元と同じ値を指定する必要があります。
この状態では、共通スタイルのmarginを変更してもショートハンドを使用した要素には適用されず、共通スタイルを設定した意味がなくなってしまいます。
新テンプレートでコンポーネントコーディングになったので、この問題は以前にも増して顕在化しやすくなっています。
案件全体の効率にも関わるので、ショートハンドはよく考えて使ってください。
なお、継承の問題はinherit(継承元の値を継承することそ示す値)を使うことで解決できますが、コードが冗長になり複雑化するため、値を継承させるのであればショートハンドを使わない方が柔軟で簡潔なスタイルシートになります。
/* 推奨されないショートハンドの使い方 */ .style { margin: 30px 10px 10px; } .style.style--overwrite { margin: 40px 10px 10px; } /* 推奨されるショートハンドの使い方 */ .style { margin: 30px 10px 10px; } .style.style--overwrite { margin-top: 40px; }
プロパティの順序
- box-sizing
- margin、padding
- width、min-width、max-width
- height、min-height、max-height
- background、background-color、background-image、background-repoeat、background-position、background-size
- border、border-width、border-style、border-color、border-radius
- outline、outline-width、outline-style、outline-color
- table-layout、border-collapse、border-spacing、empty-cells、caption-side
- box-shadow
- list-style、list-style-type、list-style-image、list-style-position
- overflow
- opacity、visibility
- display、box-flex
- float、clear
- position、top、right、bottom、left、z-index
- color
- font-size、font-weight、font-style、line-height、letter-spacing
- text-align、text-decoration、text-shadow
- vertical-align
- content
- zoom
- その他
ベンダープレフィックスの順序
- -webkit-
- -moz-
- -ms-
- -o-
- ベンダープレフィックスなし
※案件ごとの対応ブラウザに合わせて1~4は削除してください。
サンプル
.style { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; -o-box-sizing: border-box; box-sizing: border-box; } .style { display: -webkit-box; display: -moz-box; display: -ms-box; display: -o-box; display: box; }
解説
ベンダープレフィックスの順序には見た目以上の理由はありませんが、ベンダープレフィックスなしのプロパティは必ず最後に指定してください。
ベンダープレフィックス付きのプロパティはブラウザが独自に拡張したものや、勧告候補前のものを先行実装しているものですが、ベンダープレフィックスなしのプロパティは正式にサポートされたものです。
よって、正式にサポートされたプロパティが有効ならそちらが適用されるように、ベンダープレフィックスなしのプロパティは最後に指定します。
調整用Classについて
調整用Classとは、.mb0 { margin-bottom: 0; }
や.taCenter { text-align: center; }
のような、単一のプロパティを持つ汎用的なClassのことで、このようなClassの使用は極力避けるべきです。
よくあるのが同じ種類のタグが連続するコンテンツの最後の要素に対して下マージンを消すために.mb0と指定している場合です。
この場合はコンテンツの最後なので.lastChildというクラスを付けた方が適切ですし、Classさえついていれば複数のプロパティを指定でき、他の箇所でも使用できるため汎用性があります。
調整用Classの使用が許容されるケースとしては、表の中でセル別にテキスト位置を指定したいときや、フォーム要素の幅で例外を指定したいときなど、限定的な状況です。
理想としてはこういった部分にもClassを付ける方が適切と考えられますが、Classの個数が多くなりがちで、それぞれに適切に命名していると時間がかかってしまううえに、Classを指定しても単一のプロパティしか指定しないことが多いので、微調整用クラスを使っている状態と大差がないため、許容範囲とします。
フォント周りの単位指定について
- font-size
- remで指定してください
- line-height
- 原則として単位なしで指定してください
解説
フォントサイズの指定方法や単位には様々なものがありますが、扱いが容易なremを使用します。
remはrootであるHTMLタグのフォントサイズを基準とした相対値指定なので、HTMLタグでfont-sizeを10pxに設定しておくと、14pxにしたければ1.4rem、26pxにしたければ2.6remというように、計算が非常に簡単で、親要素のフォントサイズに影響されないというメリットがあります。
line-heightは「行間を指定するプロパティ」と誤解されやすいですが、正確には「行の高さ」を指定するプロパティです。
つまり、「行と行の間の余白の値」を直接指定しているわけではなく「(フォントも含めた)行の高さ」を指定することで、間接的に行間の余白が決定されているということになります。
line-heightはpxなどの絶対値と、%・em・単位なしなどの相対値を取ることができ、値は子孫要素に継承されます。
line-heightを絶対値で指定している時、その値よりもfont-sizeの値が大きくなった場合に行が重なるという問題が発生します。
この問題は値が継承されることにより、意図しない箇所で発生することが多いです。
line-heightを相対値で指定していれば、font-sizeにline-heightの値が掛け合わされた値となり、font-sizeがどんな値でもそれに応じた行の高さになるので、この問題を回避することができます。
また、相対値指定では単位に違いはありますが、フォントサイズに対して値を掛け合わせるという点では同じなので、一番シンプルに書ける単位なしを標準とします。
絶対値で指定している場合でも、line-heightを指定し直すことで行の重なりを解消することはできますが、複数の要素に対して絶対値で上書きし直すよりも、必要な場合以外は上書きする必要がないように原則として相対値で指定するものとします
下図は単位を指定した場合(上)と単位を指定しない場合(下)のサンプルです。
絶対値指定したline-heightが継承されると、この様に行が重なってしまうケースがあります。
JavaScript
- HTMLとCSSで対応できないものにのみ使用してください
- 何をしているものかコメントを付けてください
- 対応する全てのブラウザ、端末で動作チェックを行ってください
- 見ただけでは分からないようなエラーがでていないか各ブラウザのデベロッパーツールのコンソールで確認してください
- 外部JavaScriptファイルの読み込みは、原則として
</body>
の直前で行ってください </body>
の直前での読み込みだと動作に問題がある場合は<head>...</head>
内で読み込んでください- 全て、もしくはほとんどのページで使用するものはcommon.jsにまとめてください
解説
JavaScriptは便利ですが、些細な処理でもブラウザにとっては負荷になってしまいます。
よって、HTMLとCSSで対応できることまでJavaScriptを使ってしまうと、多少なりともパフォーマンスは落ちてしまうので、安易に使用するべきではありません。
また、JavaScriptを使用すると、スクリプトの動作チェックも必要となるうえ、使用している言語が増えるのでコード理解に時間がかかることに繋がります。
そのため、本当に必要な箇所でのみJavaScriptを使用し、使用する際は何のためのJavaScriptかコメントを記述してください。
JavaScriptファイルの読み込みは<head>...</head>
内に記述してしまうと、ブラウザによっては該当のファイルの読み込みが完了するまで他のファイルの読み込みをブロックするものがあるため、</body>
の直前とします。
しかし、中にはHTMLや画像の読み込みが終わる前に実行しておく必要のあるものがあります。
そのスクリプトがどのタイミングで実行されるべきかをよく考えて読み込み・実行の記述位置を判断してください。
画像スライス
JPEG・PNG・GIFの使い分け
- JPEG
- 写真などのフルカラーの画像や、グラデーションがかかっている等、色数が多い画像に使用してください。
- PNG-32(24)
- 透過色がある画像に使用してください。
ファイルサイズが肥大化しがちなので、極力使わずに済むようにスライスを工夫してください。 - PNG-8
- 256色に収まるイラスト・ボタン・アイコンなどに使用してください。
- GIF
- GIFアニメーションにのみ使用してください。
解説
JPEGはフルカラー対応で、画質を調整することでファイルサイズを抑えることができるため、透過色がなく色数が多い写真やグラデーションに向いています。
PNG-32(24)はフルカラーには対応していますが、画質の調整ができないためJPEGよりファイルサイズが肥大化する傾向にあります。
しかし、複数の透過色を設定できるため、背景を透かして見せるような画像に向いています。
PNG-8とGIFは似た特徴を持っていますが、PNG-8のほうがファイルサイズの削減が容易なことと、画像のアニメーションはクロスブラウザの観点からGIFが最適なことを踏まえ、イラスト・アイコン等はPNG-8、アニメーションはGIFを使うこととします。
また、使い分けることで、拡張子から画像の役割を推測しやすくなります。
Fireworks・Photoshop(Illustrator)での書き出し設定
Fireworks
JPEGの設定
PNGの設定
GIFの設定
Photoshop(Illustrator)
JPEGの設定
PNGの設定
GIFの設定
スマートフォン対応
Viewportの設定
テンプレートで使用している以下の設定を標準としますが、案件の仕様によっては変更して使用してください。
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
- width
- Viewportの横幅を指定する
初期値は960pxで200px~10000pxまで指定できる
device-widthを指定するとデバイスの幅をwidthとして使用する - initial-scale
- 表示倍率の初期値
初期値は1 - minimum-scale
- 最小表示倍率
初期値は0.25で0より大きく10未満の値が指定できる - maximum-scale
- 最大表示倍率
初期値は1.6で0より大きく10未満の値が指定できる - user-scalable
- ユーザーのズーム操作の許可
初期値はyesでyes/no、もしくは1/0で指定できる
Ratina(高解像度)ディスプレイへの対応方法
スマートフォン対応が必要なデザインデータは640pxのサイズで作られています。
通常のPCコーディングとはスライスと画像の指定の方法が異なるので、以下の項目を参考に対応してください。
- 画像は偶数サイズで切り出す
デザイン上で奇数の場合は余白を含めてもよいが、余白を含めることができないデザインの場合はデザイナーに調整を依頼する - imgタグのwidth属性とheight属性は画像の実サイズの半分の値を指定する
- 背景に指定する場合もbackgrond-sizeで実サイズの半分の値を指定する
解説
320pxの画像をRetinaディスプレイで表示すると、コーディング上の1pxを画面上では2px×2pxの4px分で表現するため、2倍に引き伸ばされてぼやけたような表示になります。
詳しい説明はガイドラインの意義から逸れるため省略しますが、デザインデータの時点で幅640pxのスケールで画像を用意し、幅320pxのスケールに縮小して配置することでこの問題を解決する事ができます。
上記の対応をしようとすると、画像サイズは偶数にしなければ半分にしたときに割り切れなくなります。
小数点を持つ値の扱い(切り上げ・切り捨て・四捨五入)はブラウザによって異なるので、縦横比が変わってしまう等の理由で滲みや崩れの原因になるケースがあります。
デザインデータのサイズに関しては、以前はモバイル端末でもDPR(device pixel ratio)が1~2程度だったので、上記の対応で問題なかったのですが、現在の主要なモバイル端末ではDPRが1のものは無く、殆どが2以上、更に約半数程が3以上のDPRを持っていることを考慮すると、現在の高解像度ディスプレイへの対応には、現状の640pxではサイズ不足と判断できるので、検討の必要があると思われます。
レスポンシブ・ウェブ・デザイン対応
コーディングする順番
CSS3が浸透するまではレイアウトの自由度が低いSPからコーディングするべきとされていましたが、現状(2018/05現在)ではほとんどのブラウザでCSS3が使用できるようになっているため、PCとSPのどちらからコーディングするかは大きな問題ではなくなりました。
ただし、本当に自由にコーディングしてしまうと、PC版が基準になっている箇所とSP版が基準になっている箇所が混在してしまうことも考えられるため、案件ごとに基準になるデバイスをきちんと設定することが重要です。
レスポンシブコーディングに慣れていない場合、SP版からコーディングしたほうが効率よく対応できるケースが多いので、SP版のデザインが存在している案件ではSP版からコーディングすることを推奨します。
ブレイクポイントの目安・書き方
昨今のブレイクポイントの設定は非常に複雑です。
以前は端末種別毎の境界がぼんやりと存在していたので、スマートフォンとタブレットの境界は736px程度、タブレットとPCの境界は1000px程度と目安を定めることができました
しかし、現在(2018/05)は様々なデバイスが存在しているので、解像度も様々です。
特にモバイル端末では、タブレット並みの解像度を持つスマートフォンやスマートフォン並にコンパクトなタブレットなども存在するので、端末種別毎といったシンプルなブレイクポイントの設定ができなくなってきています。
端末種別に惑わされず、「どの解像度範囲のときにどのデザインを再現させるか」をクライアント、もしくはデザイナー・ディレクターと相談し、案件ごとのブレイクポイントを適切に設定してください。
ブレイクポイントの再設定によるスタイルの再調整には、想像している以上の時間が必要になります。
本来必要のない作業に多くの時間を費やすことになってしまうので、ブレイクポイントの設定は作業前に必ず確認しておきましょう。
ブレイクポイントとして設定されうると考えられる値を以下に挙げるので、設定の際の参考にしてください。
- 768px
- 比較的新しい端末であればSP/TBの境目になるので、ほぼすべてのスマートフォンをカバーできる値
ただし、例外としてiPhone Xの横持ちで画面をフルに使う設定だと範囲外になる
また、小さめのタブレットの縦持ちはこの範囲に含まれてしまう - 812px
- iPhone Xの横持ちで画面をフルに使う設定もカバーする値
ただし、ほとんどのタブレットの縦持ちまではカバーしているが、横持ちは範囲外になる - 1280px
- ほぼ全てのスマートフォンとタブレットをカバーできる値
ただし、12.9インチ版のiPad Proが例外になる - 1366px
- 12.9インチ版のiPad Proを横持ちまでカバーできる値
現在(2108/05)調査した限りでは例外なくスマートフォンとタブレットをカバーできる
メディアクエリを記述する箇所
旧テンプレートと新テンプレートでルールが異なるので、混在しないように注意してください。
旧テンプレート
基準となるスタイルを記述し終えてからブレイクポイント毎に調整用のスタイルをまとめて記述します
- メリット
- 要素毎に調整を行うよりもデバイス毎のスタイルがわかりやすくなります
- デメリット
- 記述量が多くなると、同一のセレクタに対してどのような調整を加えているのかが確認しにくくなります
また、セレクタの記述ミスのリスクがあります
/* 基準となるPC用のスタイル */ @media only screen and (min-width: 768px and max-width: 1280px) { /* ※ブレイクポイントを複数設定する場合 */ /* タブレット用に調整するためのスタイル */ } @media only screen and (max-width: 767px) { /* スマートフォン用に調整するためのスタイル */ }
新テンプレート
セレクタ毎に調整用のスタイルを記述していきます
- メリット
- 同一セレクタに対する調整が把握しやすくなります
また、セレクタの記述ミスの心配がありません - デメリット
- デバイス毎にどのような調整がされているかわかりにくくなります
/* _mixin.scss */ //============================================ // breakpoint //============================================ @mixin sp { @media screen and (max-width: 767px) { @content; } } /* _hogehoge.scss */ .hogehoge { @include sp{ hugahuga: hagehage; } }
要素の表示・非表示の仕方
原則としてデバイス毎に要素自体を出し分ける設計はコードの視認性・保守性の観点から、極力使用しないほうがよいと思います。
しかし、デザインの都合でやむを得ず出し分けが必要になるケースも多いです。
その場合はメディアクエリを使用し、表示幅が一定の範囲でのみ「display: block;」となり、それ以外の幅では「display: none;」とすることで要素の出し分けを実装します。
標準のコーディングテンプレートでは「.pc-only」と「.sp-only」が用意されているので、新規で作成せずにこれらのクラスを使用してください。
displayの値を変更している要素に対してこれらのクラスを付与すると、プロパティが競合して意図しない表示になるので注意してください。
画像の切り替え方
- Media Queryによる切り替え
- 要素の出し分けと同様に、専用のクラスを付与して出し分けを行います。
- picture・srcsetによる切り替え
- HTML5で追加された新要素で表示を切り替えることも可能です。
ブラウザのスクリーン要件(幅・高さ・ピクセル密度等)で判別し、それぞれの要件で異なる画像を読み込ませることができます。
レンダリング時に処理される為、表示しない画像は読み込まれず、処理速度・表示速度の向上も期待できます。
ただし、現状(2018/05)ではIE(11)で対応しておらず、LazyLoadとの相性もよくない(srcset属性に対応していない)ようなので、案件で使用できる方法ではありません。
フルードイメージの作り方
フルードイメージは画像のサイズをブラウザのウィンドウサイズに合わせて表示する方法です。
フルードイメージにする場合にはimgタグのwidth属性とheight属性は必要ではなくなり、CSSで画像サイズを調整します。
/* html */ <img src="img/sample.png" alt=""> /* css */ img { max-width: 100%; height: auto; }
表の作り方
レスポンシブコーディングの場合、PCデザインでtableのようなデザイン、SPデザインでは1カラムのデザインというように、PCとSPでレイアウトが異なるケースがほとんどです。
tableタグは表組みを表すものであり、レイアウトの調整に使用するべきものではないことと、より柔軟なコーディングにするため、tableタグを使用せずにコーディングするべきです。
マークアップではdlタグを使用し、CSSの「display: table | table-row | table-cell」でPC版のみtableのレイアウトになるように調整することで、tableタグを使用せずにtableのレイアウトを再現できます。
フォーム
Name値の設定
- Name値は項目名を端的に表すユニークなものにしてください。
- ユニークにできない項目は連番を付けてください。
- ○○の住所、××の住所といった項目名の場合はName値にプレフィックスを付けてください。
解説
Name値はバックエンド側でPostされた内容を受け取り出力するときに使用する値になります。
そのため、Name値から項目名が推測できるとフォームプログラムを組み込む作業が非常にやりやすくなります。
またHTMLを見たときにID・Class名と見間違えないようキャメルケースではなくスネークケースで差別化します。
Labelタグの使い方
- テキストボックスやセレクトボックスでは項目名に使用し、対象となるフォーム要素に付与したIDをfor属性で指定してください。
- チェックボックスやラジオボタンの場合は、項目名ではなくそれぞれのラベルテキストとinput要素をlabelタグで囲ってください。
解説
Labelタグはユーザビリティの向上に大きく貢献します。チェックボックスやラジオボタンが特に顕著ですが、これら2つは標準では10px程度の大きさなため、クリック対象が小さく、ユーザーにとってストレスとなります。
しかし、labelタグとinput要素を紐付けることで、テキスト部分をクリックしても選択することができるようになり、ストレスを緩和できます。
送信ボタンの作り方
- inputタグを使用しないこと。
- buttonタグを使用し、type属性をsubmitとすること。
解説
inputタグを使用するとbefore/after擬似要素が使用できないため、アイコンなどの装飾を付けにくいという問題があります。
それに対してbuttonタグは閉じタグがあるため、before/after擬似要素が使用できます。
また、type・name・value属性も使用できますのでフォームの機能としてinputタグで行っていたものはbuttonタグで代替可能です。
フォーム要素に入力されたテキストのフォントサイズと余白について
デザインでの指定がない場合は以下のルールで体裁を整えてください。
※常識的な内容ではありますが、デザインで表現されないことも多く、見落としがちな部分なのでガイドラインとして組み込みます。
- フォントサイズは統一すること。
- 入力されたテキストと入力フィールドの枠が密接しないように数px(2~5px)の余白を空けること
レイアウトの組み方
tableのようなレイアウトでもtableタグは使用しない
解説
「レスポンシブ・ウェブ・デザイン対応」の「表の作り方」でも述べているように、tableのレイアウトは表示幅が変わると1カラムになるケースが多く、フォームはその代表格のようなものです。
フォームは要素の出し分けをすると、フォームシステム自体に手を加えなければいけなくなるケースも多いので、1ソースでレスポンシブ対応できるようにコーディングしましょう。
PHPインクルードを利用したコーディング
外部ファイル化する箇所
ヘッダー・フッター・サイドバーなど大量のページで同じデザインを使う部位は外部ファイル化してください。
外部ファイルの読み込み方
$_SERVER['DOCUMENT_ROOT']
を使用して絶対パスでrequire_once
で読み込んでください。
<?php require_once($_SERVER['DOCUMENT_ROOT'].'/assets/include/header.php'); ?>
外部ファイルを置くディレクトリ
- サイト全体で使用するもの
- /assets/include/
- 特定ディレクトリ以下で使用するもの
- /assets/include/ディレクトリ名/
CSS Sprite
画像のまとめ方
スプライト画像は手動で作成しようとすると非常に手間がかかるため、ジェネレータ等を利用して画像を作成して下さい。
画像を配置するフォルダ
CSS Spriteは複数のページで使われるもののため、/img/common/sprite/
など、共通画像を格納するディレクトリにスプライト用のディレクトリを作成して配置してください。
WordPress
WordPress本体のバージョンおよび各プラグインのバージョン
特に指定がない限り、WordPress本体および各プラグインは最新の安定版を使用します。
インストールディレクトリ
特に指定がない限り、標準のインストールディレクトリはドキュメントルート直下の「wp」とします。
データベーステーブルの接頭辞
デフォルトでは「wp_」となっていますが、このままだと同じ接頭辞の設定で別のWPをインストールした場合、DBが上書きされてしまう可能性があります。
そのため、案件名やドメイン名など、ユニークなものを設定します。
インストール時点でWPが1つしか入らないことになっていたとしても、後に追加される可能性は充分に考えられます。
よって、この設定は必ず守るようにしてください。
テーマの命名規則
案件名やドメインなど、ユニークなものを使用して下さい。
インストール必須のプラグイン
- WP Multibyte Patch
- WPで日本語などのマルチバイト文字を正しく扱えるようにするためのプラグインです。
WP本体に同梱されているので、必ず有効化してください。
投稿データの取得について
原則として「WP_Query」を使用してループを設定します。
投稿データを取得する方法として、他に「query_posts」や「pre_get_posts」などがありますが、これらはメインクエリを変更してしまうため、意図しない動作につながりやすいです。。
比較的安全で汎用性の高い方法として「WP_Query」の使用を推奨します。
.htaccessについて
- .htaccessのパーミッションについて
-
WordPressではパーマリンクの設定を変更したときなど、一定のタイミングで.htaccessの「# BEGIN WordPress」から「# END WordPress」までがWPによって上書きされてしまいます。
これにより、正常に表示できなくなってしまうことがあるので、パーマリンクの設定が完了した後は.htaccessのパーミッションを「444(読み込みのみ可能)」などに変更し、意図しない書き換えを防ぎます。
ディレクトリのパーミッションについて
- ファイルのアップロードフォルダ
- 標準ではファイルのアップロードフォルダは「/wp/wp-content/uploads/」になりますが、ファイルをアップロードするためにはパーミッションの変更が必要なため、このフォルダのパーミッションを「777(読み込み・書き込み・実行可能)」に設定します。
表示速度の改善
表示速度の改善を求められた場合には、まず次のことを行ってください。
ファイルデータサイズの削減
画像
- JPEG・GIF
- compressor.ioを使用してください。
圧縮方法をLossyとLosslessから選択できますが、Lossyを選択してください。 - PNG
- PNGGauntletを使用してください。
設定を変更する必要はありません。 - GIFアニメーション
- GIF animation online optimizationを使用してください。
圧縮方法はLossy GIF level 30 (slight)を標準とし内容に合わせて変更してください。
理由
JPEGの圧縮に関してはいくつかのWebサービスとソフトウェアがありますが、Webサービスでは有料かつ圧縮率もcompressor.ioに及ばないものが多く、ソフトウェアも圧縮率の面でWebサービスと同様なため、圧縮率・ユーザビリティなどを考慮し現時点ではcompressor.ioが最適と判断しています。
PNGもcompressor.ioで圧縮できますが、複数のファイルを同時に圧縮できることと圧縮率の差がさほどないためPNGGauntletを使用することとしています。
GIFアニメーションもcompressor.ioで圧縮できますが、圧縮率が高い分画質の劣化が激しく一目でわかるレベルのため、圧縮率をいくつかの段階で設定できるGIF animation online optimizationを使用することとしています。
JavaScript
JavaScriptはClosure Compilerを使用して軽量化(ミニファイ)を行います。
方法がWhitespace Only・Simple・Advancedと3つありますが、Simpleを選択してください。
軽量化(ミニファイ)したコードは不可逆圧縮のため、ファイル名に「min」を付けて新規保存(例:slider.min.js)し、動作チェックを必ず行ってください。
解説
Closure CompilerではAdvancedは最大の成果が見込めますが、呼び出されていない関数を削除するなど、コードを大きく改変してしまいます。
そのコードでは呼び出されていないかもしれませんが、他のコードから呼び出されている場合に、動作エラーが起るケースが想定されます。
そのため、Advancedを使用するためにはいくつかのコーディングルールを守る必要があります。
Webアプリなど大量のJavaScriptコードがある場合には考慮してもいいものではありますが、一般的なWebサイトではそこまでして最適化しても得られる効果は薄く、必要工数が上がるうえにバグが起きる可能性も高まるといったデメリットの方が高いためSimpleでの最適化を標準とします。
レンダリング速度の改善
- CSSファイルを優先して読み込んでください。
- JavaScriptファイルは
</body>
の直前に読み込むか、非同期で読み込んでください。 - imgタグにはwidthとheightを指定してください。
- CSS SpriteやCSS・JavaScriptファイルの結合を行い、HTTPリクエストを削減してください。
- 別ドメインへのHTTPリクエスト(DNSルックアップ)を削減してください。
メールアドレスのリンク設定
SPAM対策のために、下記のサイトのような暗号化メールアドレスの簡単生成サービスを使用して暗号化してください。
ただし、リンクテキストの内容により対応が変わってくるので確認のうえ対応してください。
リンクテキスト内容ごとの対応の変更
リンクテキストごとに対応可能な方法と不可能なものがあります。
下記を参考に対応してください。
- 1.リンクテキストが画像、もしくはメールアドレスでないテキスト
- メールアドレスが画像、もしくは「お問い合わせはこちら」のような内容のリンクテキストの場合は、
http://mailrobo.7jp.net/mrobo4.htmlやhttp://www.luft.co.jp/cgi/coding.phpの「安全性:高」のようにJavaScriptを使用し対応してください。 - 2.リンクテキストがメールアドレスの場合
- メールアドレスがリンクテキストの場合は、
http://www.luft.co.jp/cgi/coding.phpの「安全性:中」を使用して下さい。 - 3.JavaScriptで対応が難しい場合
- Wordpressに組み込みで対応が難しい場合などは、
http://www.luft.co.jp/cgi/coding.phpの「安全性:低」などを使用しエンティティ化で対応してください。
解説
メールアドレスをそのまま記載してしまうと、プログラムによって収集できてしまうため、SPAMなどの対象になってしまいますので暗号化して記載します。
SEO
h1のマークアップについて
h1は「ページの大見出し」という意味合いになるため、基本的にはページ名に当たる文言をh1としてマークアップします。
昔はサイト名(ロゴ)をh1でマークアップしたり、ロゴ上部にSEO目的でキーワードを含めた文言を設置しh1でマークアップする手法が流行りましたが、現在では、SEOのためにh1にキーワードを詰め込むより、本来のタグの意味に従って、ページの大見出しである文言をマークアップすることが効果的です。
リダイレクト
ここではリダイレクトを行うにあたって、SEOの観点でダイレクトの種類と特性を説明し、それぞれの使いどきを示します。
301リダイレクト(恒久的な移転の際に使用)
301リダイレクトは、単にユーザーを誘導するだけではなく、リダイレクト元のリンク評価をリダイレクト先へ引き継ぎます。
(完全に引き継ぐのではなく80%ほど引き継がれると言われています。)
また、リダイレクト元のページは検索エンジンにインデックスされなくなります。
URL変更の際やページ統合の際などに利用します。
302リダイレクト(一次的な移転の際に使用)
ユーザーへの挙動は301リダイレクトと変わりありませんが、検索エンジンに対する挙動は異なります。
一時的な移転を意味するため、ページの評価は受け継ぎません。
なお、リダイレクト元のページはインデックスされ続けます。
サイトメンテンナス時にメンテナンスページを表示させておく際などに利用します。
URLの正規化
同一、もしくはほとんど同じ内容のコンテンツが複数存在すると、検索エンジンはいずれか1つを優先し検索結果に表示させます。
意図しないページが優先されることを防ぐため、先するURLを検索エンジンに示す「正規化」を行う必要があります。
wwwの有り無し、index.htmlの有り無し
- http://www.example.com/
- http://example.com/
- http://www.example.com/index.html
- http://example.com/index.html
上記4つのアドレスは、すべて同じページが表示されますが、検索エンジンには、内容が同一の4つのページとして捉えられます。
これらは.htaccessで1つのアドレスにリダイレクトをさせることで対策します。
canonicalタグ
どうしても内容がほとんど同じ内容のページが存在してしまう場合は下記のcanonicalタグを使用して正規化します。
<link rel="canonical" href="優先させる(正規化する)URL">例として下記のような場合が想定されます。
- ECサイトにて、色違いの商品ページで画像だけが違うページが複数存在する場合
- ABテストで一部のボタンや文言のみが違うページが存在する場合
ページネーションの指定(rel="prev",rel="next")
一連したコンテンツを複数ページにまたがって掲載している場合(ページャーを設置しているページなど)、下記のタグで検索エンジンに「前のページ」「次のページ」を示すことができます。
<link rel="prev" href="前のページのURL">
<link rel="next" href="次のページのURL">
ただし、全件表示するページが存在する場合はrel="prev",rel="next"の指定は行わず、各ページにcanonicalタグを設置し、全件表示ページを指定します。
これには、ユーザーはページ遷移を嫌い、全件表示されたページを好むためページ分割されたページよりも、全件表示されたページを優先させるという意図があります。
※rel="prev",rel="next"を使用すると、個別のページが表示される可能性があるため、使用せずにcanonicalタグのみ使用します。
参考:http://googlewebmastercentral-ja.blogspot.jp/2011/12/relnext-relprev.html
構造化データ
構造化データに対応した記述を行うことで、検索結果画面にリッチスニペットやリッチカードを表示する事ができるようになります。
検索順位に直接影響するものではありませんが、検索結果ページでのクリック率の増加が期待できます。
Googleではパンくずリストやレビュー、商品データといったリッチスニペットに対応しています。
また、構造化データはJSON-LDで記述することとします。
解説
構造化データの記述の方法として、Microdata・RDFa・JSON-LDなどがあります。
MicrodataとRDFaは構造化データとしての情報を該当箇所に属性として直接マークアップしていきます。
しかし、これだとデータの記述箇所が分散し、管理しづらくなってしまいます。
JSON-LDであれば、構造化データの記述を1箇所にまとめることができるので、比較的管理しやすくなります。
よって、構造化データの記述はJSON-LDで記述することとします。
リッチスニペットのチェック
リッチスニペットのマークアップ後は下記ツールでチェックを行います。
▼構造化データテストツール
http://www.google.com/webmasters/tools/richsnippets
表示速度の高速化
ページの表示速度が検索順位を決定する要因の一つであることをGoogleは2012年に公表しています。
ページ速度による要因は、体感できるほどの遅さでない限り、それほど大きなものではありませんが、SEOに限らずユーザー目線で考えた際にも対策が必要な点ですのでパフォーマンス向上のためにファイルデータサイズの削減や読み込み速度の改善などを行います。
詳しくは「パフォーマンス向上(表示速度・実行速度)について」の項目を参照してください。
Sublime Text
標準エディタはSublime Textとしますが、必要に応じて他のエディタを使用しても構いません。
以降、使用エディタはSublime Textを前提として解説します。
推奨フォント
コーディングに使用するフォントは可読性の観点からプログラミング用フォントを推奨します。
フォントの設定は Preferences -> Settings - User から行うことができます。
プログラミング用フォントの例としては「Source Code Pro」などがあります。
インストール推奨のパッケージ
HTML5 | HTML5の自動補完 HTML5のスニペット集と自動補完とハイライト |
---|---|
CSS Snippets | CSSの自動補完 |
Sass | Sassの自動補完 |
SCSS | SCSSの自動補完 |
Compass | Compassの自動補完 |
jQuery | jQueryの自動補完 |
Emmet | HTML,CSSの記述を高速化するEmmetを使用可能にする |
Hayaku | CSSの記述を高速化するHayakuを使用可能にする |
Bracket Highlighter | 開始、終了タグを強調表示する |
Tag | 閉じタグの自動補完 |
AutoFileName | imgタグのファイル名を補完 |
ConvertToUTF8 | Shift-JSのファイルの文字化けを防ぐ |
Inc-Dec-Value | 数字やカラーコードをキー操作で増減できる |
EditorConfig | コーディングスタイルを統一する |