CSS Design
    and
Programming
〜CSS で何ができるの?〜

  天野 卓 @ ToI企画
    2011.7.23
自己紹介
佐久市でWebアプリケーションを開発しています
フリーソフトウェアを配布しています
  http://tec.toi-planning.net

GitHub
  http://github.com/usualoma

jsdo.it
  http://jsdo.it/usualoma
概要
HTML5 とは
 ✓ HTML5 に到るまでの歴史
 ✓ HTML5 の範囲
 ✓ HTML5 はもう使えるの?
CSS Design and Programming
 ✓ CSS とは
 ✓ CSS3 で出来るようになること
 ✓ CSS Programming
HTML5 とは




http://dev.w3.org/html5/spec/
HTML5 とは
http://platform.html5.org/
http://platform.html5.org/
HTML5
に到るまでの
  歴史
前身である HTML4 / XHTML について
HTML4のW3C勧告
  1997年にHTML4.0
  1999年にHTML4.01

SGMLベースのHTMLからXMLベースのXHTMLへ
の移行を計画
  パースが簡単になる (プログラム側の都合)
  MathMLやSVGなどのXML関連技術と連携しやすい

XHTMLのW3C勧告
  1999年にXHTML1.0
  2001年にXHTML1.1
HTML4 / XHTML の2004年頃の状況 - 1
  マークアップとしては、XHTMLは受け入れられ始
  めていた
   XHTML1.0 と宣言されているページは少なくない
   正しくマークアップされている
HTML4 / XHTML の2004年頃の状況 - 2
  しかし
   MIMEタイプについては application/xhtml+xml は使
   われておらず、ほとんどのページで text/html が使わ
   れていた
   XHTML1.1 はほとんど使われていない

  なぜ?
   XMLは整形式(正しい書式)を要求するがWeb上のほ
   とんどのページはXMLとしての誤りを含んでいる
   XHTML1.1 では text/html を使うことはできず、
   application/xhtml+xml を使う必要がある
HTML4 / XHTML の2004年頃の状況 - 3
  大多数のページでは依然として HTML4.01が使
  われていた
  各ブラウザに独自拡張が増えてきた
   マルチメディア
    embed / object

   JavaScript
    DOM

  ブラウザベンダーは新しい標準化を求めていた
