レスポンシブ対応ドロップダウン&ドロワーメニュー
Javascriptを勉強していく中で、今までどうしても自分の鬼門だったレスポンシブ対応のメニューを作ってみることにしました。
PCでは下層メニューがドロップダウンし、スマホではハンバーガーボタンからメニューがスライドインするドロワーメニューになるものです。
ネット上でさがせばいろいろ出てくるのですが、上の条件を完全に満たすものは案外すくなく、ソースも複雑なものが多いです。
それなら自分が納得する形で、ゼロから作ってみようと思いました。
作ってみなければわからない点がいくつもありました。
なかでも一番大きな点は、下層メニューを展開させるイベントは、PCとスマホで別に設定しておく、というところ。
第1階層のメニューをクリックすると下層メニューが展開するのであれば条件分岐は必要ないと思いますが、PCではちょっと不親切に感じたので、hover状態で展開するようにしました。
すると、スマホでは下層メニューが開けなくなりました。スマホにはhover状態がないので当然ですね。
このことから、PCではjqueryの.hover()、スマホでは.click()が必要で、そのためにはif文で画面幅を取得して条件分岐する必要がある、とはじめてわかりました。
慣れた人なら当然のことかもしれませんが、他人のソースを読んでいるだけの初心者にはピンときません。自分で作ってみると納得できます。
試行錯誤のうえ、ひとまず動作するようになったソースが以下です。
※初心者の試作メモなので動作は保証しません。つっこみどころ満載だと思いますが、つっこまれてもたぶん対応できません。。あしからず。
●HTML
- <div class="nav-wrap">
- <p class="btn-hb">
- <span></span>
- <span></span>
- <span></span>
- <span>MENU</span>
- </p>
- <nav id="nav-main">
- <ul class="list-root">
- <li class="list-item"> <a class="lv1" href="index.html"><span>MENU1</span></a></li>
- <li class="list-item btn">
- <a class="lv1" href="page1.html"><span>MENU2</span></a>
- <ul class="list-child">
- <li class="sp"><a href="page2.html">MENU2-1</a></li>
- <li><a href="page2.html#main">MENU2-2</a></li>
- <li><a href="page2.html#works">MENU2-3</a></li>
- <li><a href="page2.html#flow">MENU2-4</a></li>
- </ul>
- </li>
- <li class="list-item btn">
- <a class="lv1" href="page3.html"><span>MENU3</span></a>
- <ul class="list-child">
- <li class="sp"><a href="page3.html">MENU3-1</a></li>
- <li><a href="page3.html#about">MENU3-2</a></li>
- <li><a href="page3.html#gaiyou">MENU3-3</a></li>
- <li><a href="page3.html#staff">MENU3-4</a></li>
- </ul>
- </li>
- <li class="list-item"> <a class="lv1" href="page4.html"><span>MENU4</span></a> </li>
- </ul>
- </nav>
- </div>
●Javascript
- // PC: hover / dropdown menu
- var w = $(window).width();
- var x = 767;
- if (w > x) {
- //console.log("767pxより大きい画面");
- $(".list-item.btn").hover(
- function(){
- $(this).children(".list-child").show(200,"linear");
- },
- function(){
- $(this).children(".list-child").hide();
- });
- } else {
- //console.log("767pxより小さい画面");
- $(".list-item.btn").on("click",function(e){
- e.preventDefault();
- $(this).children(".list-child").slideToggle();
- });
- $('.list-child li').click(function(event){
- event.stopPropagation();
- });
- }
- // SP: hamburger menu / drawer menu
- $(".btn-hb").on("click",function(){
- $(".btn-hb,#nav-main").toggleClass("show");
- });
●CSS
- @charset "UTF-8";
- /* ------------------------
- レスポンシブメニュー
- (ドロップダウン&ドロワー)
- ------------------------- */
- /* line 12, ../scss/respmenu.scss */
- .nav-wrap {
- text-align: center;
- background-color: #333;
- -moz-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.2);
- -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.2);
- box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.2);
- filter: progid:DXImageTransform.Microsoft.Shadow(color="#d9d9d9", Direction=145, Strength=5);
- padding: 0;
- margin: 0;
- z-index: 10; }
- /* line 21, ../scss/respmenu.scss */
- .nav-wrap .btn-hb span {
- display: none; }
- /* line 26, ../scss/respmenu.scss */
- .nav-wrap #nav-main {
- width: 1080px;
- margin: 0 auto; }
- /* line 29, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root {
- -js-display: flex;
- display: -webkit-box;
- display: -ms-flexbox;
- display: -webkit-flex;
- display: flex;
- -webkit-align-items: center;
- -ms-align-items: center;
- align-items: center;
- -webkit-box-pack: center;
- -moz-box-pack: center;
- -ms-flex-pack: center;
- -webkit-justify-content: center;
- -ms-justify-content: center;
- justify-content: center;
- -webkit-flex-wrap: wrap;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap; }
- /* line 34, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item, .nav-wrap #nav-main .list-root .list-item .list-child li {
- width: 165px;
- position: relative;
- height: 68px; }
- /* line 38, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item a, .nav-wrap #nav-main .list-root .list-item .list-child li a {
- display: block;
- width: 100%;
- margin: 18px 0;
- padding: 0 5px;
- line-height: 1.6;
- height: 32px;
- font-size: 100%;
- color: #fff;
- font-weight: bold;
- text-decoration: none; }
- /* line 50, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item a.lv1 {
- border-right: 1px solid #fff; }
- /* line 52, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item a.lv1:hover span {
- border-bottom: 2px solid #fff; }
- /* line 56, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item:last-of-type a.lv1, .nav-wrap #nav-main .list-root .list-item .list-child li:last-of-type a.lv1 {
- border-right: 0; }
- /* line 59, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item .list-child, .nav-wrap #nav-main .list-root .list-item .list-child li .list-child {
- display: none;
- min-width: 165px;
- position: absolute;
- top: 68px;
- z-index: 9999;
- background-color: rgba(0, 0, 0, 0.8); }
- /* line 68, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item .list-child li {
- padding: 0;
- margin: 0;
- height: auto;
- border: 1px solid #666; }
- /* line 74, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item .list-child li:hover {
- background-color: #000; }
- /* line 77, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item .list-child li a {
- display: block;
- padding: 10px;
- margin: 0;
- height: auto;
- font-weight: normal; }
- @media only screen and (max-width: 1080px) {
- /* line 91, ../scss/respmenu.scss */
- .nav-wrap #nav-main {
- width: 100%; }
- /* line 94, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item, .nav-wrap #nav-main .list-root .list-item .list-child li,
- .nav-wrap #nav-main .list-root .list-item li .list-child {
- width: 15.2777777778%; } }
- @media only screen and (max-width: 1080px) and (max-width: 767px) {
- /* line 12, ../scss/respmenu.scss */
- .nav-wrap {
- position: fixed; }
- /* line 103, ../scss/respmenu.scss */
- .nav-wrap .btn-hb {
- position: fixed;
- top: 10px;
- right: 10px;
- width: 40px;
- height: 48px;
- z-index: 13;
- padding: 2px;
- cursor: pointer;
- background-color: rgba(255, 255, 255, 0.8);
- text-align: center; }
- /* line 114, ../scss/respmenu.scss */
- .nav-wrap .btn-hb span {
- display: block;
- width: 100%;
- height: 5px;
- background-color: #333; }
- /* line 119, ../scss/respmenu.scss */
- .nav-wrap .btn-hb span:nth-of-type(1), .nav-wrap .btn-hb span:nth-of-type(2) {
- margin-bottom: 5px; }
- /* line 121, ../scss/respmenu.scss */
- .nav-wrap .btn-hb span:nth-of-type(3) {
- margin-bottom: 5px; }
- /* line 122, ../scss/respmenu.scss */
- .nav-wrap .btn-hb span:nth-of-type(4) {
- font-size: 1.8vw;
- line-height: 1.4;
- background-color: transparent; }
- /* line 129, ../scss/respmenu.scss */
- .nav-wrap #nav-main {
- position: fixed;
- top: 40px;
- right: -200px;
- width: 200px;
- background-color: rgba(0, 0, 0, 0.8);
- z-index: 15;
- opacity: 0;
- -webkit-transition: all 400ms;
- transition: all 400ms; }
- /* line 139, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root {
- position: static;
- border: 0;
- padding: 0;
- margin: 0; }
- /* line 144, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item, .nav-wrap #nav-main .list-root .list-item .list-child li {
- width: 100%;
- margin: 0;
- padding: 0;
- height: auto;
- border-bottom: #ccc; }
- /* line 150, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item a.lv1 {
- margin: 0;
- padding: 1em;
- height: auto;
- text-align: left;
- border-right: none; }
- /* line 156, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item a.lv1:hover {
- background-color: #000; }
- /* line 158, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item a.lv1:hover span {
- border-bottom: 0; }
- /* line 163, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item .list-child, .nav-wrap #nav-main .list-root .list-item .list-child li .list-child {
- width: 100%;
- position: static;
- -webkit-transition: all 150ms;
- transition: all 150ms;
- background-color: transparent; }
- /* line 169, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item .list-child li {
- position: static;
- height: 50px;
- padding: 0;
- border: none; }
- /* line 174, ../scss/respmenu.scss */
- .nav-wrap #nav-main .list-root .list-item .list-child li a {
- width: 100%;
- padding: 15px 1em 15px 1.5em;
- margin: 0;
- z-index: 16;
- text-align: left;
- color: #fff;
- font-weight: normal; }
- /* line 188, ../scss/respmenu.scss */
- .nav-wrap #nav-main.show {
- opacity: 1;
- transform: translateX(-200px); } }
- /*# sourceMappingURL=respmenu.css.map */
javascript
今更ながらJavascriptの勉強をはじめました。
これまでは、ネットに落ちてるライブラリをコピペして、部分的にいじるくらいしか経験がなくても、騙しだましやってこれてしまいました。
でもその程度の知識では、何かあった時にはどうにもならなくなりそうで、常に消化不良のまま。他人のコードやライブラリの手直しで試行錯誤するこのではなく、ちゃんと意味をわかってコードを書けていたら気持ちいいだろうな~、というのが出発点です。
どうせなら、初心者の初心者レベルから徹底的に学びなおそうと思いました。
ひとまずUdemyの初心者向け講座で全体を把握するつもりでしたが、途中からついていけなくなり、これはいくら何でもまずい!と慌てだしたところです。
Vue.jsのようなフレームワークを使うにしても、jQueryやReact.jsのようなライブラリを使いこなすにしても、Typescriptのような注目の言語をかじるにしても、まずはJavascriptの基礎を頭に入れておかないと、そこから先へはいけないということがわかりました。
今は、初心者のためのやさしい動画講座をじっくり受講しながら、kindle書籍やネット上のリファレンスサイトを含め、集められるだけの情報を漁っています。
気がつくと、自分の周りがJavascript関連のモノばかりになってきました。
三日坊主で挫折しないよう、頑張ります。
wordpressのダウングレードで、動作不具合なおった!
ちょっと前から動作がおかしかったお客様のwordpressサイト、
原因がWPのバージョンアップにあることがわかりました。
SpicePressProという有料テーマを使っているんですが、カスタマイズから行った編集が反映されない状態でした。
具体的にいうと、カスタマイズ→ホームページセクションの設定で、テキストを書き換えても更新されず、「公開済」の青いボタンも押せませんでした。
最初はキャッシュが残っているのかと思っていました。
が、テーマの英語のサポートサイトを頑張って探したところ、やはり同じような現象の人がいるようで。サポートの答えではWP5.5のjqueryに問題があります、とのこと。
WP5.5からjqueryの呼び出し方が大きく変わったようで・・
で、wordpressをダウングレードするプラグインがあることもわかりました。
これ、便利。
早速プラグインを入れて、5.5になる前の5.4.2に戻したところ、見事に不具合が回避できました。
ちょっと迷うのは、バージョンを入れただけでは変わらなくて、あらためて更新画面にいってwordpressの更新をしないといけない、ということだけ。
テーマのサポート様曰く、次のバージョンでテーマのほうが対応するとのこと。
つまりWP5.5に対応してなかったのですね。
というわけで少しの間、様子見です。
英語のテーマを使うと、もしもの時に結構大変・・・。
CMSの再修業
CMSといえば今はwordpressが主流かと思いますが、自分的には後発。
CMSでWEBサイトを作ることにはもともと興味があって、過去にはMovableTypeを中心に、XOOPSやその他CMSをいろいろ設置して、自分のサーバーで楽しんでいました。
wordpressを使いだしたのはここ数年のことで、最近やっとカスタマイズできるようになってきたところです。
でも、使い勝手から言えばMovableTypeのほうが圧倒的に好きです。物理的にHTMLページを生成するので、動作も早く感じます。
ふと思いついて他のCMSは今どうなっているか久々に調べてみると、新しいものもいろいろ増えたようですが、従来のCMSもバージョンアップを重ねて、しっかり頑張っていることがわかりました。
以前はそれぞれのCMSをあまり使い込めてはいなかったので、この機会にいろいろ試したいと思い、一念発起。
とりあえず用意したのは以下のCMS。
それぞれサブドメインを用意して、インストールから始めています。
今はほとんどのCMSが、ブラウザ上で設定しインストールを完了できるタイプですね。
XOOPSについては、推奨版ディストリビューション「XoopsX」を以前のようにインストールしようとしましたが、途中でエラーが出て進めなくなりました。
インストール時点でなるべく試行錯誤したくないので、残念ですが今回はXoopsは除外です。
では、また。
■
今更ながらですが、Sassの使い方を年末年始に勉強しました。
Sassを使うとCSSをプログラミング的にかけて効率化できるんだな、くらいに思っていましたが、実際勉強してみると想像以上にいろいろなことができて、ちょっとハマりそうです。
Udemyの講座を一気に視聴して、今はぐちゃぐちゃになっている既存サイトのCSSを、練習を兼ねて再構築しています。
コンテンツごとに色を変えているサイトでは、変数を使うだけでも随分簡略化します。
条件分岐や繰り返し処理もPHPのように使えるので、似たようなコンテンツが多いサイトは効率的に管理できますね。
ベンダープレフィックスが多くてレスポンシブ環境で使いづらかったFlexboxも、@mixin機能を使ったらずいぶんスッキリしました。
何よりDreamweaverには実装済みだったことが驚き。なんで今まで使わなかったんだろう、とちょっと後悔しています。
今年はあまりいろいろ欲張らずに、Sassを完全マスターしたいと思います。
●Udemy CSSを効率的に書く!フロントエンドエンジニアのための「Sass」講座