tree view menu 設計

無論喺 software, web, kiosk 都需要 menu 整理多個選項方便比人柬,最簡單可以分為打橫同打直;造得 UI 設計應該比一舨人考慮嘅野多得多,唔限於觀感。打橫嘅 menu 同 tab 一樣,最大限制在於  minium width,所以唔會放倒好多個,適合簡單嘅web,好處係一眼就睇倒 web 嘅最頂部份包括整條 menu。最傳統左邊  treeview sidemenu 加右邊 content,好似 pdf reader 或者 file explorer 嘅 2column layout 係我覺得最通用 UX 最好嘅表達方式,sidemenu 放左邊嘅好處在於對応由左上開始嘅閱讀習慣,最頂放 logo 同時係 home link,有睇書 content index 嘅感覺;wordpress 嘅 web 有唔小用右邊 sidemenu,最主要係因為 responsive layout 就手机,打橫唔夠位就簡化到一粒制彈 menu,sidemenu 其他野clip 到底部,所以放啲比 content 更次要嘅野,同時右 menu 會接近啲 scrollbar會方便小小。touch screen 出現之後,UI 嘅諗法應該要從新檢討,同時方便 cursor 同 touch 嘅 UX;最大分別在於 mouse hover 要改晒造 click,menu 嘅特質更加似 file system,folder 只係 catagory 嘅特質包住一堆 link。

寫 code 同造 design 嘅人分別對 editor 同 UI 多,明顯係両種唔同特質嘅人;於是,有 code 先造倒 tree view 效果嘅 menu 並唔常見。我心目中最理想嘅分工,喺造 UI 設計嘅人未必需要識由零開始寫 code,但最小要識揾 code 同 library 番黎修改,達到最好嘅效果為止。如果要造 tree view menu 效果,coder 傾向用有 cdn 又常用功能強大嘅 library,例如 jstree 或者 fancytree 我都試過,但因為無 auto collapse 效果,最後我喺 jqueryscript.net 先揾倒一個簡單嘅 ACL tree view,可以改動到我心目中嘅效果。

<!DOCTYPE html>
<!-- https://github.com/imdrashedul/acl-tree-view -->
<!-- https://www.jqueryscript.net/other/accordion-tree-view-acl.html -->
<html lang="en">
<head>
    <title>jQuery ACL Tree View</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" type="text/css">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Marcellus+SC" type="text/css">
    <link rel="stylesheet" href="style.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <script src="acl-tree-view.js"></script>
</head>
<body>
    <script type="text/javascript">
        fetch('menuitem.json')
            .then(response => response.json())
            .then(data => {
                const menuItem = data;
                jQuery(function ($) {
                    const treeView = $('#sidemenu').aclTreeView({
                        animationSpeed: 500,
                        icon: "fa-solid fa-caret-right"
                    }, menuItem);
                });
            })
            .catch(error => console.error('Error fetching menu items:', error));
    </script>
    <div id="acl-container">
        <h1>ACL Tree View</h1>
        <div id="sidemenu"></div>
    </div>
</body>
</html>

tree view menu 有可能會叫 multi level accordion,而打直嘅 accordion 可以完美取代打橫嘅 tab,但両者同黎放 content 嘅話,變相只係 hide 左其他大部份嘅 content,唔會 load 快啲,倒不如一篇長好似 pdf reader 咁 show 晒出黎。我想造到嘅效果係用 accordion 用黎放 link,好似 file explorer 由最宏觀一眼睇晒方便揾,到一層層更深入,所以 auto collapse 係必需嘅效果。加上 Font Awesome 嘅 icon 更加可以強化方便揾變得更易用,但 folder 或者 catagory 都適合用 icon 去表達時,最左邊嘅三角型係重點,表示裏面仲有堆野包住,而且要好似寫 code嘅 loop 咁用 indent 對齊嘅方式表達 level,如果 level 有幾層嘅話,可以加一條 breadcrumb 相當於 file path 嘅效果。

html, body {
  height: 100%;
  width: 100%;
  margin: 0;
}
a, a:hover {
  text-decoration: none;
}
#acl-container {
  font-family: 'marcellus sc';
  font-size: 16px;
  max-width: 320px;
  height: 100%;
  width: 100%;
  padding: 0;
  margin: 0 auto;
  background-color: #000;
  color: white;
}
#acl-container h1 {
  display: flex;
  height: 60px;
  justify-content: center;
  align-items: center;
  margin: 0;
}
ul.acl-tree-view {
  padding: 0;
  display: block;
  overflow: auto;
}
ul.acl-tree-view ul {
  padding: 0;
  border: 2px #666;
  border-style: none none dotted dotted;
  margin-left: 1.5em;
  display: block;
  overflow: auto;
  margin-top: 0;
  padding-bottom: 0.5em;
}
ul.acl-tree-view li {
  list-style-type: none;
  display: block;
  padding: 0.25em 0;
}
ul.acl-tree-view li a {
  display: block;
  color: #CCC;
  transition: all 50ms ease-out;
  font-size: 1.5em;
  margin-left: 19px;
}
ul.acl-tree-view li a.acl-tree-view-toggle>span>i:first-child {
  margin-left: 6px;
}
ul.acl-tree-view li a:not(.acl-tree-view-toggle)>i {
  margin-left: 1em;
}
ul.acl-tree-view li a.acl-tree-view-toggle.acl-tree-view-active>i:first-child {
  transform: rotate(90deg);
}
ul.acl-tree-view li a:active {
  color: #FFF;
  text-shadow: 0px 0px 10px #fff;
  background-color: rgb(0, 127, 127);
  box-shadow: inset 0 0 20px 5px #000;
}

因為 UI 啲字或者 icon 一定要用 font 唔可以用 graphic,file size 會細啲同 search engine 可以理解,所以造 UI 設計識基本嘅 HTML 同 CSS 係必需,擺位受制於 HTML,而效果受制於 CSS;但現時嘅 broswer 內置嘅 developer tool 已經好方便可以作為 editor 即時反映調較效果。例如顔色或者透明度都可以用 color picker 柬,content 適合白底深色字容易睇,可以配合白底嘅 photo;而 menu 要凸顯有制可以黚同 content 唔同嘅話,適合反白用深色底白字,而且可以造倒 touch 或者 click 之後發光嘅 feedback效果。

menuitem.json in JSONedit tree view

因為 web 每頁嘅 menu 要保持一樣,而且唔可以用 frame,其中一個方法係用 dreamweaver 嘅 template 功能,每加一頁或者改動個 menu 就全部 page update 過晒。想造到一般人都可以 maintain 倒又唔用 CMS 嘅話,個 menu 上面啲 item 同 link 最好抽出黎寫成 JSON,方便用JSONedit 之類有 UI 嘅工具整理。就算無 web server,用 javascript 都可以靠fetch() 讀 file,甚至 HTML 嘅 content 都可以一頁頁用 fetch()DOMParser() 取代𠝹 frame 嘅效果,而且速度反応一定係最快,衣啲大路嘅方法用 VScode 裏面 AI 功能寫就可以,係避免重覆性方便管理同修改嘅最簡單方法;但同樣缺乏 bookmark 某一頁或者 back forward 嘅 history 功能,始終唔及用 web server 同 database 嘅 CMS 咁理想。

Reference: