CSSだけで実装するハンバーガーメニュー(暫定版…)

こんにちは。

野球とかインターハイとかインカレとか見てたらスポーツをしたくなったyasaiです。
もうすぐスポーツの秋ですが、今年もきっと食欲と読書と仕事の秋なんだろうなぁ。

さて今回は最近ハンバーガーメニューを使ったグローバルメニューの案件が多かったので、
何となく自分向けの備忘録です。

実装はHTMLとCSSだけ。Javascriptは使いません。

150831

 

【DEMO】

HTML

<nav class="hamburger_menu">
	<input type="checkbox" id="hamburger__btn"> 
	<label for="hamburger__btn" class="hamburger__btn"><span></span></label>
	<div class="menu_content">
		<ul>
			<li><a href="">menu01</a></li>
			<li><a href="">menu02</a></li>
			<li><a href="">menu03</a></li>
			<li><a href="">menu04</a></li>
			<li><a href="">menu05</a></li>
			<li><a href="">menu06</a></li>
		</ul>
	</div>
</nav>

Javascriptを使わないので、メニューのオンオフの切り替えはcheckboxで行います。

Label要素の中に空のspan要素を配置したのは、span要素の疑似要素を使って3本線を表現するためです。

 

CSS

sassの記述はこうなりました。以下sassで記述します。

.hamburger_menu
    #hamburger__btn{
        display: none;
        & ~ .menu_content {
            visibility: hidden;
        }
        &:checked ~ .menu_content {
            visibility: visible;
        }
    }

    .hamburger__btn{
        display: block;
        width: 40px;
        height: 40px;
        border-radius: 0 0 5px 5px;
        background-color: #ccc;
        position: fixed;
        top: 0;
        right: 10%;
        z-index: 100;
        &:after {
            content: '';
            display: block;
            width: 60%;
            height: 2px;
            background-color: #fff;
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translateX(-50%) translateY(-50%);
        }
        span {
            width: 100%;
            height: 100%;
            display: block;
            position: relative;
            &:before,
            &:after {
                content: '';
                display: block;
                width: 60%;
                height: 2px;
                background-color: #fff;
                position: absolute;
                left: 50%;
                transform: translateX(-50%) translateY(-50%);
            }
            &:before {
                top: 25%;
            }
            &:after {
                bottom: 25%;
            }
        }
    }

    .menu_content{
        position: fixed;
        top: 50%;
        left: 50%;
        z-index: 10;
        transform: translateX(-50%) translateY(-50%);
        &:after {
            content: '';
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translateX(-50%) translateY(-50%);
            z-index: -1;
            width: 0;
            height: 0;
            background-color: rgba(0, 0, 0, 0.7);
            border-radius: 50%;
            transition: width 1s ease 0s, height 1s ease 0s, opacity 0s ease 0s;
        }
        a {
            color: #fff;
            text-decoration: none;
        }
    }
    #hamburger__btn:checked{
        & ~ .menu_content:after {
            width: 200vw;
            height: 200vh;
        }
        & ~ .hamburger__btn{
            &:after {
                content: none;
            }
            span{
                &:before,
                &:after{
                    left: 44%;
                    transform: translateX(-50%);
                }
                &:before{
                    top: 25%;
                    transform: rotate(-45deg) translateX(-50%);
                    transform-origin:center center;
                }
                &:after{
                    bottom: 25%;
                    transform: rotate(45deg) translateX(-50%);
                    transform-origin:center center;
                }
            }
        }
    }
}

ちょっと長くなりましたが、やってることは順序は前後しますが①メニューの切り替え、②メニューがオンになったときのスタイル、③メニューのページに対する絶対配置です。

①メニューの切り替え

#hamburger__btn{
    display: none;
    & ~ .menu_content {
        visibility: hidden;
    }
    &:checked ~ .menu_content {
        visibility: visible;
    }
}

checkbox自体は非表示にして、label要素のクリックでオンオフを切り替えます。

関節セレクタ~と:checked擬似クラス セレクタを使ってcheckbox以降の兄弟要素のスタイルを変えていきます。

②メニューがオンになったときのスタイル

メニューがオンになったときには、

  1. メニューの内容がオーバーレイでページのセンターに表示される。
  2. メニューボタンの3本線が×マークになる。

です。

1.メニューの内容がオーバーレイでページのセンターに表示

