background-(image|size) の深みへようこそ

110
はじめに この資料はあくまで参考情報です 正式な文書を読みたい場合は http://www.w3.org/TR/ 以下にある 文書を読んでいただくよう お願いします

Upload: shota-kubota

Post on 25-Jan-2017

6.311 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: background-(image|size) の深みへようこそ

はじめに

この資料はあくまで参考情報です

正式な文書を読みたい場合はhttp://www.w3.org/TR/ 以下にある

文書を読んでいただくようお願いします

Page 2: background-(image|size) の深みへようこそ

background-(image|size)

の深みへようこそ

Page 3: background-(image|size) の深みへようこそ

自己紹介

• kubosh(o|0)_? (株式会社グラニ 所属)

• Twitter: kubosho_

• GitHub: kubosho

• http://blog.kubosho.com

Page 4: background-(image|size) の深みへようこそ

今日話すこと

Page 5: background-(image|size) の深みへようこそ

background-image と background-size の ブラウザでの挙動から

知る仕様

Page 6: background-(image|size) の深みへようこそ

以下を参考にした話をします

• CSS Backgrounds and Borders Module Level 3 - http://www.w3.org/TR/css3-background/

• CSS Backgrounds and Borders Module Level 3 (日本語訳)

- http://www.hcn.zaq.ne.jp/___/WEB/css-backgrounds-ja.html - W3C Editor's Draft の日本語訳

• CSS Image Values and Replaced Content Module Level 3 - http://www.w3.org/TR/css3-images/

• CSS Image Values and Replaced Content Module Level 3 (日本語訳)

- http://www.hcn.zaq.ne.jp/___/WEB/css-images-ja.html - W3C Editor’s Draft の日本語訳

Page 7: background-(image|size) の深みへようこそ

background-image や background-size の 謎のような挙動に

出会ったことはありませんか

Page 8: background-(image|size) の深みへようこそ

自分はあります

Page 9: background-(image|size) の深みへようこそ

複数画像のアニメーションをすることができない

(書き方次第では 何も表示されない)

Page 10: background-(image|size) の深みへようこそ

background ショートハンド

プロパティの値にbackground-size の値を含むと

背景に何も表示されない

Page 11: background-(image|size) の深みへようこそ

具体例

Page 12: background-(image|size) の深みへようこそ

複数画像のアニメーションをすることができない

(書き方次第では 何も表示されない)

Page 13: background-(image|size) の深みへようこそ

クロスフェードアニメーション

.example  {      width:  400px;      height:  200px;      animation:  crossfade  5s  linear  0s  infinite  alternate;  }  

@keyframes  crossfade  {      0%  {          background-­‐image:  url("images/foo.png");      }      100%  {          background-­‐image:  url("images/bar.png");      }  }  

Page 14: background-(image|size) の深みへようこそ

http://jsfiddle.net/bo5rj0b5/14/

Page 15: background-(image|size) の深みへようこそ

Chrome 46.0.2486.0 dev

Page 16: background-(image|size) の深みへようこそ

Firefox 42.0a2

Page 17: background-(image|size) の深みへようこそ

background ショートハンド

プロパティの値にbackground-size の値を含むと

背景に何も表示されない

Page 18: background-(image|size) の深みへようこそ

以下のように書いたものは

.example  {      background-­‐image:  url("images/foo.png");      background-­‐position:  top  left;      background-­‐size:  auto  auto;  }  

Page 19: background-(image|size) の深みへようこそ

こう書くこともできる

.example  {      background:  url("images/foo.png")  top  left  /  auto  auto;  }  

Page 20: background-(image|size) の深みへようこそ

https://jsfiddle.net/4frxn6uL/

Page 21: background-(image|size) の深みへようこそ

Chrome 46.0.2486.0 dev

Page 22: background-(image|size) の深みへようこそ

Android 4.2.2 Browser

Page 23: background-(image|size) の深みへようこそ

なぜこうなるのか 仕様を読み解いていきます

Page 24: background-(image|size) の深みへようこそ

複数画像のアニメーションをすることができない

(書き方次第では 何も表示されない)

Page 25: background-(image|size) の深みへようこそ

そもそも background-image は 仕様上はアニメーションが

できない

Page 26: background-(image|size) の深みへようこそ
Page 27: background-(image|size) の深みへようこそ

Firefox の実装が正しい

Page 28: background-(image|size) の深みへようこそ