WHATWG の発足 - 1
2004年、W3Cのワークショップで Mozilla と
Opera が Web の将来に関する提案を行う
 後方互換性と明確な移行手段
 適切に定義されたエラー処理
 ユーザーがオーサリングエラーに直面しないこと
 実用性(実用的なユースケースが盛り込まれているこ
 と
 など

XHTMLに対する新しいAPIではなく、HTMLやCSS
またDOMへの拡張を開発したい
 非公式な投票が行われるが否決
WHATWG の発足 - 2
同2004年、Apple、Mozilla、Opera によりHTML
をベースとした規格と関連技術の策定を目的とし
た団体、WHATWGが設立される。
 Web Hypertext Application Technology Working
 Group

WHATWG の策定している仕様
 HTML5
 Web Applications 1.0
HTML5 / Web Applications 1.0
WHATWG の策定した仕様はブラウザベンダーの
支持を集めた
 2006年にはW3Cでもワーキンググループが作られ、
 現在は共同で策定作業を進めている

一方 XHTML2.0 は支持を得られず
 2009年にワーキンググループは終了した
HTML5 の仕様書
WHATWG
 ✓ http://www.whatwg.org/specs/web-apps/current-
   work/multipage/

W3C
 ✓ http://dev.w3.org/html5/spec/
 ✓ http://dvcs.w3.org/hg/domcore/raw-file/tip/
   Overview.html
 ✓ http://www.w3.org/TR/DOM-Level-3-Events/
 ✓ ...
HTML5 の仕様の策定状況
WHATWG
 ✓ 生きている仕様
 ✓ 現存のドキュメントを最新のHTML規格とする
W3C
 ✓ 2011年7月の時点では最終草案の段階
 ✓ 2014年の勧告を目指している
HTML5
の範囲は?
http://platform.html5.org/
http://platform.html5.org/
Web
Applications
    1.0
    は?
http://platform.html5.org/
HTML5 とは
仕様書の範囲として
 ✓ WHATWG の HTML5 の仕様書
時には
 ✓ WHATWG の Web Applications 1.0 の仕様書
バズワードとして
 ✓ 次世代のウェブ技術の総称
HTML5 はもう使えるの?
マークアップ言語として
 主要なモダンブラウザは対応済み
 未対応のブラウザでも表示は可能
  HTML では未知のタグは単に内容が表示されるため
  未対応ブラウザのためのツールもある

 HTML4 から HTML5 への移行は簡単
  互換性が高いので、多くの場合はDOCTYPEを変更すれば
  HTML5 のドキュメントになる
  <!DOCTYPE html>
HTML5 はもう使えるの?
関連API
 使えるものと使えないものがる
  Firefox / Google Chrome / Opera HTML5 の範囲はかな
  り使えるが、IE は 9 でも実装されていない API は多い

 使いたい API を実装されているブラウザでのみ使う
 Progressive Enhancement
 事例 - Web Storage
  Twitter
  Amazon
HTML5 のまとめ
HTML5とは
 ✓ 「これから決まる仕様」ではなく「すでに動いている仕様」
どう使うか
 ✓ 価値を生むことの出来る機能を選んで使う
CSS Design
    and
Programming
CSS とは
  カスケーディングスタイルシート
  (CSS)は、ウェブドキュメントにスタ
  イル(フォント, カラー, 余白など)を
  追加するためのシンプルな仕組み
  です。
[cited from `http://www.a2ztutorial.com/Style/CSS/']
つまり...
http://shopdd.blog51.fc2.com/blog-entry-932.html
これでいいの?
CSS の役割
デザイン
 ビジュアル的な綺麗さ、全体のイメージ
  配色の調整や画像の配置

 ユーザビリティ
  テキストを読みやすくするタイポグラフィ
  情報を探しやすいレイアウト
  操作しやすい、迷わないフォーム
  わくわくするユーザーインターフェイス
例えば
クリックしやすいダウンロードリンク




  ボタンの CSS を切った場合
クリックしやすいダウンロードリンク




  http://mozilla.jp/firefox/
読みやすい/選択しやすい表
読みやすい/選択しやすい表
HTML文書とCSSの役割分担
HTML文書
 コンテンツ

CSS
 デザイン
http://shopdd.blog51.fc2.com/blog-entry-932.html
お絵かきは?
サイトのコンテンツだとするとおそらく NG
デザインの要素であればおそらく OK
CSS の現状
W3C勧告の出ている最新バージョンは 2.1
CSS3 は策定中
 モダンブラウザでは対応は進んでいる
 ベンダープレフィックスの必要なものも多い
  -moz-linear-gradient
  -webkit-linear-gradient
  -o-linear-gradient
  -ms-
CSS3 の仕様書
CSS current work & how to participate
  http://www.w3.org/Style/CSS/current-work
   Selectors
   http://www.w3.org/TR/css3-selectors/
   CSS Color Module
   http://www.w3.org/TR/2011/REC-css3-
   color-20110607/
   Media Queries
   http://www.w3.org/TR/2010/CR-css3-
   mediaqueries-20100727/
   ...
CSS2 から CSS3 で変わる所
画像や配色の指定が強力になる
 Web フォント
 角丸・グラデーション・枠線に画像が使える

レイアウトを柔軟に、シンプルに指定できる
 段組
 display: flexbox

セレクタが追加され細かく要素を指定できる
複数環境への対応
 メディアクエリー
サブミットボタン
サブミットボタン - HTML

<input type="submit" value="" class="submit-button" />
サブミットボタン - HTML
<input type="submit" value="送信" class="submit-button" />
サブミットボタン - CSS
.submit-button {
   background: -webkit-gradient(linear, left top, left bottom,
     color-stop(1.00, #0d5eb5), color-stop(0.20, #3690f0),
     color-stop(0.20, #3690f0), color-stop(0.00, #70b6f2));
   background: -webkit-linear-gradient(
     top, #70b6f2 0%, #3690f0 20%, #3690f0 20%, #0d5eb5          100%);
   background: -moz-linear-gradient(
     top, #70b6f2 0%, #3690f0 20%, #3690f0 20%, #0d5eb5          100%);
   background: -o-linear-gradient(
     top, #70b6f2 0%, #3690f0 20%, #3690f0 20%, #0d5eb5          100%);
   background: linear-gradient(
     top, #70b6f2 0%, #3690f0 20%, #3690f0 20%, #0d5eb5          100%);
サブミットボタン - CSS

    border: 0;
    border-radius: 5px;
    box-shadow: inset 0 1px 1px rgba(255, 255, 255, 0.5),
      inset 0 -1px 1px rgba(0, 0, 0, 0.9);
    text-shadow: 0 -1px 1px rgba(0, 0, 0, 0.4),
      0 1px 1px rgba(255, 255, 255, 0.1);
    font-weight: bold;
    font-size: 20px;
    padding: 10px 40px;
    color: white;
}
角丸
角丸 - HTML

<div class="container01">
 <div class="container02">
  <div class="content">
   Firefox
  </div>
 </div>
</div>
角丸 - HTML

<div class="content">
 Firefox
</div>
角丸 - CSS - 例1

/* border-radius */
div.content {
   border: 1px solid #D7D7D7;
   border-radius: 10px;
}
角丸 - CSS - 例2

/* background-image を複数指定する */
div.content {
   background-image: url("content-header.png"),
               url("content-footer.png")
   background-repeat: no-repeat,
               no-repeat;
   background-position: top,
               bottom
}
角丸 - CSS - 例3

/* border-image */
div.content {
   border-image: url("border.png")
     60 60 60 60 / 60px 30px 10px 30px repeat;
}
CSS3 を使うと嬉しいこと
表現力が強力になる
 少ない記述で要件を満たしたデザインを実現できる
 複数のデバイスに対応できる

HTML でコンテンツの表現に集中できる
ところで
プログラマならプロフィールに書きたい
そんなわけで
CSS
Programming
CSS 8puzzle




http://jsdo.it/usualoma/1Tgw
CSS Noughts and Crosses




 http://jsdo.it/usualoma/qzfr
CSS でプログラミングをするということ
CSS はプログラミングのための仕組みではない
利用者にとってのメリットはない
 あえていえば JavaScript を切っていても動作する

工夫しないと動かせないので作成者の勉強になる
 CSSでできること
 CSSではできないこと
CSS プログラミングの基本的な要素
DOM
CSS
CSS プログラミングの基本的な要素 - DOM
  DOM
   input で状態を保存
    <input type="checkbox" />
    <input type="radio" />

   scrollbar を利用する手法もある
CSS プログラミングの基本的な要素 - CSS
 CSS
   セレクタで見た目を定義
    :checked > .foo
    :checked ~ :checked ~ .foo (CSS3)

   クリック対象の input を調整する
    z-index
    pointer-events (CSS3)

   状態の変更時にアニメーションさせる
    transition (CSS3)
有限オートマトン
有限オートマトン
有限オートマトン
有限オートマトン
ソースのイメージ - DOM
<div id="panel">
 <input type="radio"   id="r1-1_1-1"   name="1-1"   />
 <input type="radio"   id="r1-1_1-2"   name="1-1"   checked="checked" />
 <input type="radio"   id="r1-1_1-3"   name="1-1"   />
 <input type="radio"   id="r1-1_2-1"   name="1-1"   />
 <input type="radio"   id="r1-1_2-2"   name="1-1"   />
 <input type="radio"   id="r1-1_2-3"   name="1-1"   />
 <input type="radio"   id="r1-1_3-1"   name="1-1"   />
 <input type="radio"   id="r1-1_3-2"   name="1-1"   />
 <input type="radio"   id="r1-1_3-3"   name="1-1"   />
 <input type="radio"   id="r1-2_1-1"   name="1-2"   />
 <input type="radio"   id="r1-2_1-2"   name="1-2"   />
 <input type="radio"   id="r1-2_1-3"   name="1-2"   />
 <input type="radio"   id="r1-2_2-1"   name="1-2"   checked="checked" />
 <input type="radio"   id="r1-2_2-2"   name="1-2"   />
ソースのイメージ - セレクタ
           z-index

input {
  z-index: 0;
}
#r1-1_3-2:not(:checked)   ~   #r1-2_3-2:not(:checked) ~
#r1-3_3-2:not(:checked)   ~   #r2-1_3-2:not(:checked) ~
#r2-2_3-2:not(:checked)   ~   #r2-3_3-2:not(:checked) ~
#r3-1_3-2:not(:checked)   ~   #r3-2_3-3:checked ~
input[for="r3-2_3-2"] {
  z-index: 10;
}
ソースのイメージ - セレクタ
         pointer-events

input {
  pointer-events: none;
}
#r1-1_3-2:not(:checked)   ~   #r1-2_3-2:not(:checked) ~
#r1-3_3-2:not(:checked)   ~   #r2-1_3-2:not(:checked) ~
#r2-2_3-2:not(:checked)   ~   #r2-3_3-2:not(:checked) ~
#r3-1_3-2:not(:checked)   ~   #r3-2_3-3:checked ~
input[for="r3-2_3-2"] {
  pointer-events: auto;
}
ソースのイメージ - transition

div#complete {
   left: 420px;
   -webkit-transition: left 200ms linear 800ms;
   -moz-transition: left 200ms linear 800ms;
   -o-transition: left 200ms linear 800ms;
}
#r1-1_1-1:checked ~ #r1-2_1-2:checked ~ #r1-3_1-3:checked ~
#r2-1_2-1:checked ~ #r2-2_2-2:checked ~ #r2-3_2-3:checked ~
#r3-1_3-1:checked ~ #r3-2_3-2:checked ~ div#complete {
   left: 0;
}
CSS プログラミングで突き当たる壁
いとこ要素を指定したいんだけど...
セレクタでフィルタしたいんだけど...
条件を満たすまでループしたいんだけど...
いとこ要素を指定したいんだけど...
いとこ要素を指定したいんだけど...

<div id="board">
 <div id="panel_1">
  <input type="radio"   id="1-1" />
  <input type="radio"   id="1-2" />
 </div>
 <div id="panel_2">
  <input type="radio"   id="2-1" />
  <input type="radio"   id="2-2" />
 </div>
 ...
このようにできると嬉しいのですが...

#1-1.checked :parent #panel_2 #2-2.checked {
   ...
}
要素の関連で指定するセレクタ
           コンビネータ
EF        E要素の子であ   CSS2
          るF要素
E>F       E要素のすぐ後   CSS2
          ろの子であるF
          要素
E+F       E要素のすぐ後   CSS2
          ろの弟であるF
          要素
E~F       E要素の弟であ   CSS3
          るE要素
いとこ要素を指定したいんだけど...



  できません!
input は全て兄弟要素として並べてください

    <input type="radio" id="1-1"   />
    <input type="radio" id="1-2"   />
    <input type="radio" id="2-1"   />
    <input type="radio" id="2-2"   />
    <div id="board">
     <div id="panel_1">
      <label for="1-1"></label>
      <label for="1-2"></label>
     </div>
     <div id="panel_2">
      <label for="2-1"></label>
      <label for="2-2"></label>
     </div>
     ...
CSS3 を使うとこのように指定できます

 #1-1.checked ~ #2-2.checked {
    ...
 }
CSS2 でもこのように指定することは可能です

 #1-1.checked + #1-2 + #2-1 + #2-2.checked {
    ...
 }
セレクタでフィルタしたいんだけど...
セレクタでフィルタしたいんだけど...

input:checked:nth-child(1) div {
  display: block;
}

input:checked:nth-child(2) div {
    /*
     * 2つチェックされているときに適用される
   * :nth-child(1) のセレクタは上書きされる
     */
  display: block;
}
DOMの構造や状態で指定するセレクタ
                  擬似クラス
E:root           ルート要素     3
E:checked        チェックされて   2
                 いるE要素
E:nth-child(n)   チェックされて   3
                 いるE要素
DOM に対して擬似的にクラスを設定する
<!-- イメージです -->
<html class=":root">
 <input type="radio"   checked class=":checked :nth-child(1)" />
 <input type="radio"   class=":nth-child(2)" />
 <input type="radio"   class=":nth-child(3)" />
 <input type="radio"   checked class=":checked :nth-child(4)" />
 <input type="radio"   checked class=":checked :nth-child(5)" />
セレクタでフィルタしたいんだけど...



  できません!
セレクタでフィルタしたいんだけど...

input:checked ~ div {
  display: block;
}

input:checked ~ input:checked div {
    /*
     * 2つチェックされているときに適用される
     */
  display: block;
}
条件を満たすまでループしたいんだけど...
 CSS から DOM を変更できればループできそうだ
 けど...
条件を満たすまでループしたいんだけど...



    できません!
DOMを変更することはできません
状態の変更はユーザーの入力に依存します
CSS 8puzzle




http://jsdo.it/usualoma/1Tgw
CSS 8puzzle の戦略
<input type="radio" /> を使用
  1 ピースにつき 9 つの input を用意
  トグルを簡単に表現できるため

移動可能なピースに対して、クリック可能な label
を z-index で一番手前に表示する
初期状態もあらかじめ作成
終了状態になったら用意しておいた Complete!
画面を表示
クリック可能な label を手前に表示
クリック可能な label を手前に表示
CSS 8puzzle のソースコード
JavaScript                  0行
HTML                      167 行
CSS                      2013 行
CSS Noughts and Crosses




 http://jsdo.it/usualoma/qzfr
CSS Noughts and Crosses の戦略
<input type="checked" /> を使用
  1 マスにつき 5 個の input を用意
   最大で 5 手までなので

コンピューターの手順はあらかじめ全て用意
CSS Noughts and Crosses のソースコード
JavaScript                  0行
HTML                      150 行
CSS                     12373 行
CSS のまとめ
CSS3
 ✓ 少ない記述で要件を満たしたデザインを実現できる
CSS Programming
 ✓ 意外と役立つこともあります。
 ✓ Enjoy!
参考文献
2004年にW3Cのワークショップで出された提案
 http://www.w3.org/2004/04/webapps-cdf-ws/
 papers/opera.html
入門 HTML5
 Mark Pilgrim (著), 矢倉 眞隆 (監訳), 水原 文 (翻訳)
 オライリージャパン
書き捨てのPHP
CSS 8puzzle
  https://
  gist.github.com/376d7d0a2f3d7533a2e0

CSS Noughts and Crosses
  https://
  gist.github.com/2d575af617934eb752ed
ご清聴ありがとうご
  ざいました。

      Powered by Rabbit 0.9.3

CSS Design and Programming