Git Product home page Git Product logo

styleguide's Introduction

30歳のときに「CSS設計が世界中で議論されていること」に興味を持ち、「自分もこのような仕事をしたい」とウェブ業界に転職。 上場企業を含む36社(2023年時点)のお客さま(ANAさま、京セラさま、Panasonicさまなど)とお仕事をさせていただいています。 案件実績はForkwellに記載しています。

CSS設計、スタイルガイド制作、アクセシブルなコーディングが得意です。多言語サイトやJamstackサイト、React(TypeScript)を使用したウェブアプリも担当してきました。 TAMのグループ会社であるTAMSANのエンジニアチーム(本人を含めて5人)のリーダーを担当しており、メンバーとの1on1やキャリアMTG、採用活動、会社全体のマネジメントにも参画しています。

モノゴトを深く知り、整理していくプロセスが好きです。 最新技術を追うというよりも、「問う技術」「プロセス設計」「ナレッジマネジメント」「ファシリテーション」「コーチング」のようなソフトスキルを意識しているタイプでもあります。 エンジニアの3分類だと、技術:プロダクト:組織=2:3:5のイメージです。 エンジニアを分類する、3つのタイプ|山本 正喜 / Chatwork CEO

iPhoneやMacを中心にしたブログを過去に書いていて、月間10万PVを達成したこともあります。 テキストベースのアウトプットは日常的にしているので、書くことは苦にならないタイプです。

SNSやブログなどはbento.meにまとめています。ぜひクリックしてください!

Reactなどを使ったウェブアプリケーションの経験値を増やしたいです。 コードを書く仕事は大変なこともありますが、カタチのあるものに収束させていくプロセスに面白みを感じるからです。 メンタルヘルステックにも興味があり、バックエンドやインフラを含めた包括的な知識や技術を身につけることで、サービス開発をチームでするための役割を果たせるようになることが中期的な目標と考えています(現在はフロントエンド領域のみ)。

本当の意味で相手の役に立てる人でありたいです。 コーチング的な支援は得意なほうだと思っていますが、背中を押したり、手を引っ張れるような積極的な支援で、その人の強みや良さを引き出せる仕事をしたいです。

Find out more!

styleguide's People

Contributors

manabuyasuda avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

styleguide's Issues

[SVG] SVG書き出し時の注意点

Illustratorを使った場合の書き出しに関する注意点をまとめています。レイアウト崩れの原因を取り除いたり、不要なコードを最低限にします。一部の設定は変更してもかまいません。

  1. [別名で保存]をクリック(Macの場合はcommand + shift + S)
  2. [ファイル形式]は[SVG(.svg)]を選択
  3. [詳細オプション]をクリックしてオプションを開く
  4. 以下のリストを参考にオプションを指定する
  • [SVG プロファイル]はSVG1.1(最新版を指定)
  • [フォント]の[文字]は[SVG]、[サブセット]は[なし(システムフォントを使用)]
  • [Illustrator の編集機能を保持]をチェックしない(サイズ削減のため)
  • [CSS プロパティ]はスタイル要素を指定する(サイズ削減のため)
  • [未使用グラフィックスタイルを含める]をチェックしない(サイズ削減のため)
  • [小数点以下の桁数]を1もしくは2にする(サイズ削減のため)
  • [エンコーディング]は[UTF-8]
  • [<tspan> エレメントの出力を制御]をチェックにする(サイズ削減のため)
  • [パス上テキストに エレメントを使用]をチェックにする(サイズ削減のため)
  • [レスポンシブ]のチェックを外す(widthheight属性がないとIEとAndroidで表示がおかしくなる)
  • [スライスデータを含める]をチェックしない(サイズ削減のため)
  • [XMP を含める]をチェックしない(サイズ削減のため)
  • svgzでminifyしない(再編修正を考えて)

インラインSVGで使う場合はパスをコピーして、テキストエディタにペーストすることもできます。

Illustrator CCを使っている場合は画像アセットとして書き出すことができます。

[SVG] SVGをimg要素で表示させる

pngで表示していたような画像の代わりとしてSVGを使うのがいちばん手軽な方法です。通常の画像と同じように<img>要素で指定します。

<img src="image.svg" alt="">

使用するSVGファイル内にはviewBox属性、width属性とheight属性を必ず指定します(IEとAndroid対応)。

SVGファイル内でwidthheight属性が指定されていない場合にIEとAndroidでアスペクト比がおかしくなることがあります。widthheight属性を指定し直します。

preserveAspectRatio="none"をSVGファイルに指定して直す方法もあります。仕様上、viewBoxのアスペクト比とwidthheight属性でのアスペクト比が異なる場合、アスペクト比と維持しながらスケーリングし、**寄せで表示されます。preserveAspectRatio属性はこの挙動を変更するもので、noneと指定することでHTML側で指定したサイズでviewBoxがフィットするようになります。

フォールバック

フォールバックは処理が冗長になるので、IE8に対応するのであればSVGは使わないようにするのがベターです。

SVG非対応ブラウザ向けのフォールバックにはHTMLでの対応とJavaScriptでの対応の2パターンがあります。

HTML側で対応する場合は<img>要素ではなく、<object>要素を使います。<object>要素は下記のようにフォールバックを含めた記述ができます。

<object data="image.svg" type="image/svg+xml" width="100" height="100">
 <object data="fallback.png" type="image/png" width="100" height="100">
 </object>
</object>

JavaScript側で対応する場合は、SVG非対応ブラウザのときには.svgを.pngに置換します。

if(!window.SVGSVGElement){ //SVG非対応ブラウザの判別
  $('img[src*="svg"]').attr('src', function() {
    return $(this).attr('src').replace('.svg','.png'); //拡張子を置換
  });
}

フォールバック画像の作成はsvg2pngなどで自動的に生成することができます。

<a>要素を<object>要素でラップする場合、リンクがクリックできなくなります(<img>要素は問題ありません)。

<a href="#">
  <object data="image.svg" type="image/svg+xml" width="100" height="100">
   <object data="fallback.png" type="image/png" width="100" height="100">
   </object>
  </object>
</a>

CSSでは以下のように指定するとリンクをクリックできるようになります。

