webコンテンツを徹底強化!WordPressサイト制作とプラグイン&テーマ情報・メンテ/エラー対応から、PHP/CSS/javascript、動画・音・イラスト等制作まで扱うコラム
マルチメディアコンテンツ制作読んどけ☆コラム

【jQuery不使用・軽量でお洒落】CSSのみで、タップでふわっと広がって透けるスマートフォンメニューを実装

      2021/02/23

【jQuery不使用・軽量でお洒落】CSSのみで、タップでふわっと広がって透けるスマートフォンメニューを実装

今回は、CSSのみで動作する、軽量でお洒落なスマートフォンメニューをサイトに実装してみたいと思います。 いままでだと、jQuery(javascriptライブラリ)とかで動かすことが多かった動くメニューですが、最近ではCSS3のアニメーション機能が充実しているので、CSSでやってみます。さっそく、見ていきましょう。

なぜ、jQueryではなくCSSのみで、タップでふわっと広がって透けるスマートフォンメニューを行うか?

jQueryでタップで開くスマホメニューは、このサイトにも実装されていました。最近、いままでなんとなく利用していたjQueryについて調べたところ、『ちょっとした機能ならば、CSSで代用できるんではないか?』と推測しました。

また、自分のサイト(このサイトなど)で、『jQueryはスマホアコーディオンメニューくらいしか使っていないのに、jQueryを何回も読み込むのは、リソース的に無駄が多いかな』と思ったこともあり、CSSの短いコードでやろうと思ったわけです。もちろん、jQueryが必要な機能をいっぱい実装したいときは、jQueryを使うべきですが。

CSSのみで、タップでふわっと広がって透けるスマートフォンメニュー実装例

ブラウザ表示例(ユーザーエージェントをスマートフォンに)

そんな感じで、サクッと作ってみました。このぶろぐについています。メニューは全部CSSですが、ユーザーエージェント判定の部分のみPHPです。 通常はこんな感じのメニューで・・・

メニュー部分をタップすると、ふわっと現れます。重なって透ける機能もつけてみました。ちょっとお洒落かもしれません。

実際のコード&ポイント

ポイントはcheckboxでクリック判定(ただし、チェック機能は使わないからdisplay: none;)、 transitionで時間指定、開いたメニューはposition指定してz-indexで重ねる(z-indexがうまく動かないときには、position指定が適切でない場合が多い)、opacityで透けさせる(checkedのとき、visibility: visible;にして、opacity: 0.9くらいにすると、ちょっと透ける)といったところです。

参考になったコード(CodePen/Pure CSS Accordion)

参考にしたコードは、海外のプログラムのコードなどを共有・紹介するサイト『CodePen』にあった『Pure CSS Accordion』でした。 アコーディオンみたいに開くタイプだったんだけど、『これメニューに使えんじゃね?』ってことで、特に『チェックボックスをクリック判定に使う』みたいなポイントで参考に。リストタグで項目を複数入れることにより、メニューみたいに機能するようになりました。

メリットは?→jQueryやプラグインカットで、サイトのファイルサイズ縮小とお洒落感を両立!

もちろん、見た目以外のメリットもあります。このサイトはWPテーマ・昔のstingerを改造して作っていますが、このテーマではアコーディオンメニューを動かすのに、『jQuery&base.js』を読み込まなければなりません。 footer.phpやfunctions.phpにjQuery&base.jsを読み込むようになってたので、CSSのみで実装できれば、これらをカットできます

さらに、wordpressということから、JavaScript読み込み調整系のプラグインもカットできます(jQueryが無いので、使う必要がない)。 『Speed Up - JavaScript To Footer』などをカットしたので、アクティブなプラグインは4つだけになりました。そういう取り組みを積み重ねた結果・・・・

シンプルで地味目な、デフォルトテーマtwenty seventeenで、(seoちぇきで計測)サイトのファイルサイズ229.6KB・読み込み2.427秒だったのが

ファイルサイズ53.4KB・読み込み1.452秒みたいに。コードのシンプルさは最近のstingerよりシンプルかもしれません。

確認できた不具合・難点~swiper(jqueryのスライダープラグイン)が上に重なる

javascriptを使わないので超軽いのがメリットの、このタイプのメニューですが、もちろん難点もありました。

『positionやz-indexで重ねている』ので仕方ない部分もありますが、管理人が確認したところだと・・・ swiper(jqueryのスライダープラグイン)の画像にメニューが重なってしまうというのがありました。イメージはこんな感じです swiperも『positionやz-indexで重ねている』という部分が見受けられ、これだとメニューのうえにスライダー画像が重なって操作できなくなります。 (また、実装してみたサイトに、CSSフレームワーク向けの独自クラスに、position指定が多かった。そのほかtransformなどの影響もあるかもしれません。)

対処としては、CSSチェックボックスの上に重ねるメニューではなく、『javascriptでクリック開閉式メニュー』にする事で対応しました。

まとめ・覚えておきたいポイント(CSS)

  • jQueryじゃなくてCSSでも、簡単なアニメーションはできる
  • checkboxでクリック判定をすることができる(display: none;だと見えない)
  • transitionで時間指定して、動きをつける
  • position指定してz-indexで上に重ねることができる
  • opacityで透けさせることができる
  • jQueryなどの読み込みが減る分、ファイルサイズが小さく、読み込みも早くなる
  • position指定してz-indexで上に重ねるプラグイン・フレームワーク利用時は、干渉に注意

といったところでしょうか。jQueryやCSSでできるポイントをしっかり見極めると、ファイルサイズを削ってリソース節約しつつ、ちょっと洒落たサイトにできるかと思いますので、皆さんもぜひチェックしてみてください。


【カテゴリ】 - CSS
【タグ】 -

  関連記事

CSSのみで超軽量な、クリック開閉式ボックスのつくりかた【FAQやよくある質問に・jQuery/javascript不使用】

今回は、管理人がリメイクしていたサイトで、『CSSだけでクリック ...

【CSS】横並びメニューで、最初だけボーダー無しとかにしたい場合は?→擬似クラスfirst-childを、効かない例も紹介

今回は、『メニューなどで、最初の要素だけボーダー無しにしたい』み ...

cssフレームワーク利用サイトで、意図しないpaddingなどを消すには?→同クラス上書き(例:bootstrap)

今回は、CSSフレームワークなどを使ってサイトを構築していると、 ...

【CSSエディット】『 』みたいな空白スペース・改行タグでレイアウト調整が良くない理由

今回は、管理人がこのサイト(よんどけコラム)のCSSを調整してい ...

【CSS・hover/transition/rotateでアニメーション】jquery無し・アイコン画像や要素をくるっと回転させる機能を実装

今回は、当サイトでもよく取り上げているCSSを使ったアニメーショ ...

【CSSオンリー・超軽量】JavaScriptすら使わない!CSSだけで動くスライダー作ってみた(PC向け横長レイアウト)

今回は、一般的には『クソ重い』とされる、スライダー・スライドショ ...

【スマホ対応サイト】レスポンシブで、スマホからアクセスしたときに横にずれる・ディスプレイ領域の外にはみ出る現象を直したい

今回は、スマホ対応や管理をしやすくするためにレスポンシブにしたは ...