レスポンシブ Web

 スマートフォンなどの普及で電子機器端末の画面サイズの多様化が進みました。それに伴って PC 画面を対象としていた Webサイトは、何れの端末でも見やすく作る必要性が生じています。
 その具体的な対応方法としては、
  1. それぞれのサイズに合った複数のページを作って置き、表示する端末のサイズ情報により切り替えて表示する。
  2. 一枚のページを、それぞれの端末サイズに合わせてその表示方法を自動的変えるように作る。
などの方法が考えられます。
 後者では更に、「JavaScript」などのプログラムによる方法と、「CSS3」による方法 (レスポンシブWebデザイン) が考えられます。
 ここでは、後者のレスポンシブ Webデザインについてみてみます。

■ レスポンシブ Webページ

 「レスポンシブWebデザイン」は、文章構造化された HTML 5 ページに、CSS 3 の メディアクエリ を使って行います。先ずは具体例で見てみます。
 以下の例は、PC用には行方向に並べた枠を、表示要素の幅が 400px以下の表示枠では列方向に並べるようにし、合わせて3番目の項目を先頭にするようにしています。

リスト

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <title>レスポンシブ Webページ</title>
  <style>
      .samp-flex { 
        width:98%; margin:0 auto; padding:2px;
        background:#eee; text-align:center;
        display:flex;
        flex-flow:row wrap;
      }
      .samp-item { 
        width:80px; margin:5px; padding:5px;
        background:#9e9; border-radius:5px;
      }
      .samp-item:nth-child(3) { background:#99e; }
      /* 以下でレスポンシブ適用 */
      @media screen and (max-width:400px){ 
        .samp-flex { width:150px; flex-direction: column; }
        .samp-item:nth-child(3) { order: -1; }
      }
  </style>
</head>
<body>
  <div class="samp-flex">
    <div class="samp-item">1</div>
    <div class="samp-item">2</div>
    <div class="samp-item">3</div>
    <div class="samp-item">4</div>
    <div class="samp-item">5</div>
    <div class="samp-item">6</div>
    <div class="samp-item">7</div>
  </div>
</body>
</html>

解説

 この例は、表示要素の幅が 400px以下とそれ以上の場合とで切り替えています
( 1行目) このレスポンシブ Webページは、HTML5 上で展開します
( 8行目) class=samp-flex のブロック内をフレックスコンテナとして使うこととします。参考
(11行目) そのためこのブロックをフレックスコンテナとすることを、display:flex; と記述します
(12行目) このフレックスアイテムは行方向に並べ、領域内で折り返しをすることを、flex-flow:row wrap; と記述します
(14行目) .samp-item がこの場合のフレックスアイテムです
(18行目) .samp-item の 3番目の背景色を #99eにしました
(20行目) 表示要素の幅が 400px以下の場合の CSS を指定します
(21行目) 表示幅が 400px以下の場合、コンテナの幅を 150px とし、フレックスアイテムは列方向に並べるよう指定しました
(22行目) 表示幅が 400px以下の場合、.samp-item の 3番目を最初に配置するようにしました

■ レスポンシブ Webページの作成

 以上で見たように「レスポンシブ Webページ」は、文章構造化されたページに、CSS の メディアクエリ を使って条件に応じて表示を変えます。
 その基本的なステップの概要とその参考サイトを下記に示します。
  1. レスポンシブの設計 適用する条件や、対象要素のレイアウトを設計します
  2. ブレークポイントの決定 CSSファイルを切り替え条件(表示幅値など)を決めます
  3. 文章を構造化する(CSSを適用しやすいように、文章等を構造化します)
  4. メディアクエリでCSSを切替 (メディアタイプに応じて適したスタイルシートを適用する)
  5. viewportの設定 viewportとは  Webデザイン  viewport 設定  ちゃんと理解する

■ レスポンシブ Web 関連リファレンス

■ レスポンシブ Webページの例

 以上の知識を基に、各条件を設定してサンプルを作ってみました
  1. 基本構想・・・・・・・・・・・・・・・・・・・・ 画面サイズによりナビゲーション表示を切り替えることとします
  2. レスポンシブの設計・・・・・・・・・・ 適用する条件や、対象要素のレイアウトを設計します
  3. ブレークポイント・・・・・・・・・・・  切り替え条件(表示幅)を、768px とします
  4. viewportの設定・・・・・・・・・・・・・ デバイス幅 に合わせ、初期ズーム倍率を1に指定
  5. 仕上げ・・・・・・・・・・・・・・・・・・・・・  具体的条件や、要素に合わせてレイアウトを調整します

    リスト

    <!DOCTYPE html>
    <html lang="ja">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Sample</title>
      <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
      
      <style>
        body,ul,li { margin: 0; padding: 0; background:#ffe; }
        ol, ul{ list-style:none; }
          header { color:#ccc; padding:6px; }
          #title { color:#900; min-height:40px; font-family:Comic Sans MS;
               font-size:36px; font-weight:bold; text-align:center; }
        .gnav-wrap{ box-sizing:border-box; position:fixed; top:0; width:100%; height:100px; background:#ffe; margin: 0 auto; }
        .gnav-btn { position:absolute; width:36px; height:30px; top:29px; left:3px; color:#333;
                line-height:32px; border-radius:4px; text-align:center; cursor:pointer;
                background:#4d8; font-size:28px; border:1px solid #fff; z-index:10; }
        .gnav-btn:hover{background:#4b8;}
        .highlight{color:#ffe;}
        .gnav { width:300px; z-index: 99; margin:0; padding:0; }
        .gnav ul{ padding-left:20px; }
        .gnav li { width:300px; padding:0px; background:transparent; border-radius:8px; }
        .gnav li a{ display:block; font-size:18px; color:#fff; text-decoration:none;
              background:#4b8; height:28px;
              margin:0px auto; padding:0px 3px 0; border-radius:8px; border:1px solid #fff; }
        .gnav a img { margin:0 auto; width:100%; height:27px; }
        .wrapper { box-sizing:border-box; padding:0 5px; margin:100px auto 0; }
        .gridWrap{ display:flex; flex-flow:row wrap; }
        .gridWrap article{ flex:1; padding:5px; width:100%; background:#fef; }
        .gridWrap .box{ width:100%; background:#eff; text-align:center; }
        .gridWrap img{ width:150px; height:100px; }
        .gridWrap p{ text-align:left; }
        /* --- menu  *** PC用 -------------------------------- */
        @media only screen and (min-width:768px){
          .wrapper { width:800px; }
          .gnav-btn { display:none; }
          .gnav { width:760px; display:flex; margin:0 auto; }
          .gnav li{ flex:1; position:relative; }
          .gnav li a{ font-size:16px; padding:3px 0 0 5px; height:26px; }
          .gnav li a img { transform: translate(-2px,-2px); height:27px; }
          .gnav li ul { position:absolute; top:100%; width:100%; margin:1px 0 0 0; padding:0px; }
          .gnav li ul li { overflow:hidden; width:100%; height:0; color:#ffe; transition:0.4s; }
          .gnav li:hover>ul>li{ overflow:visible; height:29px; z-index:2; }
          .gnav li ul li ul { top:0; left:100%;}
          .gnav li:hover > a { background:#30b9ba; }
          .gnav li:hover li > a {  background:#30b9ba; }
          .gnav li:hover li:hover > a { background:#80b9ba; }
          .gnav>li:last-child>ul>li>ul {left: -100%; width: 100%;}
          .gnav>li:nth-last-child(2) ul li ul {left: -100%; width: 100%;}
          .gnav li ul li ul:before {
                 position:absolute; content: ""; top:6px; left:-12px; width: 0;
                 height: 0; border: 8px solid transparent; border-left-color: #eee; }
          .gnav>li:last-child ul li ul:before, ul.gnav>li:nth-last-child(2) ul li ul:before {
                 position: absolute; content: ""; top:6px; left:198%; margin-left: -20px;
                 border: 8px solid transparent; border-right-color:#eee; }
        }
       /* パッド以下用 --------------------------------*/
       @media only screen and (max-width:767px){
           .wrapper { margin-top:70px; }
           .gnav-wrap{ height:70px; }
           .gnav { display:none; padding:0px; }
           .gnav>li { width:90%; padding:0px; background:transparent; border-radius:8px; }
           .gnav li li>a:before { content:"・"; }
           .gnav li li li>a:before { content:"・・"; }
           .gnav li:hover> a { background:#80b9ba; }
           .gridWrap .box{ width:160px; }
        }
      </style>
      <script>
        $(function() {
          $('.gnav-btn').on('click', function() {
            $(".gnav").slideToggle();
              $(this).toggleClass("highlight");
          }); 
        });
      </script>
    </head>
    <body>
      <div class="gnav-wrap">
        <header>
            <div class="gnav-btn" id="gnav-btn" title="メニューボタン">☰</div>
            <div id="title">web sample</div>
        </header>
        <nav class="toggle">
          <ul class="gnav">
                <li><a href="https://kurage.ready.jp/index.html" title='top page'><img src='./LOyuki14.gif'></a>
                  <ul class="gnav-ul">
                    <li><a href="../../../it14/it14.html">it入門</a></li>
                    <li><a href="../../../micro/micro.html">マイクロ波回路</a>
                      <ul>
                        <li><a href="../../../micro/ckt.html">マイクロ波回路</a></li>
                        <li><a href="../../../micro/bunpu.html">分布定数回路</a></li>
                        <li><a href="../../../micro/spara.html">Sパラメータ</a></li>
                        <li><a href="../../../micro/wave.html">波動アニメ</a></li>
                      </ul>
                    </li>
                    <li><a href="../../../jhp_g/smaph/smUse.html">格安スマホ</a>
                          <ul>
                            <li><a href="../../../jhp_g/smaph/smPage.html">スマホ用ページ</a></li>
                            <li><a href="../../../jhp_g/smaph/gai-sim.html">海外で使う</a></li>
                            <li><a href="../../../jhp_g/smaph/battery.html">スマホの電池</a></li>
                          </ul>
                    </li>
                    <li><a href="../../../keitsui/keitsui.html">神経根症</a></li>
                    <li><a href="../../../implant/implant.html">インプラント</a></li>
                  </ul>
                </li>
                <li><a href="sample.html">海外旅行記</a>
                  <ul class="gnav-ul">
                    <li><a href="../../../jsisen/jsisen.html">中国四川省</a>
                      <ul>
                        <li><a href="../../../jsisen/jkyusai/jkyusai.html">九寨溝</a></li>
                        <li><a href="../../../jsisen/jkouryu/jkouryu.html">黄龍</a></li>
                        <li><a href="../../../jsisen/jpanda/jpanda.html">パンダセンター</a></li>
                      </ul>
                    </li>
                    <li><a href="../../../jkeirin/jkeirin.html">桂林・張家界</a>
                      <ul>
                        <li><a href="../../../jkeirin/jrikou/jrikou.html">漓江下り</a></li>
                        <li><a href="../../../jkeirin/jchokakai/jchokakai.html">張家界</a></li>
                      </ul>
                    </li>
                    <li><a href="../../../jrocky/canadaw.html">カナダ西部</a>
                      <ul>
                        <li><a href="../../../jrocky/rocky.html">カナダロッキー</a></li>
                      </ul>
                    </li>
                    <li><a href="../../../jsafrc/jsafrc.html">南部アフリカ</a>
                      <ul>
                        <li><a href="../../../jsafrc/victoria.html">ビクトリア滝</a></li>
                        <li><a href="../../../jsafrc/chobe-PK.html">チョベ国立公園</a></li>
                      </ul>
                    </li>
                    <li><a href="../../../je_asia/e_asia.html">東南アジア</a>
                      <ul>
                        <li><a href="../../../je_asia/angkor1.html">アンコールワット</a></li>
                        <li><a href="../../../je_asia/hanoi.html">ハノイ</a></li>
                      </ul>
                    </li>
                    <li><a href="../../../indnesa/indnesa.html">インドネシア</a>
                      <ul>
                        <li><a href="../../../indnesa/jogj.html">ジャワ島</a></li>
                        <li><a href="../../../indnesa/bali.html">バリ島</a></li>
                      </ul>
                    </li>
                    <li><a href="../../../jneuro/jneuro.html">北欧旅行</a>
                      <ul>
                        <li><a href="../../../jneuro/norway.html">ノルウェー</a>
                          <ul>
                            <li><a href="../../../jneuro/fjord.html">フィヨルド</a></li>
                          </ul>
                        </li>
                        <li><a href="../../../jneuro/denmark.html">デンマーク</a></li>
                      </ul>
                    </li>
                    <li><a href="../../../india/india.html">インド</a>
                      <ul>
                        <li><a href="../../../india/delhi.html">デリー</a></li>
                        <li><a href="../../../india/vara.html">ワラナシー</a></li>
                        <li><a href="../../../india/agra.html">アグラ</a></li>
                        <li><a href="../../../india/jaipur.html">ジャイプール</a></li>
                      </ul>
                    </li>
                    <li><a href="../../../jnzld/jnzld.html">ニュージーランド</a></li>
                  </ul>
                </li>
                <li><a href="sample.html">国内旅行記</a>
                  <ul class="gnav-ul">
                    <li><a href="../../../jhokkai/jhokkai.html">北海道</a>
                      <ul>
                        <li><a href="../../../jtaisetu/taisetu.html">紅葉の大雪山</a>
                          <ul>
                            <li><a href="../../../jtaisetu/taisetu.html#jiki">紅葉の推移</a></li>
                            <li><a href="../../../jtaisetu/taisetu.html#nen">旭岳の一年</a></li>
                          </ul>
                        </li>
                        <li><a href="../../../jrisiri/risiri.html">利尻・礼文</a></li>
                      </ul>
                    </li>
                    <li><a href="../../../jfuji/fuji.html#fuji">富士山</a></li>
                    <li><a href="../../../jkouran/kouran.html">紅葉の香嵐渓</a></li>
                    <li><a href="../../../jkyoto/kyoto.html">京都の秋</a></li>
                    <li><a href="../../../jfujien/fujien.html">富士霊園の花</a></li>
                    <li><a href="../../../jtanzawa/tanzu.html">丹沢の風景</a></li>
                  </ul>
                </li>
                <li><a href="../../../jhp_g/hp_g.html">HPを作る</a>
                  <ul class="gnav-ul">
                    <li><a href="../../../jhp_g/kiso/kiso0.html">HPの基礎</a>
                      <ul>
                        <li><a href="../../../jhp_g/kiso/url.html">URL・IPアドレス</a></li>
                        <li><a href="../../../jhp_g/kiso/net.html">internet回線</a></li> 
                      </ul>
                    </li>
                    <li><a href="../../../jhp_g/kiso/flow.html">作成フロー</a>
                      <ul>
                        <li><a href="../../../jhp_g/kiso/kiso1.html">作成準備</a></li>
                        <li><a href="../../../jhp_g/kiso/kiso2.html">作ってみる</a></li>
                        <li><a href="../../../jhp_g/kiso/trans.html">公開する</a></li>
                        <li><a href="../../../jhp_g/kiso/kiso4.html">実用的ページ</a></li>
                        <li><a href="../../../jhp_g/zero/zero01.html">ゼロから始める</a>
                          <ul>
                            <li><a href="../../../jhp_g/zero/zero02.html">ゼロから始める 2</a></li>
                            <li><a href="../../../jhp_g/zero/zero03.html">ゼロから始める 3</a></li>
                            <li><a href="../../../jhp_g/zero/zero04.html">ゼロから始める 4</a></li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                    <li><a href="../../../jhp_g/syoho/syoho1.html">htmlの初歩</a>
                      <ul>
                        <li><a href="../../../jhp_g/syoho/syoho3.html">画像の貼付け</a></li>
                        <li><a href="../../../jhp_g/syoho/syoho5.html">LINKを貼る</a></li>
                        <li><a href="../../../jhp_g/kiso/trans.html">公開する</a></li>
                        <li><a href="../../../jhp_g/kiso/kiso4.html">実用的ページ</a></li>
                        <li><a href="../../../jhp_g/tegaru/us_sft.html">手軽に作る</a>
                          <ul>
                            <li><a href="../../../jhp_g/tegaru/us_wd.html">ワードで作る</a></li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                    <li><a href="../../../jhp_g/susumu/xml.html">HTMLを超える</a>
                      <ul>
                        <li><a href="../../../jhp_g/html5/html5.html">Html 5</a>
                          <ul>
                            <li><a href="../../../jhp_g/html5/respons.html">レスポンシブ Web</a></li>
                            <li><a href="../../../jhp_g/html5/flexbox.html">flex box</a></li>
                            <li><a href="../../../jhp_g/html5/canvas.html">canvas でグラフ</a>
                              <ul>
                                <li><a href="../../../jhp_g/html5/g-chart.html">Google Chart</a></li>
                                <li><a href="../../../jhp_g/html5/d3chart.html">D3 チャート</a></li>
                                <li><a href="../../../jhp_g/html5/dygraph.html">dygraph</a></li>
                                <li><a href="../../../jhp_g/html5/chartjs.html">Chart.js</a></li>
                              </ul>
                            </li>
                          </ul>
                        </li>
                        <li><a href="../../../jhp_g/style/style1.html">CSSの基礎</a></li>
                        <li><a href="../../../jhp_g/jsct/gainen.html">JavaScript</a>
                          <ul>
                            <li><a href="../../../jhp_g/jsct/gainen.html">J.Scriptの概念</a></li>
                            <li><a href="../../../jhp_g/jsct/jquery.html">jQueryを使う</a></li>
                          </ul>
                        </li>
                        <li><a href="../../../jhp_g/susumu/cgiset.html">CGIを設置する</a></li>
                      </ul>
                    </li>
                    
                  </ul>
                </li>
                <li><a href="../../../w_map/w_map.html">WebMapを使う</a>
                  <ul class="gnav-ul">
                    <li><a href="../../../w_map/ex-gm3.html">Google Map v.3</a></li>
                    <li><a href="../../../w_map/ex-gs2.html">GoogleMapsStatic</a></li>
                    <li><a href="../../../w_map/ex-ymap1.html">Yahoo! JS Map</a></li>
                    <li><a href="../../../w_map/ex-ymaps.html">Yahoo!map Static</a></li>
                    <li><a href="../../../w_map/ichi.html">位置情報と連携</a>
                      <ul>
                        <li><a href="../../../w_map/logger.html">GPSロガー</a></li>
                        <li><a href="../../../w_map/camera.html">GPSカメラ</a></li>
                        <li><a href="../../../w_map/riyou.html">マップ利用</a></li>
                      </ul>
                    </li>
                  </ul>
                </li>
              </ul>
        </nav>
      </div>
      
      <div class="wrapper">
        <section class="gridWrap">
          <article class="grid">
            <div class="box">
              <img src="../../../img/IMGP0962s.jpg" alt="" />
              <h3>海外旅行のページ</h3>
              <p>海外旅行記のページです。 …</p>
              <p class="readmore"><a href="sample.html">詳細を確認する</a></p>
            </div>
          </article>
          <article class="grid">
            <div class="box">
              <img width="150" height="100" src="../../../img/y21c3s.jpg" alt="" />
              <h3>国内旅行のページ</h3>
              <p>国内旅行記のページです。 …</p>
              <p class="readmore"><a href="sample.html">詳細を確認する</a></p>
            </div>
          </article>
          <article class="grid">
            <div class="box">
              <img width="150" height="100" src="../../../img/HPwebs.gif" alt="" />
              <h3>HP作成のページ</h3>
              <p>HP作成に関するページです。 …</p>
              <p class="readmore"><a href="sample.html">詳細を確認する</a></p>
            </div>
          </article>
          <article class="grid">
            <div class="box">
              <img width="150" height="100" src="../../../img/w_maps.gif" alt="" />
              <h3>Web map の作成</h3>
              <p>Web map 作成のページです。 …</p>
              <p class="readmore"><a href="sample.html">詳細を確認する</a></p>
            </div>
          </article>
        </section>
        <hr>
        <footer>
          このページはレスポンシブ Webページの一例です
        </footer>
      </div>
    </body>
    </html>
    

    解説

    ( 1行目) このレスポンシブ Webページは、HTML5 上で展開します
    ( 7行目) プルダウンメニューでjqueryを使うので呼び込みます
    (16行目) class=gnav-btn のブロックを狭幅時のプルダウンメニューボタンとして使うこととします。
    (29行目) class=gridWrap のブロックをフレックスコンテナとして使うこととします。配置方向は横方向・折返し可(row wrap)です。参考
    (30行目) フレックス幅は1とします
    (35行目) ウインド幅768px以上のスタイルを指定します
    (37行目) プルダウンメニューは非表示です
    (38行目) class=gnav のナビをフレックスで表示します
    (49-50行) class=gnav の最終&最終前ナビのプルダウンメニューを左に表示します
    (59行目) ウインド幅767px以下のスタイルを指定します
    (62行目) 狭幅ではclass=gnav のナビを非表示にします
    (71-76行) class=gnav-btn をクリックしたとき、プルダウンメニューを表示するようにしました
    (82行目) メニューボタンを配置しました
    ( 85-269行) ナビメニューを記述しました
    (272-310行) 本文を記述しました

■ その他のサンプル

■ 参考サイト