a {
  display: inline-block; /* もしくは`display:block;` */
}

object {
  pointer-events: none; /* IE10以下未対応 */
}

フルードイメージ

<img>要素と<object>要素をフルードイメージにする場合はCSSで以下のように指定します。

img[src$=".svg"],
object[src$=".svg"] {
  max-width: 100%;
  width: 100%; /* IE対応 */
  height: auto;
}

各HTML専用のCSSファイルの接頭辞を決める

ルートディレクトリにあるCSSにはすべてクラス名に接頭辞をつけている。
なので、各HTML専用のCSSファイルとクラス名が重複することはない。

でも、CSSフレームワークやjQueryプラグインのクラス名と重複する可能性が残っている。

すべてのクラス名に接頭辞をつけることでスコープを確実に管理する。

[SVG] SVG作成時に注意すること

SVGとして使うアイコンやロゴなどを_作るとき_に気をつけることをまとめています。

通常の画像と違いコード(XML)として書き出されるので、作り方によってIllustratorの指定を無視したり変換されることによって意図しないデザインとして出力されたり、ファイルサイズを増やしてしまう原因になります。

Illustratorの基本設定

Illustratorで作成する場合の基本的な設定です。一部は使いやすいように変更してもかまいません。

環境設定の初期設定。

  • [単位]はすべてピクセル
  • [一般]の[キー入力]は0.5px
  • [一般]の[プレビュー境界を使用]にチェックを入れる([整列]パネルからでも設定可能)
  • [テキスト]のトラッキングは10/1000em(letter-spacing:0.1;に相当)
  • [ガイド・グリッド]の[グリッド]を10px、[分割数]を2px

新規ドキュメントの初期設定。

  • [単位]はピクセル
  • [カラーモード]はRGB
  • [ラスタライズ効果]はスクリーン(72ppi)
  • [プレビューモード]はピクセル
  • [新規オブジェクトをピクセルグリッドに整合]のチェックを外す

アートボードの初期設定。

  • [ウィンドウ]メニューの[ワークスペース]を[Web]
  • [表示]メニューの[定規]の[定規を表示]のチェックを入れる(command + R)
  • [表示]メニューの[定規]の[アートボード定規に変更]のチェックを入れる(command + option + R)
  • [表示]メニューの[スマートガイド]のチェックを入れる(command + U)
  • [表示]メニューの[ピクセルプレビュー]のチェックを入れる(command + option + Y)
  • [アートボード]パネルの[アートボードオプション]の[X:]と[Y:]をそれぞれ0pxにする(viewBoxの起点を左上にするため)
  • [アピアランス]パネル(shift + F6)の[新規アートに基本アピアランスを適用]のチェックを外す
  • [線]パネルは[線を**に揃える]で作業をする(内側と外側に揃えると書き出し時に分割されるため)
  • [変形]パネルの[線幅と効果を拡大縮小]のチェックを外す

SVG作成時のルールと注意点

基本的なルール。

  • 単位はピクセルで、なるべく端数を出さない(端数の桁数はデザイナーと要相談)
  • アートボードの座標は0,0(左上)を起点にする
  • [オブジェクト][パス][単純化]でアンカーポイントの数を最低限にする
  • 非表示にしているレイヤーも書き出されてしまうため削除する(サイズ削減のため)
  • レイヤー名とグループ名、SVGフィルターは適切な単語(半角英数字)に変更する([レイヤー_1_]などと日本語で書き出されてしまう)

出力時に書き出されないこと。

  • アートボードの外にある要素は書き出されない

変換されて出力されること。

  • 文字データはアウトライン化する(アウトライン化をしないと<text>要素として書き出されるため、環境によって指定したフォントで表示されない場合がある)
  • [線]以外のアピアランスはうまく書き出されない
  • アピアランス、ブラシ、ブレンド、エンベロープは分割されてしまうため最低限にする(サイズ削減のため)
  • メッシュグラデーションと画像ブラシ、演算、レイヤー効果はラスタライズされてしまうため最低限にする(サイズ削減のため)
  • 同じ図形はシンボル登録してから配置する(<symbol>要素と<use>要素で自動的にモジュール化してくれる)
  • 1回しか使わないシンボル図形は[シンボルへのリンクの解除]をする(サイズ削減のため)
  • 変形や回転、拡大縮小などを最低限にする(transform属性として書き出されるため、その分ファイルサイズが増えてしまう)

[SVG] 対応ブラウザと注意点

サーバー設定

サーバーによってはMIMEタイプの設定が必要があります。

.htaccessに以下のように追加します。

AddType image/svg+xml .svg .svgz
AddEncoding gzip .svgz

[accessibility] 画像

  • 画像はあくまで補足として、画像がなくても文章だけで伝えられるようにすること
  • alt=""は必須とする(属性値は必ずしも必須ではない)
  • 情報を過不足なく伝えるためにalt="〜の写真"のように値を入れること
  • テキスト画像はその画像のテキスト情報をそのまま値に入れること
  • リンク付きの画像であっても、その画像の情報を伝えること(リンク先の情報ではない)
  • アイコンのように特定の意味を持たない、もしくは伝えることで冗長になったり意味が逆に伝わりづらくなってしまう場合は値を空にする
  • 画像が縮小されたときに情報が読み取れなくなることを避ける

情報は画像ではなく言葉で伝えるほうが確実。例えば言葉の意味は辞書に載っているが、画像の意味は受け取った側でバラツキがでる。伝わりやすい手段を選ぶことは、情報を伝える側も情報を受け取る側にとってもメリットのあること。

alt属性自体の省略が可能な場面もあるけれど、ごく稀であること、省略しなければならない理由もないので、基本的に属性自体の省略はしない。さらにスクリーンリーダーはaltが省略されていると、画像のソース(例えば/img/logo.svg)を読んでしまい必要のない無駄な情報を伝えてしまうことになる。

alt="〜の写真"などとしておくと、その人自体は見えなくても、他の人が説明をしてくれるかもしれない。そのためにはそこに写真があるといったことが伝わらなければいけない。100%伝えられなくても、過不足なく伝えることが大切。

