読者です 読者をやめる 読者になる 読者になる

スマホ対応を考える

概要

スマホでサイトが見れなければ意味が無い・・・と言ってもいいくらい、スマホからサイトを見ることは重要です。 これまでの知識を活かし、スマホでも見れるようにサイトを改造してみましょう。

アジェンダ

  • スマホで見た時にも崩れないような画面をつくる

ステップ

  • 以前作成したプロフィールページを題材にしてすすめる
  • スマホで見ても崩れないレイアウトに
    • CSS メディアクエリという技術を用いて、ブラウザ(キャンバス)の表示幅ごとにCSSをつくる

完成形

f:id:dorak:20160615192402p:plain

前提知識

HTMLのheadに次の記述を追加(CSSのリンクよりも上に書く)

<meta name="viewport" content="width=device-width, initial-scale=1.0"> これは、これからスマホ対応をしていく上で必要なコード。

メディアクエリ

メディアクエリとは、ブラウザの幅が今どれくらいかを取得する機能。 ここ超重要です。

例えば、みなさんはこのテキストをなんらかのブラウザで読まれていると思います。 Safariなのか、Chromeなのか、firefoxなのか・・・ そういったブラウザのサイト表示領域がブラウザの幅です。

メディアクエリは、この幅が今何pxかを計算してくれます。

ページの半分くらいまでブラウザを縮めているのであれば680pxくらい(適当)、画面いっぱいに広げていれば1365pxくらい、といったような感じです。

さて、これを使うとなぜスマホ対応出来るのか。

答えはブラウザの幅、という点です。

スマホでネットをするときも、ブラウザの幅という制約がつきまといます。 みなさんはスマホでもSafariChrome, または「ブラウザ」というアプリを使ってサイトを閲覧すると思いますが、そういったスマホも横幅を持っています。 これを、メディアクエリを使えば判定出来ます。幅が小さいからスマホだろう、というロジックですね。

メディアクエリってどう書くのか

メディアクエリはCSSファイルに書きます。

@media (min-width: 968px) {
  ここに、幅が968px以上のときのスタイルを書く
}

こう書きます。

意味を解説します。

@media と書くことによって、メディアクエリを使います!という宣言をしています。 次、@mediaのあとの (min-width: 968px) 。 これは見ての通りで、最低横幅が968pxのとき、という条件をつけています。

まとめると、

画面の最低横幅が968pxのとき、{}の中のcssを適用します

ということです! 一応実際のコードも載せときます。

@media (min-width: 968px) {
  .keyvisual {
    background-color: red;
  }
}

繰り返します。 @mediaでくくった中にいつも通りのCSSをかけば、条件に応じてCSSが出しわけられていきます。

上記は最低横幅が968pxのときでした。これはPCサイズですね。 では、968px以下、スマホのサイズはどうやって表現すれば良いのかというと、

@media (max-width: 967px) {
  967px以下の時のスタイル
}

こう書いてください。

すると、画面サイズが967px以下の時のスタイルを指定できます。

これで、

968px以上の時のスタイル

967px以下の時のスタイル

の書き方を学びました。これで、1つのHTMLで、画面サイズに応じて2パターンのデザインをつくれるということです。 968px以上の時はこのスタイル、967px以下の時はこのスタイル、といったように。

2つのデザインをつくることになるので、CSSは従来の2倍近く書かなければいけません。

さて、それでは実際に作っていきましょう。

ここから先はスマホの開発。Chromeを使いましょう。

Chromeには、スマホモードでサイトを表示できる便利機能がある

まずは、要素の検証を立ち上げます。 cmd + shift + cを押しましょう。(windowsctrl + shift + c)

f:id:dorak:20160615184419p:plain

右側の画面が立ち上がったと思います。 つぎに、下のスクショの赤枠でかこってあるボタンをクリックしてみてください。 f:id:dorak:20160615185045j:plain

こんな画面になるはずです。 f:id:dorak:20160615185603p:plain

これで、スマホのサイズ感で作業ができます。可能なら、ページ上部から横幅を320pxに設定しておきましょう。

さて、

CSSは次のようになります。

.cf:before,
.cf:after {
    content: " "; /* 1 */
    display: table; /* 2 */
}

.cf:after {
    clear: both;
}

/**
 * For IE 6/7 only
 * Include this rule to trigger hasLayout and contain floats.
 */
.cf {
    *zoom: 1;
}

* {
  box-sizing: border-box;
}

/*-----------ここからがPC版-----------------*/
@media (min-width: 968px) {
  ここに、今までのapp.cssの内容をコピー
}


/*--------ここからがスマホ版--------*/

@media (max-width: 967px) {
  スマホ用に新しくスタイルを作成
}

スマホ用に新しくスタイルを作成」の部分に、完成形となるようにCSSを入れていってみてください。

答えは以下です。 これコピペするだけじゃ力つかないので、どうしてこうなるのかをきっちり考えてみてください。

.cf:before,
.cf:after {
    content: " "; /* 1 */
    display: table; /* 2 */
}

.cf:after {
    clear: both;
}

/**
 * For IE 6/7 only
 * Include this rule to trigger hasLayout and contain floats.
 */
.cf {
    *zoom: 1;
}

* {
  box-sizing: border-box;
}

@media (min-width: 968px) {
body {
  position: relative;
}

.keyvisual {
  background-image: url(../images/covere.jpg);
  background-position: center center;
  background-repeat: no-repeat;
  background-size: cover;
  text-align: center;
  height: 420px;
}

.title {
  display: inline-block;
  background: rgba(255,255,255,.8);
  margin-top: 90px;
  padding: 64px;
  color: #757575;
}

.main_text {
  display: block;
  font-size: 32px;
  border-bottom: 3px solid #757575;
  margin-bottom: 48px;
}

.sub_text {
  font-weight: bold;
  font-size: 12px;
}

.works {
  width: 960px;
  margin: 32px auto;
}

.work {
  float: left;
  width: 25%;
  padding: 0 8px 16px;
  cursor: pointer;
}

.work:hover {
  opacity: .8;
}

.work img {
  width: 100%;
}


.work_title {
  color: #757575;
  float: left;
  font-size: 12px;
  padding-top: 2px;
}

.work_date {
  color: #757575;
  float: right;
  font-size: 10px;
  border: 1px solid #757575;
  padding: 2px 4px;
  border-radius: 2px;
}

.credit {
  background: #ddd;
  color: #757575;
  padding: 16px 0;
  text-align: center;
}

.modal {
  display: none;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0,0,0,.8);
}

.modal img {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%,-50%);
}
}


@media (max-width: 967px) {
body {
  position: relative;
}

.keyvisual {
  background-image: url(../images/covere.jpg);
  background-position: center center;
  background-repeat: no-repeat;
  background-size: cover;
  text-align: center;
  height: 420px;
}

.title {
  display: inline-block;
  background: rgba(255,255,255,.8);
  margin-top: 90px;
  padding: 64px;
  color: #757575;
}

.main_text {
  display: block;
  font-size: 32px;
  border-bottom: 3px solid #757575;
  margin-bottom: 48px;
}

.sub_text {
  font-weight: bold;
  font-size: 12px;
}

.works {
  width: 100%;
  margin: 32px auto;
}

.work {
  float: left;
  width: 50%;
  padding: 0 8px 16px;
  cursor: pointer;
}

.work:hover {
  opacity: .8;
}

.work img {
  width: 100%;
}


.work_title {
  color: #757575;
  float: left;
  font-size: 12px;
  padding-top: 2px;
}

.work_date {
  color: #757575;
  float: right;
  font-size: 10px;
  border: 1px solid #757575;
  padding: 2px 4px;
  border-radius: 2px;
}

.credit {
  background: #ddd;
  color: #757575;
  padding: 16px 0;
  text-align: center;
}

.modal {
  display: none;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0,0,0,.8);
}

.modal img {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%,-50%);
}
}

宿題!

最終課題です。 つくりたいサイトを考えてきてください。 最終的にネットで公開します。

題材は自由です。 PhotoshopIllustratorを用いて、つくりたいサイトをデザインしてきてください。