.menu_content{
    position: fixed;
    top: 50%;
    left: 50%;
    z-index: 10;
    transform: translateX(-50%) translateY(-50%);
    &:after {
        content: '';
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translateX(-50%) translateY(-50%);
        z-index: -1;
        width: 0;
        height: 0;
        background-color: rgba(0, 0, 0, 0.7);
        border-radius: 50%;
        transition: width 1s ease 0s, height 1s ease 0s, opacity 0s ease 0s;
    }
    a {
        color: #fff;
        text-decoration: none;
    }
}
#hamburger__btn:checked{
    & ~ .menu_content:after {
        width: 200vw;
        height: 200vh;
    }
}

メニューの中身(ul要素)を画面中央にfixedし、そのafter疑似要素でオーバーレイ部分を作ります。オンになったら拡大するアニメーションにしました。

2.メニューボタンの3本線が×マークになる。

.hamburger__btn{
    display: block;
    width: 40px;
    height: 40px;
    border-radius: 0 0 5px 5px;
    background-color: #ccc;
    position: fixed;
    top: 0;
    right: 10%;
    z-index: 100;
    &:after {
        content: '';
        display: block;
        width: 60%;
        height: 2px;
        background-color: #fff;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translateX(-50%) translateY(-50%);
    }
    span {
        width: 100%;
        height: 100%;
        display: block;
        position: relative;
        &:before,
        &:after {
            content: '';
            display: block;
            width: 60%;
            height: 2px;
            background-color: #fff;
            position: absolute;
            left: 50%;
            transform: translateX(-50%) translateY(-50%);
        }
        &:before {
            top: 25%;
        }
        &:after {
            bottom: 25%;
        }
    }
}
#hamburger__btn:checked{
    & ~ .hamburger__btn{
        &:after {
            content: none;
        }
        span{
            &:before,
            &:after{
                left: 44%;
                transform: translateX(-50%);
            }
            &:before{
                top: 25%;
                transform: rotate(-45deg) translateX(-50%);
                transform-origin:center center;
            }
            &:after{
                bottom: 25%;
                transform: rotate(45deg) translateX(-50%);
                transform-origin:center center;
            }
        }
    }
}

3本線はlabel要素(.hamburger__btn)の疑似要素で中央に1本。その子要素spanの疑似要素で上下に引いています。

メニューがオンになったときは中央の線を非表示にして子要素spanの線を45度回転させました。

 

③メニューのページに対する絶対配置に関しては、そのままなので割愛します。
ただ、チェックボックスがオーバーレイの上に来ないと切替が出来なくなってしまうのでご注意を。

 

ハンバーガーメニューを使うにあたって

今回制作した案件はPCサイズでもハンバーガーメニューを使うデザインだったのですが、ハンバーガーメニューからしかページ遷移ができないページの場合に、ちょっと使い勝手が悪く感じました。
メニューの内容が見えているグローバルメニューと違って、1クリックしないとメニューの内容がわからない、移動できないっていうのは、使う側からするといささか不便なんだなぁと。

視線がページのコンテンツを読むために上から下に流れっていって、そこからページ遷移のためにハンバーガーメニューを探すっていうのがいかんのかも。
スマホの場合はコンテンツの終わりとハンバーガーメニューを同時に視界にとらえられるので、そこまで違和感ないんですけどね。

ハンバーガーメニュー使うときは、コンテンツの中からページ遷移させるためのテキストリンクやボタンが見てくれる人のために必要なんだなと感じたのでした。

 

最後にsassだけじゃなくてメニュー部分のCSSへ切り出したファイルもリンクしておきますね。

hamburger.css

 

今回参考にさせていただいたサイト様

Pure CSS Fullscreen Navigation Menu


IFTTTを使っていろんなサービスと連携(例えばTwitterからFacebookにアルバムを作る)

夏、ですね。みなさん夏バテしていませんか?

インターハイ始まりましたね。もうすぐ甲子園も始まります!
今では見るからに不健康そうですが、昔はこれでもスポーツしてました。
インターハイとか夢の向こうのへっぽこ選手でしたが(笑)

スポーツを通して、違う学校や年齢性別の別、いろいろ違う人たちと会って話して。
今でも仲良く遊ぶ人たちもいます。僕はスポーツを通してでしたけど、こんな感じでこうやってみんないろいろ繋がっていくのですね。

というちょっとまじめな前振りから強引にいきますが。今日はいろんなサービスを連携できる「IFTTT」のお話です。

150731

IFTTTって?

IFTTT(イフト)とは「レシピ」と呼ばれる個人作成もしくは公に共有しているプロフィールを使って数あるWebサービス(Facebook、Evernote、Weather、Dropboxなど)同士で連携することができるWebサービスである。開発したのはリンデン・チベッツで2010年にスタートした。