リンク付きの画像の場合に、そのリンクをクリックするとどうなるのかといったaltの付け方を推奨するものがあるが、その場合も画像についての情報を伝えるものとする。視覚に障害があったとしても、Webを日常的に使っていることに違いはない。同じように慣れているだろうし、特別扱いをすることで逆に伝わりにくい状態になってしまう可能性がある。

[update] 見出しをProjectレイヤーに移動

趣旨変え。

BEM的に書けないという理由でUtilityレイヤーにしていたけど、見出しをすべて一緒のくくりにするから無理が出てくるわけで、.p-heading-h2.p-heading-h3のように別のBlockとして定義すれば問題ない。

[SVG] 便利なツール

Svgsus

  • Macの無料アプリ
  • カテゴリ分けをして管理できる
  • アイコンをコピーして、IllustratorやKeynoteなどにアイコンをペーストできる
  • アイコンをコピーして、テキストエディタにSVGコードをペーストできる(Jadeとして変換も可能)

svgo

  • npmパッケージ
  • Gulpなどやコマンドで実行ができる
  • SVGの最適化

SVGOMG

  • svgoのWebアプリ
  • ブラウザでSVGの最適化ができる

svgstore

  • npmパッケージ
  • SVGスプライト(svgstore)の自動化
  • <symbol>要素とid属性を自動的に紐付ける

[add] クラス名辞典の作成

補足

  • wrapper - 内包する
    • wrap - wrapperの略語
    • container - wrapperの類語、容器、入れ物
  • group - 集まり
  • area - 特定の場所、範囲
  • brand - ブランドの
  • site - サイトの
  • emphasis - 強調、重視
  • note - 注釈
  • description - 概要
    • desc - descriptionの略語
  • introduction - 前置き、導入
    • intro - introductionの略語
  • announce - お知らせ
  • information - 情報
    • info - informationの略語
  • success - 成功
  • alert - 注意、警戒
  • attention - 配慮、気配り
  • error - 間違い、失敗
  • caution - 用心、警告
  • warning - 警告、予告
  • danger - 危険、驚異
  • more - もっと多くの
  • detail - 詳細、細部

比較

  • main - 主要な
  • primary - 主要な
  • secondary - 補助的な
  • tertiary - 第三の
  • quaternary - 第四の
  • common - 共通の
  • global - 全体的な
  • local - 局所的な
  • general - 一般的な

UI

  • logo - 社名や製品名などを図案化・装飾化した文字・文字列
  • image - 画像
    • img - imageの略語
  • hero - キービジュアルになる大型の画像
  • link - アンカーリンク
  • icon - 対象の内容や機能などを小さな画像で表したもの
  • button - オン・オフの選択に使うインターフェイス
    • btn - buttonの略語
  • label - 分類する、項目名
  • tag - 符号、識別子
  • badge - 残数を示す数値
  • catch - 興味を惹く、関心をつかむ
  • breadcrumb - パンくずリスト、トップページから現在ページまでの階層構造を示したリンク
    • topicpath - breadcrumbの類語
  • copyright - 著作権表示
  • navigation - 情報へ誘導するリンク
    • nav - navigationの略語
  • sns - ソーシャルネットワーキングサービス
  • form - 送信フォーム
  • comment - 記事に対する反応
  • map - 地図
  • table - テーブル、図表
  • privacy - 個人情報の利用・保護の方針
  • sitemap - サイト内のページリスト
  • tab - 書類などのインデックスタブを模した、別のドキュメントに切り替えるインターフェイス
  • toggle - 同一の操作で二つの状態を交互に切り換えるインターフェイス
  • dropdown - 複数の項目を表示して、1つの項目を選択するインターフェイス
  • modal - (主に)注意や警告を知らせるために使用される何かしらの操作を要求するインターフェイス
  • carousel - 画像などのコンテンツを上下左右にスライドさせて切り替えるインターフェイス
    • slider - carouselの類語
  • accordion - 選択した項目以外のコンテンツを折りたたんで非表示にするインターフェイス
  • off-canvas - 表示領域外から画面をずらすようにスライドしながら表示するインターフェイス
  • tooltip - マウスオーバー時に補足情報を表示するインターフェイス
  • search - サイト内をキーワード検索するフォーム
  • pagination - 昇順にしたページ番号付きのナビゲーション
  • backtop - ページトップに戻るためのページ内リンク
  • banner - (主に宣伝用の)画像をともなうリンク
  • qanda - Q&A、よくある質問と回答
  • timeline - 年表

場所

  • section - 区分、区画
  • content - 文書の内容
  • article - 記事
  • post - 投稿
  • top - 頂上、上部
  • home- トップページ
  • sidebar - 補足記事

コンテンツ

  • about - 〜について
  • work - 仕事、任務
  • product - 製品
  • service - サービス
  • news - お知らせ、近況
  • event - 行事、出来事
  • history - 歴史、沿革
  • archive - 保存、保管、記録
  • concept - 構想、概念、考え
  • recommend - おすすめ、推奨
  • table of contents - 目次
    • toc - Table of contentsの略語
  • index - 索引、指標
  • contact - 問い合わせ、連絡
  • inquiry - 問い合わせ、質問、調査
  • access - 交通手段
  • shop - 店舗
  • related - 関連のある

レイアウトパターン

  • wrapper - 複数の要素を内包する
  • grid - グリッドレイアウト
  • block - 縦に積まれる
  • inline - 横一列に並ぶ
  • media - テキストと画像の横並び
  • flag - テキストと画像の横並び(垂直方向の指定可能)
  • box - 箱状の
  • card - (主に)画像を目立たせるカード型
  • tile - 繰り返しによって構成されるパターン

Element

  • inner - 内側の
  • outer - 外側の
  • body - 主要部分
  • head - 上部
  • foot - 下部
  • heading - 見出し、表題
  • title - 表題、題名
  • lead - 見出しの補足、記事の要約
  • list - 一覧、表
  • menu - 一覧、表
  • item - (表やデータなどの)項目
  • unit - 1つの単位、1セット
  • column - 縦列
    • col - columnの略語
  • text - 本文
  • caption - 画像・図表の補足文
  • thumbnail - 縮小した画像
    • thumb - thumbnailの略語
  • avatar - 人の顔を示す画像
  • feature - 特徴を補足する画像
  • tel - 電話番号
  • address - 住所
  • date - 日付
  • time - 日時
  • category - 分類、部類、
    • cat - categoryの略語
  • tag - 識別子
  • next - 次の
  • previous - 前の
    • prev - previousの略語
  • mask - 覆い隠す
  • overlay - かぶせる、上書きする

Modifier

  • tiny - とても小さい
  • small - 小さい
  • medium - 中間
  • large - 大きい
  • huge - とても大きい
  • reverse - 反転する
  • push - 前方に押す
  • pull - 自分の方に引く
  • offset - 相殺する、埋めあわせる
  • left- 左側の
  • center - 真ん中
  • right - 右側の
  • top - 上部
  • middle - 真ん中
  • bottom - 下部
  • round - 角丸
  • circle - 円形

状態

  • show - 見せる
  • hide - 隠す
  • open - 開く
  • close - 閉じる
  • current - 現在の
  • active - 活動中、有効な
  • disabled - 無効になっている

[SVG] 背景画像としてSVGを表示させる

通常の画像と同じくbackground-imageプロパティでSVGも表示させることができます。

.bg {
  background-image: url("image.svg");
}

フォールバックをする場合はフォールバック用のpng画像を先に指定します。

.bg {
  background-image: url("fallback.png");
  background-image: url("image.svg"), none;
}

使用するSVGファイル内にはviewBox属性、width属性とheight属性を必ず指定します(IEとAndroid対応)。

[SVG] インラインSVGで表示させる

HTML内に<svg>要素で記述するインラインSVGはSVGの機能のすべてを使うことができます。ただし、HTMLファイル内にSVGコードを貼る必要がありファイルサイズを増やしてしまうので、<img>要素やbackground-imageプロパティ、アイコンフォントで指定するのが適切でない場合に使うようにします。

不要なコードの削除

インラインSVGとして使う場合に不要なコードが書き出されます。随時削除(省略)するか、Gulpなどのツールで自動的に削除できるようにしておきます。

  • <?xmlから始まるXML宣言のversion="1.0"(バージョンが1.0であれば省略可)
  • <?xmlから始まるXML宣言のencoding="utf-8"(UTF-8で書き出している場合は省略可)
  • <?xmlから始まるXML宣言のstandalone="no"
  • <!-- Generator: Adobe Illustratorから始まるコメント(不要)
  • <!DOCTYPE svg PUBLICから始める文書型宣言(SVG1.1では非推奨)
  • <svg>要素のxmlns:a=""
  • <svg>要素のx=""y=""が両方とも0(px)の場合
  • <svg>要素のenable-background=""
  • <svg>要素のxml:space="preserve"
  • id属性が日本語になっている場合は適切な半角英数字に修正

必須なコード

ルート要素となる<SVG>要素の属性。

  • xmlns="http://www.w3.org/2000/svg"(SVG名前空間宣言)
  • xmlns:xlink="http://www.w3.org/1999/xlink"(XLink名前空間宣言)
  • version属性
  • width属性とheight属性(pxは省略可)
  • viewBox属性
<!-- 修正前 -->
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="レイヤー1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
     x="0px" y="0px" width="600px" height="600px" viewBox="0 0 600 600" enable-background="new 0 0 600 600" xml:space="preserve">
<path fill="#040000" d="M492,300c0,17.695-1.536,32-19.232,32H127.231C109.567,332,108,317.695,108,300c0-17.696,1.567-32,19.231-32
    H472.8C490.464,268,492,282.304,492,300z"/>
</svg>
<!-- 修正後 -->
<svg version="1.1" id="question_x5F_answer" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="600px" height="600px" viewBox="0 0 600 600">
<path fill="#040000" d="M492,300c0,17.695-1.536,32-19.232,32H127.231C109.567,332,108,317.695,108,300c0-17.696,1.567-32,19.231-32
    H472.8C490.464,268,492,282.304,492,300z"/>
</svg>

アクセシビリティ

  • <title>要素(タイトル)と<desc>要素(説明)を指定する
  • <title>要素と<desc>要素を読み上げさせるためのaria-labelledby="title desc"を指定する
  • 適切なrole属性(role="img"role="link"など)を指定する

SVGスプライト(svgstore)

SVGは<symbol>要素と<use>要素でコンポーネント化ができます。これをSVGスプライト(svgstore)と呼びます。

<symbol>要素は<svg>要素の中に記述し、その中にコンポーネント化したい要素を置きます。<symbol>要素には固有のid属性を指定しておきます。<symbol>要素内に記述したSVGは表示されず、<use>要素で参照することで表示することができます。

<svg>
  <symbol id="svg-title-facebook" viewBox="0 0 110 110">
    <title id="svg-title-facebook">Facebook</title>
    <path d="M55 0C24.6 0 0 24.6 0 55s24.6 55 55 55 55-24.6 55-55S85.4 0 55 0zm14.6 54.8H60v34H45.9v-34h-6.7v-12h6.7V35c0-5.6 2.6-14.2 14.2-14.2h10.5v11.6H63c-1.2 0-3 .6-3 3.3v7.1h10.8l-1.2 12z"></path>
  </symbol>
</svg>

<use>要素を使ってSVGを呼び出します。role属性やaria-labelledby属性でアクセシブルにしている点に注意してください。

<svg viewBox="0 0 110 110" role="img" aria-labelledby="svg-title-facebook">
  <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#svg-title-facebook"></use>
</svg>

SVGスプライトはEJSやJadeのようなテンプレートエンジンで外部ファイル化をすると管理がしやすくなります。

注意点。

  • IEとEdgeは<use>要素による外部SVGファイルの参照ができないため、<body>要素直下にSVGファイルを直書きする
  • <defs>要素よりも<symbol>要素の方が柔軟に指定できる(サイズの変更ができる)ためSVGスプライトは<symbol>要素で定義する

CSS

SVGで指定できるCSSは限定されています。またSVG独自のプロパティも用意されています。例えば以下のようなプロパティがあります。

  • stroke(線の色)
  • stroke-width(線の幅)
  • fill(塗りの色)
  • fill-opacity(塗りの透明度)
  • stroke-dasharray(線の長さ)
  • stroke-dashoffset(線の開始位置)

インラインSVGにはheight:auto;が効かないので、フルードイメージにする場合は以下のCSSを指定します。

.c-embed {
  display: block;
  overflow: hidden;
  position: relative;
  height: 0;
  margin: 0;
  padding: 0;
  .c-embed__item,
  iframe,
  embed,
  object,
  video {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    width: 100% !important;
    height: 100% !important;
    border: 0;
  }
}

/**
 * アスペクト比 16:9
 */
.c-embed--16to9 {
  /* (横幅 / 高さ) * 100% */
  padding-bottom: percentage(9 / 16) !important;
}

リンク

インラインSVGにリンクを貼る場合<a>要素で<svg>要素を囲んでも動作しません。<svg>要素内のタグを<a>要素で囲み、xlink:href属性でリンク先を指定します。

<svg>
  <a xlink:href="#">
    <path></path>
  </a>
</svg>

アニメーション

SVGでアニメーションをさせる方法は3つあります。

  1. SMIL(スマイル)
  2. CSS

SMILはIEが非対応で、Chromeでも廃止する流れになっています。
CSSでのアニメーションはIEでtransformが効かなかったり、SVG1.1で使えるCSSプロパティに限られるため機能は限定的です。
必然的にJavaScriptを使ったアニメーションを使うのがベターということになります。

SVGの要素はJQueryで操作することはできない(名前空間が違う)ので、ライブラリを使います。

  • GreenSock(高機能だけど、少し難しい。プラグインを追加していく。)
  • Velocity.js(JQueryのanimate互換のアニメーションライブラリ。できるだけCSSで処理してくれるので軽い。)
  • Snap.svg(JQueryライクに書けるSVG専用のライブラリ。最近アップデートされていないので要注意。)

[add] SVGのアセットの書き出し

アセットの書き出しの設定を追加。

アセットの書き出しの設定

  1. [ウィンドウ][アセットの書き出し]でパネルを開く。
  2. パネルの設定から[形式の設定…]を選択
  3. [SVG]を選択し、以下のようにオプションを設定する
  4. [スタイル]は[内部 CSS]
  5. [フォント]は[SVG]
  6. [画像]は[リンク]
  7. [オブジェクトID]は[レイヤー名]
  8. [小数点以下の桁数]は[1]
  9. [縮小]にチェックを入れる
  10. [レスポンシブ]のチェックを外す

アセットを書き出す

  1. アセットの書き出しパネルにドラッグ&ドロップしてアートワークに追加
  2. サムネイル下のテキストをクリックしてファイル名を入力(拡張子は不要)
  3. サムネイルをクリックして選択した状態で[書き出し]ボタンをクリックする
  4. ファイルを書き出す場所を選択する

[SVG] SVGをアイコンフォントで使う

SVGのアイコンの数が多い、色を変更する必要がある、複数箇所で指定する場合はアイコンフォントとして使います。

アイコンフォントの生成

Gulpなどで自動でアイコンフォントを生成する環境を作るのが理想的です。

Gulpを使わない場合は以下のようなツールを使って管理します。

マークアップ

マークアップ時の注意点として、アイコンフォントを擬似要素で表示させる場合にスクリーンリーダーがcontent内の意味のない単語を読み上げてしまう問題があります。WAI-ARIAを使用して以下のような対応をします。

  • aria-hidden="true"を指定して読み上げを防止します
  • アイコンとテキストをセットにして、アイコンが表示できない場合でも意味が伝わるようにします
  • テキストを非表示したうえで読み上げはできる.sr-onlyのようなクラスを使用します
  • aria-label=""で読み上げさせるテキストを記述します
<span class="p-icon p-icon--home" aria-hidden="true"></span>ホーム

<span class="p-icon p-icon--home" aria-hidden="true"></span>
<span class="u-sr-only">ホーム</span>

<span class="p-icon p-icon--home" aria-label="ホーム"></span>
.u-sr-only {
  overflow: hidden !important;
  clip: rect(0, 0, 0, 0) !important; 
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  margin: -1px !important;
  padding: 0 !important;
  border: 0 !important;
}

aria-hidden="true"はテキストを併記できる場合やアイコン自体の意味を伝える必要がない(装飾的な場合)に指定します。
aria-label=""はアイコンだけで意味を伝える必要がある場合に指定します。例えばパンくずリストでホームアイコンだけを表示している場合などがそれに当たります。

読み上げをさせなくさせるCSSのsperk:none;はほとんどの視覚系ブラウザ(ChromeやIEなど)やスクリーンリーダーで対応していません。なので、<span>で空タグを作ってアイコンを表示、aria-hidden="true"aria-label=""で読み上げに対応するというのが現時点でのベタープラクティスです。

HTML5の仕様を踏まえて、<i>要素ではなく<span>要素でマークアップします。理由は以下の通りです。

  1. aria-hidden="true"で読み上げを防止するようなアイコンは装飾的だと考えられるので<span>要素が適切
  2. <i>要素自体にはテキストは記述しないため、具体的な意味を持つ要素でマークアップするのは適切でないと考えられる(before擬似要素はHTML5の範囲に入るのか?)
  3. <i>要素は日本語の文章ではあまり使用されるシチュエーションがない意味(「技術用語、外国語のフレーズ、または架空の人物の思考など、何らかの理由で他のテキストと離して配置して区別されるテキスト」)を持つため、アイコンで使うのは適切でないと考えられる
  4. アイコンの意味を読み上げた場合(テキストとセットで読み上げた場合も含めて)、 アイコンを「何らかの理由で他のテキストと離して配置して区別されるテキスト」とするのは不自然だし、斜体として表現されるようなものでもない

CSSのレイヤーにpagesを追加するか?

現状ではページ単位での個別のスタイルは専用のCSSファイルを作ることになっている。つまり、共通で使われないスタイルはFLOCSSの中に含まない。

1枚のCSSファイルとして書き出したい場合に個別ページ特有のスタイル(Projectレイヤーの上書きなども含めて)を書けるレイヤーがない。