アニメーションできるプロパティ

• background-color

• background-position

• 単一もしくは複数の値

• background-size

• 値に contain, cover, auto を指定している時除く

Page 29: background-(image|size) の深みへようこそ

background ショートハンド

プロパティの値にbackground-size の値を含むと

背景に何も表示されない

Page 30: background-(image|size) の深みへようこそ

仕様の話

Page 31: background-(image|size) の深みへようこそ
Page 32: background-(image|size) の深みへようこそ

仕様上は background-position

の値指定の後に「/」で区切って

background-size の値指定が できる

Page 33: background-(image|size) の深みへようこそ

実装の話

Page 34: background-(image|size) の深みへようこそ

Android 2系では

background-size に

-webkit- プリフィックスが必要

Page 35: background-(image|size) の深みへようこそ

background ショートハンド プロパティ内に

background-size の値を 含めるとスタイル指定が

無効になる

Page 36: background-(image|size) の深みへようこそ

Android 4.3までは background ショートハンド プロパティの値として

background-size の値を 内包する記法に対応しないため スタイル指定が無効になる

Page 37: background-(image|size) の深みへようこそ

background-size は background ショートハンド

プロパティ内で 指定しないほうが(今は)良い

Page 38: background-(image|size) の深みへようこそ

background-size の安牌

.example  {      background:  url(“images/foo.png")  top  left  no-­‐repeat  #fff;      -­‐webkit-­‐background-­‐size:  auto  auto;          background-­‐size:  auto  auto;  }  

Page 39: background-(image|size) の深みへようこそ

プリフィックスは面倒なので Autoprefixer を使うのが良い

Page 40: background-(image|size) の深みへようこそ

余談

Page 41: background-(image|size) の深みへようこそ

background-* プロパティの 指定を個別でした後に

background ショートハンド プロパティを指定した場合 値が上書きされる

Page 42: background-(image|size) の深みへようこそ

https://jsfiddle.net/1wfs92e5/3/

Page 43: background-(image|size) の深みへようこそ
Page 44: background-(image|size) の深みへようこそ
Page 45: background-(image|size) の深みへようこそ

より深みへ

Page 46: background-(image|size) の深みへようこそ

background-image

Page 47: background-(image|size) の深みへようこそ

CSS Backgrounds and Borders Module Level 3 より background-image

(とその他の背景関連プロパティ)の値にカンマ区切りで 複数の値を指定できるように

なった

Page 48: background-(image|size) の深みへようこそ

複数の値を指定するサンプル

.example  {      background-­‐image:  url("images/foo.png"),                                          url("images/bar.png");  }  

Page 49: background-(image|size) の深みへようこそ

https://jsfiddle.net/1wfs92e5/

Page 50: background-(image|size) の深みへようこそ
Page 51: background-(image|size) の深みへようこそ

background-image は 背景に表示する画像を 指定するだけではない

Page 52: background-(image|size) の深みへようこそ

背景のレイヤーの数も background-image で 指定された値の数によって

決まる

Page 53: background-(image|size) の深みへようこそ

背景のレイヤー?

Page 54: background-(image|size) の深みへようこそ

この場合五つのレイヤーがある

.example  {      background-­‐image:  url("images/foo.png"),                                          url("images/bar.png"),                                          url("images/baz.png"),                                          url("images/foobar.png"),                                          url(“images/barbaz.png");      /*  background-­‐repeat  の値は五つ指定できる  */      background-­‐repeat:  no-­‐repeat,  no-­‐repeat,                                            no-­‐repeat,  no-­‐repeat,                                            no-­‐repeat;  }  

Page 55: background-(image|size) の深みへようこそ

背景のレイヤーの数によって background-* プロパティの 値を指定できる数が変わる

Page 56: background-(image|size) の深みへようこそ

背景のレイヤーの数以上に background-* プロパティに 値を指定した場合はどうなる?

Page 57: background-(image|size) の深みへようこそ

.example  {      background-­‐image:  url("images/foo.png"),                                          url("images/bar.png"),                                          url("images/baz.png"),                                          url("images/foobar.png"),                                          url("images/barbaz.png");      background-­‐repeat:  no-­‐repeat,  no-­‐repeat,                                            no-­‐repeat,  no-­‐repeat,                                            no-­‐repeat,  no-­‐repeat;  }  

Page 58: background-(image|size) の深みへようこそ

背景のレイヤーの数以上に background-*プロパティに値を指定した場合は レイヤーの数以降の 指定が無視される

Page 59: background-(image|size) の深みへようこそ

.example  {      background-­‐image:  url("images/foo.png"),                                          url("images/bar.png"),                                          url("images/baz.png"),                                          url("images/foobar.png"),                                          url("images/barbaz.png");      background-­‐repeat:  no-­‐repeat,  no-­‐repeat,                                            no-­‐repeat,  no-­‐repeat,                                            no-­‐repeat,  no-­‐repeat;  }  

Page 60: background-(image|size) の深みへようこそ

.example  {      background-­‐image:  url("images/foo.png"),                                          url("images/bar.png"),                                          url("images/baz.png"),                                          url("images/foobar.png"),                                          url(“images/barbaz.png");   /* 六個目の値は無視されるので、 実質以下のような値指定になる */    background-­‐repeat:  no-­‐repeat,  no-­‐repeat,                                            no-­‐repeat,  no-­‐repeat,                                            no-­‐repeat;  }  

Page 61: background-(image|size) の深みへようこそ

背景のレイヤーの数より background-*プロパティの値指定の数が足りない場合は?

Page 62: background-(image|size) の深みへようこそ

.example  {          width:  800px;          height:  800px;          background-­‐image:  url("images/foo.png"),                                              url("images/bar.png"),                                              url("images/baz.png"),                                              url("images/foobar.png");          background-­‐repeat:  repeat-­‐x,  no-­‐repeat;          background-­‐position:  top  0  left  0,                                                    top  200px  left  0,                                                    top  400px  left  0,                                                    top  600px  left  0;  }

Page 63: background-(image|size) の深みへようこそ

それまでに指定した 値の指定が繰り返される

Page 64: background-(image|size) の深みへようこそ

.example  {          width:  800px;          height:  800px;          background-­‐image:  url("images/foo.png"),                                              url("images/bar.png"),                                              url("images/baz.png"),                                              url("images/foobar.png");          background-­‐repeat:  repeat-­‐x,  no-­‐repeat,                                                repeat-­‐x,  no-­‐repeat;          background-­‐position:  top  0  left  0,                                                    top  200px  left  0,                                                    top  400px  left  0,                                                    top  600px  left  0;  }  

Page 65: background-(image|size) の深みへようこそ

https://jsfiddle.net/1wfs92e5/4/

Page 66: background-(image|size) の深みへようこそ
Page 67: background-(image|size) の深みへようこそ

背景のレイヤーは background-image の値で 先に指定したものが上に 後に書いたものほど下に 重なって表示される

Page 68: background-(image|size) の深みへようこそ

background-size

Page 69: background-(image|size) の深みへようこそ

contain, cover, auto

という値について

Page 70: background-(image|size) の深みへようこそ

contain

Page 71: background-(image|size) の深みへようこそ

Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width

and its height can fit inside the background positioning area.

(Google 翻訳) 幅と高さの両方が、背景配置領域内に収まることができるように、最大の大きさに、(もしあれば)その固有の縦横比を維持しながら、画像を拡大縮小。

Page 72: background-(image|size) の深みへようこそ

cover

Page 73: background-(image|size) の深みへようこそ

Scale the image, while preserving its intrinsic aspect ratio (if any), to the

smallest size such that both its width and its height can completely cover

the background positioning area.

(Google 翻訳) 最小のサイズに、(もしあれば)その固有の縦横比を維持しながら、画像を拡大縮小幅と高さの両方が完全にバックグラウンド配置領域を覆う。

Page 74: background-(image|size) の深みへようこそ
Page 75: background-(image|size) の深みへようこそ

background-size: contain; と指定すると要素内に収まる

ように表示される 繰り返し指定がある場合は 繰り返して表示される

Page 76: background-(image|size) の深みへようこそ
Page 77: background-(image|size) の深みへようこそ

background-size: cover; と指定すると画像の大きさに 関係なしに隙間なく

要素に収まって表示される

Page 78: background-(image|size) の深みへようこそ

どちらの指定でも アスペクト比は 維持される

Page 79: background-(image|size) の深みへようこそ

auto

Page 80: background-(image|size) の深みへようこそ

background-size の 幅と高さのどちらかに 指定している場合

画像の内在サイズを使って 幅もしくは高さが算出される

Page 81: background-(image|size) の深みへようこそ

内在サイズ?

Page 82: background-(image|size) の深みへようこそ

画像などのオブジェクトが 持っている縦・横幅・縦横比

の総称

Page 83: background-(image|size) の深みへようこそ

ラスター形式の画像 (JPEG, GIF, PNG…)は 縦・横幅・縦横比が

揃っている

Page 84: background-(image|size) の深みへようこそ

ベクター形式の画像 (SVG) は 縦横比のみという場合や 縦・横幅のどちらかしかない

場合がある

Page 85: background-(image|size) の深みへようこそ

グラデーションは 内在サイズを持たない

Page 86: background-(image|size) の深みへようこそ

画像などのオブジェクトが 持っている縦・横幅・縦横比

の総称

Page 87: background-(image|size) の深みへようこそ

というのを覚えておいて ください

Page 88: background-(image|size) の深みへようこそ

元に戻って background-size の

auto 値の話

Page 89: background-(image|size) の深みへようこそ

画像の内在サイズが ない場合は 100% になる

Page 90: background-(image|size) の深みへようこそ

幅と高さの両方に 指定されていて

画像の内在サイズが ある場合は それが使われる

Page 91: background-(image|size) の深みへようこそ

画像の内在サイズが ない場合は contain になる

Page 92: background-(image|size) の深みへようこそ

https://jsfiddle.net/nkd3bu73/2/

Page 93: background-(image|size) の深みへようこそ

まとめ

Page 94: background-(image|size) の深みへようこそ

W3C の仕様と ブラウザの実装は 一部異なる場合がある

Page 95: background-(image|size) の深みへようこそ

CSS のプロパティと値の 書き方に気を使う

Page 96: background-(image|size) の深みへようこそ

クロスフェードアニメーション

.example  {      width:  400px;      height:  200px;      animation:  crossfade  5s  linear  0s  infinite  alternate;  }  

@keyframes  crossfade  {      0%  {          background-­‐image:  url("images/foo.png");      }      100%  {          background-­‐image:  url("images/bar.png");      }  }  

Page 97: background-(image|size) の深みへようこそ

Firefox 42.0a2

Page 98: background-(image|size) の深みへようこそ

変更後

.example  {      width:  400px;      height:  200px;      background-­‐image:  url("images/foo.png");      animation:  crossfade  5s  linear  0s  infinite  alternate;  }  

@keyframes  crossfade  {      0%  {          background-­‐image:  url("images/foo.png");      }      100%  {          background-­‐image:  url("images/bar.png");      }  }  

Page 99: background-(image|size) の深みへようこそ

http://jsfiddle.net/bo5rj0b5/15/

Page 100: background-(image|size) の深みへようこそ

Firefox 42.0a2

Page 101: background-(image|size) の深みへようこそ

とりあえず画像は表示される

Page 102: background-(image|size) の深みへようこそ

クロスフェードしたい場合は?

Page 103: background-(image|size) の深みへようこそ

擬似要素と opacity を 使う

Page 104: background-(image|size) の深みへようこそ

http://codepen.io/geckotang/pen/MagNoK?

editors=110

Page 105: background-(image|size) の深みへようこそ

background-image は 背景画像を指定する だけではなく

背景のレイヤーの数にも 影響する

Page 106: background-(image|size) の深みへようこそ

background-size の contain, cover は

同じように見えて違うので 使い分け大事

Page 107: background-(image|size) の深みへようこそ

皆さんも background-image

background-size

の深みに入りましょう

Page 108: background-(image|size) の深みへようこそ

ありがとうございましたhttps://twitter.com/kubosho_ https://github.com/kuboshohttp://blog.kubosho.com

Page 109: background-(image|size) の深みへようこそ

画像の引用元一覧 その一

• Cat show: Form | Flickr© Tomi Tapio K (CC-BY 2.0)https://www.flickr.com/photos/tomitapio/4305303148

• Nasty cat ! | Flickr© Hannibal Poenaru (CC-BY-SA 2.0)https://www.flickr.com/photos/poenaru/1304953088/

Page 110: background-(image|size) の深みへようこそ

画像の引用元一覧 その二

• Cat | Flickr© Chris Erwin (CC-BY 2.0)https://www.flickr.com/photos/crerwin/1089567053/

• Cat | Flickr© Martie Swart (CC-BY 2.0)https://www.flickr.com/photos/martie1swart/6297998606/