― Wikipediaより
https://ja.wikipedia.org/wiki/IFTTT

そのまま引用しましたが、あるサービスで「何かをすると」違う他のサービスに「何かできる」というものです。

 IF this Then That

Create Recipe - IFTTT.clipularこれはIFTTTでレシピ(何かから何かを連携するのをIFTTTではレシピといいます)を作るときの魔法の呪文ですが、そのまま「もしこれをしたら」「そのときあれはこうなる」ということですね。
連携できるサービスはいろいろ。右の画像が現在(2015年7月30日)使えるサービスのアイコンです。かなりいろいろありますね。

IFTTTしてみる

例えば今回はTwitterにアップした写真をFacebookのアルバムに追加してみます。出かけた先でおもしろい写真をとってTwitterにアップしたものをFacebookにアルバムとしてまとめておいたら、後から見直したりまとめて使ったりするのに便利、かもしれませんよね。

0.チャンネル登録

IFTTTにログインして(アカウントのない方はアカウントを作ります。メールアドレスとパスワードでOKです)、チャンネルの登録をします。

右上のメニュー「Channels 」から利用するサービスのアカウントを登録します。
今回はTwitterとFacebookのアカウントを登録しました。

1.My Recipesを作る

レシピを作成します。「My Recipes」から入って、「Create a Recipe」をクリックします。
IFTTTは海外のサイトで、まだ日本語対応していませんが、直感的にクリックしていくだけでレシピが作れます。

2.もしこれで

Create Recipe - IFTTT.clipular (1)

「Create a Recipe」をクリックすると「if this then that」と表示されます。これが魔法の呪文でしたね。反転している「this」をクリックします。

トリガーとなる(利用するサービスでどんなことをしたら)サービスがアイコンで一覧表示されるので、利用するアイコンをクリックします。今回はTwitterです。

3.こんなことしたら

次に「どんなことしたら」を選びます。今回は特定のハッシュタグで分類できるように「New tweet by you with hashtag」を選択して、「#photo」というハッシュタグをつけたときに発動することにしました。

進んで行くとぬるぬるスクロールして行くのが、さりげなく使い易いですね。

Create Recipe - IFTTT.clipular (2)

4.あれで

Create Recipe - IFTTT.clipular (3)

 

次はどのサービスに使うかを選択します。先ほどは「this」だったところがTwitterのアイコンになっていますね。これも直感的にわかりやすくなっています。

反転している「that」をクリックすると利用できるサービスの一覧で表示されるので、今回利用するFacebookをクリックします。

5.何をする

Create Recipe - IFTTT.clipular (4)

次に何をさせるかを選択します。今回はアルバムを作るので、「Upload a photo from URL」を選択します。

Create Recipe - IFTTT.clipular (5)

URLを登録する欄、Facebookに登校するメッセージ、登録するアルバムの名前を登録します。今回は新しく「Twitterphoto」というアルバムをFacebookに作ることにしました。

ここでアルバム名を登録するとFacebookに新規でアルバムが作られます。空欄にした場合は「IFTTT Photos」というアルバムが作られます。

この三つをきめたら「Create Action」をクリックします。

6.確認画面

Create Recipe - IFTTT.clipular (6)

最後にこれでOKかどうかの確認画面です。IFTTT用にレシピのタイトルを決めることもできます。今回はそのまますることにしました。

 

写真をTwitterに投稿する

ちゃんと動くか確認します。ハッシュタグ#photoをつけた写真入りのツィートを作成します。

 

Facebookにアルバムが作られる

ほんとにちゃんとFacebookに投稿されるていることを確認します。(反映されるまでに若干タイムラグがある場合があります)

Facebook.clipular

無事投稿されてますね。ちなみ新規で「Twitterphoto」というアルバムもちゃんと作成されていました。成功ですね。これで出先からTwitterに投稿した写真をアルバムにまとめることができるようになりました。

--- ---.clipular

 

 

他にもいろいろ

今回はTwitterに投稿した写真をFacebookのアルバムにまとめるレシピを紹介しましたが、他にもいろいろな事ができますよ。

個人的に使っているのは、iPhoneで撮った写真をFlickrに登録したり(iCloudの要領確保のため)、Tumblrで書いた記事をFacebookページ流したり、好きなブログが更新されたらRSSを利用してFacebookにリンクを流す、などです。

他にもgmailとevernoteを連携したり、いろいろなことができるので自分好みのレシピを作ってみてくださいね。素敵なレシピができたらぜひ教えてください!


ローカル環境からのお引越し(searchreplacedb2.phpを使います)【WordPress】

みなさんのお住まいのところは梅雨入りしましたか?

私は今年の春に2階から1階に引っ越したのですが、2階の時に比べてちょっぴり湿っぽい気がします。とにかく洗濯物が乾きにくくて嫌な季節ですね。

 

150630

さて、今回はローカル(今回はMac×Mampです)から本番環境へWordpressを移行した時のお話です。

カスタムフィールドやら初期登録分の記事やら、固定ページやら、量が多くなければ本番環境でもう一度作っても良いのですが(その程度ならWP使ってないかもしれませんね)、ローカル環境でお腹いっぱいになっているWPを本番環境に引っ越します。

WP標準のインポートツールだけだと、うまく移行できないデータがあったり、データベース上のURLの書き換えがうまいこといかずにリンクが切れたりすることがあるみたいです。(※参考サイト:テストから本番へ!WordPressでURLが変わる場合のデータベース修正マニュアル)

今回は参考サイトを見ながらsearchreplacedb2.phpというスクリプトを使います。

 

作業手順

  1. ローカルからデータベースのエクスポート(sql)
  2. 本番環境にデータをインポート
  3. サイトデータをサーバにアップ
  4. searchreplacedb2.phpを使ってデータベース内のURLを書き換える
  5. searchreplacedb2.phpを削除する

準備段階としてsearchreplacedb2.phpを先にダウンロードしておきます。
(準備を全部してからの方が慌てなくていいですからね)

https://interconnectit.com/products/search-and-replace-for-wordpress-databases/

上記リンク先のページ中程にダウンロードのリンクが有ります。V3.0.0 BETA版も有るようですが、今回は2.1.0の方を使って問題なく引越しできました!

 

ローカルからデータベースのエクスポート

MampからphpMyAdminにアクセスしてデータベースをエクスポートします。

150629_01

150629_02

ポイントは、

  • 必要なテーブルを全て選択すること。
  • SQLで出力すること。
  • 「DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT / TRIGGER コマンドを追加する」にチェックを入れること。

のようです。実行して.sqlで保存します。

データ量が大きい場合は圧縮した方がいいのかもしれません。

 

本番環境にデータをインポート

こちらは移行先のサーバによるかも知れませんが、サーバのコントロールパネルからphpMyAdminにアクセスして「インポート」してあげます。

コレだけなんですが、コレだけでできてしまいました。

 

サイトデータをサーバにアップ

FTPツールなどで、サイトデータ(テーマファイルなど必要なもの)をアップロードします。参考サイトなどをいろいろ見ているとwp-config.phpをアップロードして書き換えると説明されているものが多かったですが、今回はその作業無くいけました。

あらかじめ本番環境にWPを設置してあったので、その辺りをいじる必要がなかったみたいです。

 

searchreplacedb2.phpを使ってデータベース内のURLを書き換える

最初にダウンロードしておいたsearchreplacedb2.phpをWPのフォルダにアップロードしてアクセスします。

URLはhttp://ドメイン/wordpress/searchreplacedb2.phpみたいなかんじです。

150629_03

「Submit」をクリックして次に進みます。

 
150629_04

書き換えを行うデータベースの情報が表示されます。
内容を確認して間違いなければ「Submit DB Details」をクリック。

 

150629_05

書き換えを行うテーブルを選択します。
※初期状態で全選択されていたので、そのままで良かったです。

確認したら「Continue」をクリック。

 

150629_06

上のテキストボックスに「どの文字列を書き換えるか(旧URL)」を入力。
下のテキストボックスには「書き換え後のURL(新URL)」を入力します。
末尾に / を入れないのがポイントみたいです!

内容を確認したら「Submit Seach string」をクリック。
コレでURLの書き換えが行われます。
本番サイトを確認してみましょう。

 

searchreplacedb2.phpを削除する

書き換えが行われたのを確認して、searchreplacedb2.phpをサーバから削除します。

150629_07

 

何度も表示されてますが「消すの忘れないでね!」出そうです。

このスクリプトにアクセスできると、誰でも書き換えができてしまいますからね。
絶対に削除しましょう。

 

まとめ

今回はテストから本番環境への移行で利用しましたが、サーバが移行したときなどにも使えそうです。(カスタムフィールドを作りすぎて移行がすこぶる大変になってしまった。カスタムフィールドのメンテが今後思いやられます・・・)

データベースをいじくるので、ご利用は自己責任かつ、細心の注意が必要ですね。

今回参考にさせていただいたサイト様

ありがとうございました!


擬似要素のz-indexで失敗【CSS】

こんにちは、yasaiです!
5月も終わりますね。GWとGW明けの業務が目白押しだった5月が終わって、祝日のない6月がやってきますね(泣)

今日はCSSのお話です。「おしゃれシャドーつけてみよう」です。
擬似要素のz-indexでうまいこと表示に失敗した話です。

blog_5th-02

 

 

今回コーディングに当たってこんな感じのデザインいただいたのです。

blog_5th-01

メインタイトルがサイト幅いっぱいで、そこから2カラムパターンですね。ふむふむ。

それでもってメインタイトルはドロップシャドウがついてて、2カラム部分にかかってるわけですね。スマホのときも同じ感じで。はい、了解です。

んー、このシャドウってタイトル全体より短くてセンターな感じです?あ、はい、了解です。(単純にドロップシャドウじゃないのね、おしゃれしゃどー)

blog_5th-03

こういうことですねー。

やり方は色々ありそうだけど。今回はメインタイトルの後ろに幅のちょっと短い%の擬似要素を置いてそいつにドロップシャドウしましょう。これでいくことにしました。ざっくりいきます。

おしゃれ影をつけよう!

HTML

<div id="wrapper">
    <h1 class="title">TITLE</h1>
    <div class="left-column">
        <h2>SUB TITLE</h2>
        <div class="contents">contents</div>
    </div>
    <div class="right-column">SIDE</div>
</div>

CSS

.title{
    width: 100%;
    max-width: 960px;
    padding: 16px 0;
    margin: 0 auto;
    text-align: center;
    line-height: 1;
    background-color: #fff;
    position: relative;
 }
.title:after{
    content: '';
    width: 94%;
    height: 1px;
    -webkit-box-shadow: 0px 1px 7px #000000;
    -moz-box-shadow: 0px 1px 7px #000000;
    box-shadow: 0px 1px 7px #000000;
    position: absolute;
    bottom: 0;
    left: 3%;
    z-index: -1;
    border-radius: 2px;
}

こんな感じですかね?影つきました!ちゃんとブラウザ幅に合わせて縮小もできてるし、良かったよかった!

やったことは、TITLEの94%の幅でbox-shadowを設定したafter擬似要素をTITLEの後ろに置いたということですね。影の部分がうまく出るようにbottomで調節して、シャドウの上の部分が出ないように、TITLEに背景色を設定したということです。

と、まぁできたと思って、他のとこのコーディングしてたんですけど・・・

影がコンテンツの下にあるよ!!

blog_5th-04ざっと組んで見直して、まぁ気がつくわけですよね。(2カラム部分に背景とかを後からつけたので、発見が遅れた・・・)擬似要素が他のコンテンツの後ろにいますねーこれじゃダメです?だめ?ですよねー修正します。

CSS

.title{
    background-color: #fff;
    line-height: 1;
    margin: 0 auto;
    max-width: 940px;
    padding: 16px 0;
    position: relative;
    z-index: 2;
    text-align: center;
}
.title:before {
    background-color: #fff;
    content: "";
    height: 100%;
    left: 0;
    position: absolute;
    top: 0;
    width: 100%;
    z-index: -1;
}
.title:after {
    border-radius: 2px;
    bottom: 0;
    box-shadow: 0 1px 7px #000000;
    content: "";
    height: 1px;
    left: 3%;
    position: absolute;
    width: 94%;
    z-index: -2;
}

修正したのは親となるTITLEのz-indexを設定したこと。

これでHTML全体のルートに対しての.titleのz軸の位置関係を明示して、それに対する擬似要素の位置関係を設定したということですかね。考えてみたらそりゃそうか、という気もしますね。

z-indexが2でbefore擬似要素が追加になっているのは他の要素との兼ね合いか、after擬似要素を他のコンテンツの上にのせる関係で、after擬似要素がTITLEの上にのってしまったためその上にTITLEと同じ大きさで背景色がTITLEと同じbefore擬似要素を間に差し込んだため。

ここまでくると、もっと簡単な方法があったかな、という気もしますね。何かもっといい方法あるよという方は、コメントお願いします。CSSだけで色々な表現ができるようになって楽しいですね。もっと勉強しなくちゃなと痛感です。

 

今回参考にさせていただいたサイト様です。ありがとうございました。

要素の重なりについて本気出して考えてみた(z-indexとか何とかとか)