object/page/_comment.scssのようにする。Sassのファイル名はページのファイル名とディレクトリ名と基本的には合致するようにする。つまり、ディレクトリ名だけだったらディレクトリ共通、ディレクトリ名とファイル名を含んでいたらページ専用のスタイル。

bodyタグに.pg-commentのように、接頭辞.pg-とSassファイルと同じクラス名をつけ、スタイルを記述する。

読み込む順番は以下のようになるのが適切か?

  1. Object
    1. Component
    2. Project
    3. Page ←new!
    4. Theme
    5. Scope
    6. Utility
    7. QA/Test

まとめ

  • object/page/
  • 接頭辞は.pg-
  • ファイル名は参照するHTMLファイルを特定する一意なもの(ファイル名やディレクトリ名を入れる)
  • 参照するHTMLファイルのbodyにクラスをつけることで読み込めるようにする(例えば.pg-commentのように)
  • Projectレイヤーのあとに読み込ませる

1ページ専用のスタイルには接頭辞をつけない

ルートディレクトリにあるCSSファイルには要素セレクタと属性セレクタなどを除き、接頭辞をつける。名前の重複を避ける、共通のスタイルであることを示す。

あるページ専用のCSSファイルが必要な場合もある。例えばランディングページのような共通化させなくてもいい、ビジュアル優先のページが。そのようなスタイルは無理に共通化しなくてもいい場合が多い。

共通スタイルには接頭辞をつけているので、接頭辞をつけないことで逆に重複を避けることができる。接頭辞というスコープと1ページにしか読み込ませないというスコープ。

CSSのComponentレイヤーとProjectレイヤーの見直し

ComponetレイヤーからProjectレイヤーに移動させるコンポーネントを検討する。

  • .c-card => 具体的なスタイルを含みすぎている
  • c-split => 案件によって余白の数値が規則性なく変わる

ボタンコンポーネントをどちらで指定するのか迷いやすいので、.p-buttonをベーススタイルとして、.c-buttonを削除する。例えば、

<button class="c-button p-button-primary"></button>

のような記述はBEM的には微妙なところだし、Blockごとにモジュール化するというルールから外れてしまう。であれば、

<button class="p-button p-button--primary"></button>

のようにした方が分かりやすい。

文字と記号について(推奨、禁止など)

