【JQuery】エクスプローラーのようなフォルダーツリーを作ってみる(その1)
おはようございます。
今日は実家に行って、庭に設置する柵を作る予定です。
最近私もDIY(たいしたものじゃないですが)にハマっているのですが、
とうとう、ホームセンターで木材まで購入して、本格的な感じでやるので楽しみです。
うまくできるだろうか。
さて本題。
約1ヶ月ぶりの JQuery ネタです。
今回は、JQuery(スタイルはBootstrap、Fontawesome を使いました)で、エクスプローラーのようなツリーを作成してみました。
なんだかんだみんな Windows 好きですよね。
スポンサーリンク
画面
基本的に、div要素をリスト(ul,li)に入れて表現しました。
css
style.css
@charset "UTF-8"; body { font-family:Helvetica, 'Helvetica Neue', 'Mplus 1p', 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', Meiryo, メイリオ, Osaka, 'MS PGothic' !important; font-size:12px; } h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6 { font-family:Helvetica, 'Helvetica Neue', 'Mplus 1p', 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', Meiryo, メイリオ, Osaka, 'MS PGothic' !important; } /** * アイコン */ .tree i.fas, .tree i.far, .tree i.fa { font-size: 16px; margin-right: 5px; } .tree i.fa-none { margin-right: 20px; } .tree i.fa-angle-down { margin-right: 7px; } .tree i.fa-angle-right { margin-right: 9px; } .tree i.fa-folder-open { margin-right: 2px; } /** * ツリー */ .tree { margin: 0; padding: 5px 0px 0px 0px; list-style-type: none; cursor: pointer; } .tree div { padding: 5px 0px; } .tree div span { -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .tree li ul { list-style-type: none; margin: 0; padding: 0; } .tree div:hover, .tree div:focus { background : #edf7fe; } .tree div.selected { background : #d0e8ff; }
html
sampleTree.html
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>サンプルツリー</title> <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" /> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.1/css/all.css"> <link rel="stylesheet" href="css/style.css"> </head> <body class="hold-transition fixed skin-blue-light sidebar-mini "> <div class="wrapper" > <div style="margin: 20px;"> <pre> ツリーのサンプル 矢印をシングルクリックでフォルダの開閉、その他の部分はダブルクリックで開閉します。 </pre> </div> <div> <ul class="tree" data-widget="tree"> <li> <div> <span><i class="fa-none"></i></span> <span class="tree-icon-arrow"><i class="fas fa-angle-right"></i></span> <span class="tree-icon-folder"><i class="far fa-folder"></i></span> <span class="tree-title">フォルダー1</span> </div> <ul style="display:none;"> <li> <div class="selected"> <span><i class="fa-none"></i></span> <span><i class="fa-none"></i></span> <span class="tree-icon-arrow"><i class="fa-none"></i></span> <span class="tree-icon-folder"><i class="far fa-folder"></i></span> <span class="tree-title">サブフォルダー1-1</span> </div> </li> <li> <div> <span><i class="fa-none"></i></span> <span><i class="fa-none"></i></span> <span class="tree-icon-arrow"><i class="fas fa-angle-right"></i></span> <span class="tree-icon-folder"><i class="far fa-folder"></i></span> <span class="tree-title">サブフォルダー1-2</span> </div> <ul style="display:none;"> <li> <div class="selected"> <span><i class="fa-none"></i></span> <span><i class="fa-none"></i></span> <span><i class="fa-none"></i></span> <span class="tree-icon-arrow"><i class="fa-none"></i></span> <span class="tree-icon-folder"><i class="far fa-folder"></i></span> <span class="tree-title">サブフォルダー1-2-1</span> </div> </li> <li> <div> <span><i class="fa-none"></i></span> <span><i class="fa-none"></i></span> <span><i class="fa-none"></i></span> <span class="tree-icon-arrow"><i class="fa-none"></i></span> <span class="tree-icon-folder"><i class="far fa-folder"></i></span> <span class="tree-title">サブフォルダー1-2-2</span> </div> </li> </ul> </li> </ul> </li> <li> <div> <span><i class="fa-none"></i></span> <span class="tree-icon-arrow"><i class="fas fa-angle-right"></i></span> <span class="tree-icon-folder"><i class="far fa-folder"></i></span> <span class="tree-title">フォルダー2</span> </div> <ul style="display:none;"> <li> <div class="selected"> <span><i class="fa-none"></i></span> <span><i class="fa-none"></i></span> <span class="tree-icon-arrow"><i class="fa-none"></i></span> <span class="tree-icon-folder"><i class="far fa-folder"></i></span> <span class="tree-title">サブフォルダー2-1</span> </div> </li> <li> <div> <span><i class="fa-none"></i></span> <span><i class="fa-none"></i></span> <span class="tree-icon-arrow"><i class="fa-none"></i></span> <span class="tree-icon-folder"><i class="far fa-folder"></i></span> <span class="tree-title">サブフォルダー2-2</span> </div> </li> <li> <div> <span><i class="fa-none"></i></span> <span><i class="fa-none"></i></span> <span class="tree-icon-arrow"><i class="fa-none"></i></span> <span class="tree-icon-folder"><i class="far fa-folder"></i></span> <span class="tree-title">サブフォルダー2-3</span> </div> </li> <li> <div> <span><i class="fa-none"></i></span> <span><i class="fa-none"></i></span> <span class="tree-icon-arrow"><i class="fa-none"></i></span> <span class="tree-icon-folder"><i class="far fa-folder"></i></span> <span class="tree-title">サブフォルダー2-4</span> </div> </li> </ul> </li> <li> <div> <span><i class="fa-none"></i></span> <span class="tree-icon-arrow"><i class="fa-none"></i></span> <span class="tree-icon-folder"><i class="far fa-folder"></i></span> <span class="tree-title">フォルダー3</span> </div> </li> <li> <div> <span><i class="fa-none"></i></span> <span class="tree-icon-arrow"><i class="fa-none"></i></span> <span class="tree-icon-folder"><i class="far fa-folder"></i></span> <span class="tree-title">フォルダー4</span> </div> </li> </ul> </div> </div> <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script> <script src="js/sampleTree.js"></script> </body> </html>
スクリプト
javascript
sampleTree.js
/** * ページ読み込み時の処理 */ $(function(){ // シングルクリックで選択状態の切替 $(".tree div").on("click", function(event) { $(".tree div").removeClass("selected"); $(this).addClass("selected"); }); $(".tree .tree-icon-folder, .tree .tree-title").on("click", function(event) { var parent = $(this).parent("div"); $(".tree div").removeClass("selected"); $(parent).addClass("selected"); event.stopPropagation(); }); // ダブルクリックでツリーを展開 $(".tree div").on("dblclick", function(event) { treeClick($(this)); }); $(".tree .tree-icon-folder, .tree .tree-title").on("dblclick", function(event) { var parent = $(this).parent("div"); treeClick($(parent)); event.stopPropagation(); }); // 矢印はシングルクリックでツリーを展開 $(".tree .tree-icon-arrow").on("click", function(event) { var parent = $(this).parent("div"); treeClick($(parent)); event.stopPropagation(); }) }); /** * ツリークリックイベント */ function treeClick(div) { // サブフォルダがあれば開閉の処理をおこなう。 if (($(div).next().length > 0)) { // 矢印アイコンの入れ替え var arrow = $(div).children(".tree-icon-arrow").children("i"); $(arrow).toggleClass("fa-angle-right"); $(arrow).toggleClass("fa-angle-down"); // フォルダアイコンの入れ替え var folder = $(div).children(".tree-icon-folder").children("i"); $(folder).toggleClass("fa-folder"); $(folder).toggleClass("fa-folder-open"); // ツリーの開閉 $(div).next().slideToggle(); } // 選択状態の変更 $(".tree div").removeClass("selected"); $(div).addClass("selected"); }
サンプルイメージ
初期表示。矢印アイコンをシングルクリックか、アイコンやフォルダ名をダブルクリックで開閉します。
開閉したところ。
全部展開しました。基本的に入れ子にすれば階層はどんどん増やしていけます。
また、アイコンも Fontawesome ではなく自前の icon に変更することもできますね。
まとめ
便利なJQueryプラグインもありますが、プラグインを使えない場合や、最小限のものだけ欲しいといった場合には自分で実装しますよね。
何だか面白くなってきたので、もうちょっと機能を追加していきたいと思います。
何かのお役に立てれば。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません