本文へスキップ

レスポンシブデザイン

 今年の2月に「スマホ対応」として、現在のPC用の画面をそのままスマホ向けにすべく、viewportの設定追加と、スマホ閲覧時だけ文字を大きくする改修を行いました。その結果、本文はスマホで読めるようにはなったものの、メニューや画像は小さいままですから、いずれは本格的なレスポンシブデザインへの移行を考えておりました。開設してから16年もたっているため、PC向けに作成済みのページが多くあり、当初はそれらを生かす方法を探っておりましたが、ホームページビルダーのテンプレートがレスポンシブになっていることがわかり、思い切って全面的に書き換えることにしました。トップページのみ移植した段階で、この書き換え作業は予想外に時間を要することがわかり、再びテーブル形式のPC画面を組み換えることもトライしたのですが、時間はかかってもテンプレートを使うのが確実ということで、現在もその移植作業を続けています。
 レスポンシブデザインへの移行過程で、テンプレートでは対応できないメニューや、CSSの基本的ルールを知らない故のトラブルがあり、それらをこのページにまとめておくことにしました。そんなわけで、ここに記載されたことは、ウェブデザイナーにとっては常識でしょうが、ホームページビルダーでwebページを作成する方々にとっては参考になるかもしれません。

1.階層メニューについて
 ホームページビルダーのテンプレートのメニューは、PCの場合は表題の下の横に並んだメニュー形式で、これが携帯の場合はいわゆるハンガーバー・ボタンとなり、ボタンを押すとメニューが表示されます。(言葉で説明するより、この画面をスマホの縦と横方向で表示していただくと、良くわかります)問題は、このホームページでは階層メニュー、すなわちメインメニューの下に、さらにサブメニューが展開されていることです。この作り方を探るべく、ネットで探した結果、PC表示についてはCSSのみで、スマホ表示時はjQueryを使ってスライドさせるのが良いことがわかりました。
 まず、PC表示の方ですが、これはドロップダウンメニューと呼ばれ、作り方はネット上に多くありますが、下記が分かりやすいと思います。
https://allabout.co.jp/gm/gc/23911/
 これを適用するにあたり、問題なのはテンプレートのどこを変更するかです。このためにはテンプレートの構成を解読する必要があり、それが改修に時間を要する大きな要因となりました。従って、ここではドロップダウンメニューそのものの作り方ではなく、テンプレートのどこを修正する必要があったかを記載することにします。

1.HTML:テンプレートのナビゲーションが<ul><li>の配列になっていますので、その下に<ul><li>を定義します。(下例は「オーディオ随想」のページ)

<ul>
<li><a href="gomirecord.html">レコードコンサート</a></li>
<li><a href="translation.html">日本語対訳</a></li>
<li><a href="smartphone.html">スマホ対応について</a></li>
<li><a href="electrician.html">電気工事士</a></li>
<li><a class="sub" href="#">TVライブラリー</a>
<ul class="submenu">
<li><a href="avsystem.html">システム整備編</a></li>
<li><a href="tvlibrary.html">コンテンツ編</a></li>
</ul>
</li>
</ul>

 要は<ul>を二段階にするだけ(更に階層を増やす場合も同様)ですが、ドロップダウンメニューに展開するメインメニューは"herf="#"とするのがコツです。これでマウスがホバーした時に色が変わるだけで、クリックしても何も変わりません。これに対応するCSSが下記です。すべてのサイトに共通なので、テンプレートに付いてくる"user.css"に、以下のように追記しました。注意すべきことは、一段メニューの下に配置するので、"position: absolute;"を追記することです。テンプレートのメニューと揃えるため、ドロップダウンメニューの縦幅は同じにしましたが、横幅は簡略化のため、170pxで統一しています。

2.ドロップダウンメニューのCSS:スマホ時には効かないように、サイズを規定しています。