使用しない文字と記号。

  • 日本語(サーバー上でエラーになる可能性がある。WindowsとMacでやりとりをすると文字化けする可能性がある。)
  • 全角英数字・記号(対応していないサーバーやブラウザ、言語があるため)
  • 半角カタカナ(全角英数字・記号と同様)
  • 機種依存文字(!, ", #, $, %, &, (),[]. {}, +, ,など)
  • 全角スペース・半角スペース(見落としやすい、LinuxやUnix系ではファイルを開けないといったトラブルが起きる可能性がある)

[update] SVGのフルードイメージの詳細度を低くする

img[src$=".svg"]のように要素セレクタと属性セレクタを指定している。

[src$=".svg"]のように要素セレクタを指定しなくても問題がなさそう。詳細度も0,0,1,1から0,0,1,0にできる。

/* 修正前 */
img[src$=".svg"],
object[src$=".svg"] {
  max-width: 100%;
  width: 100%; /* IE対応 */
  height: auto;
}

/* 修正後 */
/* src属性値が.svgで終わる要素に適応 */
[src$=".svg"] {
  max-width: 100%;
  width: 100%; /* IE対応 */
  height: auto;
}

Sassの変数名のハイフンとアンダースコアについて追記

.scssでは変数名につけたハイフンとアンダースコアが同一視される。

例えば以下の変数名は同一視されるので、$foo--baseは常に上書きされ適応されない。

$foo--base: black;
$foo__base: red;

!defaultフラグを指定すると逆に$foo__baseが適応されない。

$foo--base: black !default;
$foo__base: red !default;

画像ファイルの命名規則を決める理由

  • メンバー全員で共通認識をもつことでコミュニケーションをとりやすくするため
  • 重複によるリネーム作業を防いで効率性を高めるため
  • 名前を見ただけで役割を理解しやすくして迷う時間を作らせないため
  • 名前をつけるときに迷う時間を極力減らすため
  • 経験や役割に関係なく、誰でも同じように作業をするため
  • 使用できない記号を使ったりすることによるトラブルを防ぐため
  • 同じような意味の単語を混ぜないことで統一感をもたせるため

画像ファイル名のルール

具体的なファイル名の付け方、単語の順番。俯瞰した抽象的な単語から始める。

  1. ページ名(ページごとにフォルダに分割されている場合は不要)
  2. コンポーネント名(どのパーツで使用されるか)
  3. 種類(見出しはtitle、ロゴはlogoなど)
  4. 詳細(汎用的なコンポーネントの場合はsubmitspのように判別ができるようにする)
  5. 連番(同じ用途の画像の場合は001など3桁の連番を振る、名前のソートで探しやすくなる)
  6. 状態(マウスオーバーやcurrentなどの状態が変わるときに使用する画像の場合)

共通のコンポーネントの場合はcommonなどと付けるか?なしでいくか?

連番は2桁でも充分?3桁にするとまずかぶらないし、決め打ちできるので考えなくても済む。

Gitの運用ルールを追加

git-operational-rules.md

GitHubとBacklog共通のGitに関するルールや運用フローを決める。それぞれのルールは

  • github-operational-rules.md
  • backlog-operational-rules.md

としてまとめる。

[add] アイコンフォント用SVGの書き出し方

アイコンフォント用のSVGは500×500pxのようなアートボード単位で書き出します。

  1. [アートボード]ツールを選択する shift + O
  2. [新規アートボード]メニューからアートボードを作成する
  3. [アートボードオプション]で[幅]と[高さ]を500pxなどにする
  4. [基準点が]左上になっているのを確認する
  5. [アートボード]パネルで[アートボードを複製]を選択して複製する
  6. 任意の個数のアートボードを作成したら[アートボード]パネルの[アートボードを再配置]を選択、[レイアウト]を[横に配列]、[配列数]を[5]など、[オブジェクトの一緒に移動]にチェックを入れた状態で[OK]をクリックする
  7. アイコンを作成してグループ化をしたら、オブジェクトをクリックしてメニューから[アートボードに整列]を選択、[整列]パネル(shift + F7)の[オブジェクトの整列]で上下左右の**に配置する
  8. command + option + Eで[画面に書き出し]を表示
  9. [アートボード]を選択して、アートボードの名前を書き出したいファイル名に変更する
  10. サムネイルをクリックして書き出すアートボードを選択
  11. [書き出し先]でSVGを書き出す場所を選択
  12. [フォーマット]は[SVG]
  13. [アートボードを書き出し]で書き出す

[add] アートボードの基本的な使い方

  • [アートボード]ツールを選択 shift + O
  • ドラッグで新規アートボードを作成
  • アートボードパネルでアートボードと、オブジェクトを選択
  • [オブジェクト][アートボード][オブジェクト全体に合わせる]でアートボードのサイズをオブジェクトに合わせる

[update] CSSコーディングルールの見直し

Small Blockなどを

  1. Content(見出しやリスト、ボタンやアイコンなどのページの内容を表現する小さなオブジェクトです。)
  2. Medium Container(Contentを内包するオブジェクトで、Contentのスタイルを上書きすることができます。)
  3. Large Container(ContentやMedium Containerを内包するオブジェクトで、内包するオブジェクトに干渉することはできません。)

のようにする。
これはOOCSSのコンテナとコンテンツの分離をベースにしている。

[OOCSS] OOCSSとはなにか?

OOCSSとは何か?

OOCSSはNicole Sullivanが提唱したCSSの設計手法のひとつです。
OOCSSは「Object Oriented CSS」の略でオブジェクト指向のCSSという意味です。オブジェクト指向はプログラミングの手法のひとつで、CSSにおけるオブジェクト指向は機能ごとにクラスを作って、それを組み合わせることでページを作成していく方法です。

CSSは壊れやすい。始めることは簡単だけれど。
ファイルサイズは確実に増えていきます。なぜなら、コードの再利用はほとんどされないからです(自分が書いていないコードは信じられないです)。
最初はクリーンなコードも壊すことは簡単です。始めることが重要なのではなく、クリーンに保ち続けることが重要なのです。
クレバーなモジュールを書きましょう。さもなければ、ブロックやページ、複雑なコンテンツが増えるごとにコードも増え続けます。

Object Oriented CSSというスライドの冒頭で、このようにニコール・サリヴァンは言っています。この課題を解決する方法としてOOCSSが考えられました。OOCSSは2009年に発表され、今ではCSS設計の基礎になっています。

OOCSSには2つの重要な原則があります。

  1. 構造と見た目を分離する(Separate Structure and Skin)
  2. コンテナとコンテンツを分離する(Separate Container and Content)

[fix] SVGの書き出しのCSS プロパティはプレゼンテーション属性

スタイル属性がいちばんファイルサイズの削減効果がある。スタイル属性を指定するようにしていたが、SVGスプライトでスタイルをCSSから変更しようとしたときにスタイルを上書きすることができなかった。

スタイリングをやりやすくするために、属性には基本的に指定をせず、CSS側からした方がいい。変更しない、CSSで指定するのが難しい場合は除く。

[OOCSS] 構造と見た目を分離する(Separate Structure and Skin)

構造と見た目を分離する(Separate Structure and Skin)

OOCSSの重要な原則のもうひとつが「構造と見た目の分離」です。

構造とは何か?

例えばボタンコンポーネントを3つ作ったとします。

.button-success {
  display: inline-block;
  padding: 0.75em;
  line-height: 1;
  text-align: center;
  text-decoration: none;
  color: #fff;
  background-color: blue;
}

.button-warning {
  display: inline-block;
  padding: 0.75em;
  line-height: 1;
  text-align: center;
  text-decoration: none;
  color: #fff;
  background-color: orange;
}

.button-alert {
  display: inline-block;
  padding: 0.75em;
  line-height: 1;
  text-align: center;
  text-decoration: none;
  color: #fff;
  background-color: red;
}

それぞれのプロパティを見てみると共通する部分があります。その中から色やアニメーションのような装飾的なスタイルを除いたものが構造です。この構造を1つのクラスにまとめて装飾的なスタイルだけを持つクラスを3つ指定してみます。

.button {
  display: inline-block;
  padding: 0.75em;
  line-height: 1;
  text-align: center;
  text-decoration: none;
}

.button-success {
  color: #fff;
  background-color: blue;
}

.button-warning {
  color: #fff;
  background-color: orange;
}

.button-alert {
  color: #fff;
  background-color: red;
}

構造を3つのクラスすべてに指定した場合、それぞれ7行分のプロパティを指定しているので21行になります。構造だけをまとめたクラスを作った場合、5行と2行×3になるので11行になりました。

パッと見ただけでもスッキリして見通しが良くなっているのが分かると思います。
ボタンのパターンを追加したい場合では装飾部分だけを指定すればいいだけですし、ボタンのサイズを一括で変更したい場合でも、構造用のクラス(.button)のpaddingなどを変更すれば、すべてのボタンのパターンに適応されます。

HTMLには以下のようにマルチクラス(複数のクラス)で指定します。

<a class="button button-success">.button-success</a>

マルチクラスはHTML側の指定が長くなるというデメリットはありますが、追加や修正に強くなるメリットがあります。

クラス名のつけかた

OOCSSの言う「見た目」は直接的な名前をつけることを禁止しています。

例えば以下のような名前は直接的すぎます。

  • red
  • crimson
  • mb10

以下のように抽象的、相対的な名前をつけるべきです。

  • emphasis
  • brand
  • mb-small

直接的な名前は値を変更すると、名前の意味と値の意味が合わなくなる恐れがあります。

.red {
  /* 強調の意味で色を変えていたけれど、デザインが変更された */
  color: black;
  font-weight: bold;
}

/* ブランドカラーが変更されてしまった */
.crimson {
  color: blue;
}

/* マージンを微調整したいけど、固定値なのでHTMLを書き換えないといけない */
.mb10 {
  margin-bottom: 10px;
}

構造は以下のようなプロパティが当てはまります。

  • display;
  • position
  • float
  • width
  • margin
  • border

borderは構造としても装飾としても指定することがあるので、状況に応じて考えます。

パターンは3つ以上から

「Rule of three」という言葉があります。3回繰り返したことはパターン化できる可能性が高いということです。

構造と見た目の分離という最適化はすぐに始める必要はありません。いくつかのコンポーネントを作ってから、「パターン化できそうだ」と思ったら最適化を始めるくらいでもいいでしょう。

パターンは3つのコンポーネントという単位以外にも、3つの案件で使ったという単位で考えてもいいでしょう。そのコンポーネントはどんな案件でも使うような汎用性の高いコンポーネントかもしれません。

[OOCSS] コンテナとコンテンツを分離する(Separate Container and Content)

コンテナとコンテンツを分離する(Separate Container and Content)

レゴのように再利用できるコンポーネントライブラリでページを作成するのがOOCSSの手法です。そのための重要な原則のひとつが「コンテナとコンテンツの分離」です。
コンテンツはテキストや画像、リストなどの小さなコンポーネントでコンテナはコンテンツを包むためのコンポーネントと言えます。

コンテナとは何か?

例えばこのようなHTMLを見たことはありませんか?

<div class="container">
  <div class="row">
    <div class="col-md-8">.col-md-8</div>
    <div class="col-md-4">.col-md-4</div>
  </div>
</div>

これはBootstrapのグリッドレイアウトです。これらはコンテンツ(テキストや画像など)を入れるため機能だけを持っています。コンテンツに何が入るのかコンテナは知りませんが、それでも問題なく機能します。つまり、コンテナはどんな場所でも使えることになります。

OOCSSではグリッドで横幅をコントロールすることを推奨しています。逆に高さはコンテンツに依存するためコントロールするべきではないとしています。この場合の高さのコントロールとはheightを手動で書いてしまうことを指しています。例えばtableflexプロパティのような高さの揃うCSSやJavaScriptで高さを揃える処理は当てはまりません。

コンテンツとは何か?

コンテンツはページの内容のことです。コンテンツは以下のようなコンポーネントで表現されます。

  • 見出し(見出しレベルに関わらず、同じ見た目にできる)
  • リスト(デフォルトのリスト、クリックを促す、アイコン付き)
  • ヘッダーとフッター
  • ボタン
  • mediaオブジェクト(画像とテキストが横並びになっている)

クラスセレクタを賢く使う

OOCSSでは基本的にクラスセレクタのみを使います。IDセレクタではドキュメント内で1回しか指定できませんし、要素セレクタや属性セレクタだと使える状況を限定してしまいます。

例えば、あるクラスの中にある<h2>要素にスタイルを指定したとします。

.box h2 {}

このスタイルを以下のようなHTML構造でも使いたい場合、

<div class="box">
  <h3>見出し</h3>
</div>

<h3>に対しては適応されないので、このように変更しました。

.box h2,
.box h3 {}

しかし、このやり方では適応したい場面が出てくるたびにCSSを変更する必要がありますし、コードも増えていきます。
はじめからクラスセレクタに指定しておけば、どんな要素であっても、どんな要素で囲んでいてもスタイルは適応されます。なので、クラスセレクタに要素セレクタを結合する必要もありません。

/* Good */
.box-heading {}

/* NG */
h2.box-heading {}

また、以下のようにセレクタをつなげて指定する必要もありません。クラスセレクタ間の依存関係も作らないほうが汎用的に使えるからです。

/* NG */
.box .box-heading {}

個別CSSで既存のCSSを上書きする場合の書き方

各HTML専用のCSSファイル(以下個別CSS)内でComponentやProjectレイヤーを上書きするときにどんな書き方をするのがいいのか?

個別CSSはそのページがスコープになる(他のページでは読み込まれない)ので詳細度を気にする必要はほとんどないのかもしれない。
それよりも上書きのしやすさや、HTMLをいかに簡潔にするかを優先したほうがいいかもしれない。

.c-block {}
.c-block__element {}

.cp-block {}
.cp-block > .c-block__element {}
<div class="c-block cp-block">
  <div class="c-block__element">
  </div>
</div>

のように1つのブロックを指定して、CSS内で上書きするセレクタと結合子を指定してHTMLを簡潔にする。

[OOCSS] コンポーネントに拡張性を持たせる

コンポーネントに拡張性を持たせる

コンポーネントは2つの原則に限らず、機能ごとに拡張できるようにします。OOCSSではmediaオブジェクトが例として示されます。

mediaオブジェクトは以下のようにマークアップされ、画像とテキストが横並びになるレイアウトのことを言います。頻繁に利用されるレイアウトで、TwitterやFacebookのタイムライン、コメント欄や関連記事のようなコンポーネントにも使われることが多いです。

<div class="media">
  <div class="media-image">
    <img src="#">
  </div>
  <div class="media-body">
    <p></p>
  </div>
</div>

CSSは以下のようになります。

.media {
  display: block;
}

.media:after {
  content: "";
  display: block;
  clear: both;
}

.media-image {
  float: left;
  margin-right: 1em;
}

.media-body {
  /* テキストが画像に回り込まないように */
  overflow: hidden;
}

通常のmediaオブジェクトは画像が左でテキストが右と固定されています。画像を右側に配置したい場合もデザイン上よくあるので、バリエーションを作ってみます。ただし、現状のmediaオブジェクトを拡張するようにします。

.media-reverse > .media-image {
  float: right; /* leftからrightに上書き */
  margin-right: 0; /* 右側の余白をリセット */
  margin-left: 1em; /* 余白を左側に追加 */
}

マークアップは以下のように.media-reverseを追加で指定するだけです。

<div class="media media-reverse">
  <div class="media-image">
    <img src="#">
  </div>
  <div class="media-body">
    <p></p>
  </div>
</div>

.media-reverseというクラスを指定したmediaオブジェクトの画像は右側に配置されます。ベースになるmediaオブジェクト自体のスタイルは変更せず、スタイルを一部だけ上書き・追加しているだけなので、.media-reverseが持つスタイルは必要最低限です。

このようにOOCSSの2つの原則(構造と見た目の分離とコンテナとコンテンツの分離)に当てはまらない場合でも、拡張性を持たせていくことが重要になります。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.