• TOP
  • ブログ
  • プロフィール
  • お問い合わせ
  • ドロップダウンメニュー(レスポンシブ)を実装してみた

    ドロップダウンメニュー(レスポンシブ)を実装してみた

    ナビゲーションにホバーすると、下層のナビゲーションが出てくる、いわゆるドロップダウンメニューを作ってみました。
    調子に乗ってレスポンシブで、スマホのときはアコーディオンメニューにしようとか考えて、結構苦労しました・・・。

    デモはこちらから
    DEMO

    以下、コードです。
    HTML

    liの中にulを入れる入れ子構造です。普通に打つとかなりめんどくさいですね。何かしら楽をする方法を使う方がいいでしょう。私の場合はemmetでやりました。

    CSS

    動きに関わる部分は特にありません。ほぼ見た目を整えるために使ってます。「>」は子要素を指定するセレクタです。今回みたいな入れ子構造のものは子要素のみを指定してあげればclass・idなしでも実装できます。(メンテナンス性とかの良し悪しはさておき・・・)

    jQuery

    画面サイズによってイベントを切り替えています。700pxより大きい場合はhoverイベントが、小さい場合はclickイベントが動作します。さらに700px以下の時はmenuというボタンが現れ、ナビゲーションが格納されます。これは読み込み時と画面サイズが変わったときに読み込むようにしています。

    ちなみに.on(‘load resize’)の中にクリックやホバーのイベントを入れると正常に動作しません。
    jQueryのonイベントは入れ子にすると、外側のイベントの読み込みを内側のイベントに継承してしまいます。つまり、.on(‘load resize’)の関数の中に.on(‘click’)を入れると、リサイズが起こった回数だけクリックされたという判断がされてしまい、アコーディオンが何度も開いたり閉じたりしてしまうのです。
    なので、イベントごとにウィンドウサイズを判断して、サイズによる出しわけをしています。

    openerという変数は他のアコーディオンが開いているかどうかを判断しています。どのアコーディオンも閉じているときは、クリックしてすぐ開きますが、どれかのアコーディオンが開いているときは、閉じ終わってから開くようになっています。

    =>・・・この記号はES2015から実装されたアロー関数というものです。setTImeoutなどの通常thisを継承できない場合でも、thisを継承してくれるというものです。(このあたり説明すると長いので、また別の機会にでも。)ちなみにES2015の仕様は、サポートしてないブラウザも結構あるので(iPhone5sではうごきませんでした)、使用時は注意が必要です。

    今回は、イベントが重なるとだめなところとか、アロー関数とか、実際に試すことができたので面白かったです。
    以下参考にしたサイトと書籍。大変勉強になりました。

    参考サイト:
    jQuery.on()は追加式なのでイベントの重複登録に注意しよう

    416番地 setTimeoutの話

    参考書籍:
    『フロントエンドエンジニアのための現在とこれからの必須知識』(マイナビ出版)

    yori3

    2016年2月22日
    【Web】いろいろ試してみた話
    コーディング
  • タブ切り替えメニューの実装

    みなさん、お久しぶりです。気が付けば最後の更新から1か月半。だいぶ更新してないと思い、こないだ仕事で実装したタブ切り替えメニューをご紹介します。

    まずはDEMOから。
    DEMO①

    mainArea内のdivの中身はご自由にどうぞ。

    HTML

    CSS

    jQuery

    ○コード解説
    メニューと下の表示エリアのid名の数字をいっしょにすることで、for文で操作しやすくしています。
    表示しているメニューをクリックしてもフェードアニメーションが発生したので、currentというクラス名をつけて、条件分岐させています。slideとかにしてもおもしろい動きになるかも。

    次回はドロップダウンメニューの予定。いつになることやら・・・。

    yori3

    2016年2月6日
    【Web】いろいろ試してみた話
    コーディング
  • 同じ方向にスライドし続けられるカルーセル

    みなさん、お疲れ様です。

    今回は同じ方向にスライドし続けることができるカルーセルを作成したので、ご紹介します。

    2017年1月8日更新
    コードを直して挙動がだいぶましになったものをあげましたので、こちらからどうぞ

    同じ方向にスライドし続けられるカルーセル第2弾

    5秒ごとに要素が切り替わっていきます。左右のボタンでも切り替えられます。スライドで切り替わるものは以前にも作ったのですが、今回はずっと同じ方向にスライドするようにしました。

    DEMO①

    HTML

    CSS

    jQuery

    liをposition:absoluteにして、動かしています。一回のスライドごとに左からの位置を取得し、それにli要素一つ分の幅を足したり、引いたりすることでスライドさせています。li要素の幅と高さでwrapperの大きさやボタンの位置を制御しているので、CSSはそこだけ変えれば好きな大きさで使うことができます。フリックもつけています。仕組みは以前のものと同じです。

    ○今回使ったjQueryのいろいろ
    ・.stop():jQueryのアニメーションの処理を制御します。今回は時間で動くタイミングとボタンを押すタイミングが被ったときにきちんと処理できるように引数を(true,true)にしています。
    詳しくはこちらをご覧ください。
    【jQuery】stopメソッドを理解する

    ・.offset().left:要素がページの左から何pxの位置かを取得します。

    見たいところに飛べるボタンもつけたかったのですが、実装できませんでした。いつか挑戦したいと思います。あと、早く動かすと処理が追いつかないのも何とかしたいと思います。

    それでは!

    yori3

    2015年12月13日
    【Web】いろいろ試してみた話
    コーディング
  • CSSのお話 第5話【「先生、レスポンシブがしたいです。」】

    CSSのお話 第5話【「先生、レスポンシブがしたいです。」】

    (※これから紹介するのはほんの一例であり、私の個人的見解を含みます。これが絶対ということはないですし、もっと良いやり方があったり、コンテンツの内容によって違ってきたりするということは理解しておいてください。)

    生徒「レスポンシブって難しい・・・。」
    先生「どうしました?」
    生徒「先生、レスポンシブがうまくできないんです。」
    先生「レスポンシブとはどういうことを言うか、わかりますか?」
    生徒「PCでもスマホでもサイトが見られるということですよね?」
    先生「そうですね。もう少し詳しく言えば、一つのHTMLソースをデバイスや画面サイズに応じて適切に表示できるようにすることですね。なのでただ画面サイズに対して縮めただけというようなレイアウトではレスポンシブと呼べるかは微妙なところですね。」
    生徒「そうなんですね。」

    先生「簡単なコードを例にレスポンシブのやり方について見ていきましょう。まず、用意したHTMLはこちらです。」



    「そしてそれに対してこのようにスタイルを設定します。」



    「その見栄えがこちら」
    DEMO①

    「まずはPC用に固定値でレイアウトを決めました。次にこれを画面サイズに応じて最適なものにしていくのですが、このとき幅や余白などの数値はbodyに対して相対的に設定したいので、%にします。
    ということで%にしたものがこちらです。今回は幅のみ%指定です。」



    DEMO②

    「これで画面を縮めても表示されてるでしょう。どこまでも伸びていくと気持ち悪いので、max-widthを指定しています。」
    生徒「でも、先生。縮めていくとリストやコンテンツが狭くなりすぎる気がするのですが。」
    先生「そうですね。同じレイアウトのまま画面サイズが小さくなれば見づらくなります。そこでブレークポイントを指定しましょう。」
    生徒「ブレークポイント?」
    先生「ブレークポイントとは画面サイズが変化したときにスタイルが変わる画面幅のことです。メディアクエリー(@media screen snd …)でブレークポイントを指定した、その画面サイズまでの間でのみ違うスタイルを適用させることができます。(※デバイスサイズや向きによっても分けられます。詳しくはこちら
    デバイスに合わせてCSSを振り分ける「Media Queries」)
    メディアクエリーで画面サイズ600xp以下の時のスタイルを指定したものがこちらです。(@media以外は②と一緒です)」



    DEMO③

    「これだと画面サイズが小さくなってもある程度見やすさを維持できていると思います。」

    生徒「そうですね、コンテンツの幅もあるし、ナビのボタンもタップしやすいです。」
    先生「実際にはこれにコンテンツの内容が入ってくるので、これだけでレスポンシブ完成というわけにはいきませんが、基本的な考え方はこんなかんじです。」
    生徒「そうなんですね。先生、もう一度レスポンシブに挑戦してみます。」

    参考サイト
    必読!5分でわかるレスポンシブWebデザインまとめ
    レスポンシブWebデザインの作り方(簡単設定方法)

    yori3

    2015年11月29日
    【Web】いろいろ試してみた話
    コーディング
  • CSSのお話 第4話【rem「emとは違うのだよ、emとは。」】

    CSSのお話 第4話【rem「emとは違うのだよ、emとは。」】

    いきなりですが、クイズです!

    このようなHTMLがあります。



    このHTMLに以下のようにスタイルを設定したときdivのfont-sizeはいくらになるでしょう。

    ①
    fontsize_em

    ②
    fontsize_rem

     
     
    わかりましたか?

    では正解発表です。下のリンクからどうぞ。「チェック用」となっているほうには同じサイズになるように、px単位でfont-sizeを指定しています。
    ①答え

    ②答え

    ①と②の違いはfont-sizeの単位です。emとremはどう違うのか。

    ○emとは
    emは相対単位と言って、親要素のサイズに対しその何倍かという計算をしてサイズを設定します。なので、先ほどの例であれば、(16*1.5*2*1.5)=72pxになります。他に%が相対単位になります。それに対してpxはそれ独自にサイズを指定するので、絶対単位といいます。

    ○remとは
    remは:root emの略で、htmlのサイズに対してその何倍かでサイズを設定し、親要素の影響を受けません。なので、先ほどの例では、(16px*2rem)=32pxとなります。これがemとremの違いです。

    個人的にはremを使うことをおすすめします。なぜなら、例えば前回紹介したdisplay:inline-bloock;のときに親要素にfont-size:0;を設定すると、emでは0にかけ算することになるので、文字サイズを設定できません。親要素を考慮に入れて混乱することを避けるためにもremを使っていくのがいいのではないでしょうか。

    参考サイト:フォントサイズの指定はCSS3の「rem」が便利そう

    yori3

    2015年11月27日
    【Web】いろいろ試してみた話
    コーディング
  • フリックもできるカルーセル作ってみた

    みなさん、お疲れ様です。

    今回の制作物は、カルーセルです。
    早速デモをご覧ください。フリックでも画像切り替えできるので、スマホでも見てみてください。

    DEMO

    コードです。HTMLで画像の数を変更したら、他は自動的に対応してくれるようになっています。

    HTML

    CSS(抜粋)

    jQuery

    画像をdivの中で横並びにし、そのdivをposition:absoluteにしてleftの値を変えることでスライドさせています。

    ○今回使ったjQueryのいろいろ
    ・touchstart・・・タッチしたときのイベントを取得する。
    ・touchmove・・・タッチしてから数ミリ秒後のイベントを取得する。
    ・touchend・・・指を話した瞬間のイベントを取得する。

    今回、初めてタッチイベントを実装したのですが、なかなかうまくいきませんでした。はじめは画像を切り替える関数をtouchmoveイベントに入れてたのですが、touchmoveイベントは押さえている間ずっと有効になってしまうので、画像の切り替えがうまくいきませんでした。touchendイベントに入れるとフリックで切り替えができるようになりました。
    変数宣言もイベントの外でしてあげないと動きませんでした。

    まだまだ不明点が多いので、勉強しつつ他の動きも実装したいと思います。
    それでは。

    参考にさせていただいたサイト
    jQueryで作るフリックスライド – (1)無段階スライド
    jQueryを使ったスライダーの作り方とその仕組み

    yori3

    2015年11月24日
    【Web】いろいろ試してみた話
    コーディング
1 2 3
次のページ

©️ 2024 yori3 All rights reserved.