@media screen and (min-width: 568px) {
#hpb-nav > ul > li > ul {
position:absolute;
width: 170px;
margin: 0;
padding: 0;
background-color: #F5F5F5;
border-top-with: 1px;
border top-stle: solid;
border-top-color: #CCCCCC;
display: none;
}
#hpb-nav > ul > li > ul >li {
width: 170px;
font-size: 13px;
line-height: 38px;
height: 38px;
border-bottom-with: 1px;
border bottom-stle: solid;
border-bottom-color: #CCCCCC;
}
#hpb-nav > ul > li:hover > ul {
display: block;
}
}

 上記はテンプレートの"container.css"の/*ナビゲーション*/の以下の記述と同じですが、メインメニューと違って、ブロック状に重ねて表示しますので、"float"は"block"に変更しています。また、オリジナルはoverflow:hiddenですが、これは"visible"に変えないとドロップダウンメニューが表示されません。

 #hpb-nav li{
 float: left;
 display: inline;
 font-size: 13px;
 line-height: 38px;
 height: 38px;
 overflow: visible;
 border-right-width: 1px;
 border-right-style: solid;
 border-right-color: #CCCCCC;
 }

 次にスマホ用のドロップダウンメニューですが、スマホの場合はアコーディオンメニューと呼ばれています。これもネットで探して、以下のやり方を踏襲しました。
https://bit.ly/3kggmoc
 jQueryの知識はまったくないのですが、テンプレートのJavaScript ファイルのうち、ナビゲーションのメニューをPCとスマホで切り替える"move-mainnav.js"があり、これに倣って、上記サイトのjQueryの部分を以下のように"accordion.js"として追加しました。

3.スマホ表示用のアコーディオンメニューのjQuery

$(function(){
if(window.matchMedia("(max-width:568px)").matches){
$('.sub').each(function(){
$(this).on('click',function(){
$("+.submenu",this).slideToggle(200)
$(this).toggleClass("on",200);
return false;
});
});
}
else{
if($(window).width()<=568){
$('.sub').each(function(){
$(this).on('click',function(){
$("+.submenu",this).slideToggle(200)
$(this).toggleClass("on",200);
return false;
});
});
}
}
})

 PCとスマホの切り替えに、"window"と"window.matchMedia"で二重に定義している理由はよくわかりませんが、恐らくホームページビルダーで検証する時に必要な記述と思われ、ロジックはオリジナルのものをそのままコピーしています。
 意外に手間取ったのは、アコーディオンの開閉を表示するアイコン(^)で、マウスをホバーした時に色を変えるようにする事例がなく、ここはひと工夫しています。下記がそのCSSです。

4.アコーディンメニューの開閉のアイコン

@media screen and (max-width: 568px)
{ #hpb-nav > ul > li > ul {
position:relative;
width: 100%;
margin: 0;
padding: 0;
border-top-with: 1px;
border top-stle: solid;
border-top-color: #CCCCCC;
display: none;
}
#hpb-nav > ul > li > ul >li {
width: 100%;
line-height: 1.4;
border-bottom-with: 1px;
border bottom-stle: solid;
border-bottom-color: #CCCCCC;
}
#hpb-nav > ul > li > a.sub {
display: block;
position: relative;
}
#hpb-nav > ul > li > a.sub:after {
content: "";
position: absolute;
right: 25px;
top: 30%;
transition: all 0.2s ease-in-out;
display: block;
width: 8px;
height: 8px;
border-top-style: solid;
border-top-width: 2px;
border-top-color: #666666;
border-right-style: solid;
border-right-width: 2px;
border-right-color: #666666;
-webkit-transform: rotate(135deg);
transform: rotate(135deg);
}
#hpb-nav > ul > li > a.sub.on:after {
-webkit-transform: rotate(-45deg);;
transform: rotate(-45deg);
top: 45%;
}
#hpb-nav > ul > li > a.sub:hover:after{
border-top-color: #FFFFFF;
border-right-color: #FFFFFF;
}
}

2.ホームページビルダーのテンプレートには上記のプルダウンメニューやアコーディオンメニューがなく、この作成に多大な時間を要しましたが、これ以外にもウェブデザインの知識がないゆえに手間取ったことが多々あります。以下ではこれらについて一部をご紹介します。

2.1 表題付き写真
 これもPCとスマホでの表示分けの問題ですが、表題付きの写真を二枚並べる場合、PCでは横に並ぶので関連付けは不要ですが、スマホ表示時には写真とその表題は一体にしておかないと、ばらばらになり、対応がつかなくなります。下記はイコライザーDG-68の例ですが、全体を<table>で囲み、セットとなる表題と画像を<div>で"imgbox"として定義し、一対で表示されるようにしています。

[HTML]

<table class="imgt">
<tr>
<td>
<div class="imgbox2">
<p class="p3">スムース・ボイシング(左)</p><img src="017DG682.jpg">
</div>
</td>
<td>
<div class="imgbox2">
<p class="p3">スムース・ボイシング(右)</p><img src="018DG682.jpg">
</div>
</td>
</tr>
</table>


[CSS]

/*テーブル要素*/
table.imgt{
margin-left: auto;
margin-right: auto;
border: none;
border-collapse: collapse;
border-spacing: 0;
padding: 0;
}
table.imgt td{
border: none;
border-collapse: collapse;
border-spacing: 0;
margin: 0;
padding: 0;
}

/*表題付き画像*/

.imgbox2{
display: block;
width: 310px;
height: 140px;
text-align: center;
}
.imgbox2 p.p3{
text-align: center;
margin-bottom: 0.5em;
margin-top: 0.5em;
}

2.2 見出しタグ h1~h6の扱い
 ホームページビルダーのテンプレートでは見出しタグ<h1>から<h4>が使われています。テンプレートはトップページとそれから呼び出されるページでデザインを分けています。一方、このホームページでは、既存のページのイメージを生かすべく、子ページも親ページと同じデザインにしています。このため、テンプレートのトップページデザイン定義(下記CSS参照)ではh2を使っていますが、このh2の定義がすべてのページについて必要になります。当初は見出しタグの使い方を知らずに、h3、h4、h5、h6と増やしていきましたが、h7でトップの画像が表示されなくなりました。ネットで調べたら、見出しタグはh6までしかないことが分かり、対策として、クラス分けを追加しました。これも体系的な知識がない故のトラブルです。

[テンプレートのトップページデザイン定義]

/* トップページ デザイン定義 */
.hpb-layoutset-01 #hpb-title h2{
margin: 0;
overflow: hidden;
text-indent: -9999px;
height: 235px;
background-image : url(top_mainimg_1A_011.png);
background-position: top center;
background-repeat: no-repeat;
}

2.3 その他
 こういう無知が招いたトラブルをあげていくときりがないのですが、classの定義はアルファベットを先にしないと認識しません。笑い話のようですが、数字を先に、例えばclass="802sd"とすると認識せず、機能しません。
 前回、文字サイズをレスポンシブにした時はブラウザの違いに悩まされましたが、今回は比較的トラブルは少ないのですが、やはりマイクロソフトのEdgeだけがCSSを反映しないことがありました。その場合、前回はHTMLに記載することで対応したのですが、今回の改定作業で、真の原因は過剰とも思えるEdgeのキャシュ機能にあることがわかりました。(詳細は次項参照ください)
 また文字サイズに関して、iPhone特有の事象ですが、横にすると文字が勝手に大きくなり、読みにくくなります。これもネットに出ている解決方法ですが、以下の記述を入れて縦横で変わらないようにしています。

body{
-webkit-text-size-adjust:100%;
}

3.まとめ
 冒頭書きましたが、テンプレートを使うことは便利な反面、カスタマイズにおいては最初はCSSのどこをいじれば良いのか見当もつきません。一方で、ゼロから作るよりも便利であることは言うまでもなく、特に背景画像などはグラデーション付きのものが用意されていて、素人にしては見栄えのよいデザインができます。また、以前のフォーマットでは、まずテーブルを作って、その中に画像、文章やメニューを入れていましたが、レスポンシブでは<div>で定義するだけなので、自由度があり、慣れるとこちらの方が扱いが容易です。

 Edgeで最も不可解なのはしつこいほどキャッシュが強固なことです。このHPでは、過渡期の措置として、以前のページを"old"のフォルダー内に残していますが、新デザインに更新しても、Edgeだけは以前の画面のままということが良くあります。Edgeのキャッシュが他のブラウザと比較していかに強固(ため込んでいる)かを示す例として、リンク先のファイルを消去してもなお、表示することがありました。その場合は「設定」でキャッシュの消去をしないと更新されません。表示の高速化が目的と思いますが、Google Chromeと比べても、行き過ぎと思います。(2021年9月)