CSS實現樹形結構 + js加載數據

? 看到一款樹形結構,比較喜歡它的樣式,就參照它的外觀自己做了一個,練習一下CSS。

? 做出來的效果如下:

  • 拉莫小學
    • 一年級
      • 一班
      • 二班
    • 二年級
    • 三年級
      • 一班
      • 二班
      • 三班

樹的dom結構:

<div class="tree"><ul><li><span><i class="fa fa-minus-circle"></i>拉莫小學</span><ul><li><span><i class="fa fa-minus-circle"></i>一年級</span><ul><li><span>一班</span></li><li><span>二班</span></li></ul></li><li><span>二年級</span></li><li><span><i class="fa fa-minus-circle"></i>三年級</span><ul><li><span>一班</span></li><li><span>二班</span></li><li><span>三班</span></li></ul></li></ul></li></ul>
</div>

CSS代碼:

/** tree.css zyj 2018.4.21 */
ul,li{list-style-type:none;}
.tree{display:block;position:relative;padding:5px 15px;}
.tree span{display:inline-block;box-sizing:border-box;height:30px;line-height:28px;min-width:60px;text-align:center;color:#888;border:1px solid #ddd;border-radius:5px;padding:0 8px;}
.tree ul{position:relative;padding-left:60px;margin:0;}
.tree ul>li{position:relative;padding:5px 0;}
.tree>ul{padding:0;margin:0;}
/** 水平方向連線 */
.tree>ul ul>li:after{content:' ';position:absolute;top:20px;left:-45px;width:45px;border:none;border-top:1px solid #ddd;}
/** 垂直方向連線 */
.tree ul>li:not(:last-child):before{content:' ';position:absolute;top:0;left:-45px;height:100%;border:none;border-left:1px solid #ddd;}
.tree ul>li:last-child:before{content:' ';position:absolute;top:0;left:-45px;height:20px;border:none;border-left:1px solid #ddd;}
/** 控制鼠標移上去的顏色 */
.tree span:hover, .tree span:hover+ul span{color:#fff;background-color:orange;}
.tree span:hover, .tree span:hover+ul span, .tree span:hover+ul li:before, .tree span:hover+ul li:after{border-color:orange;}
/** 折疊圖標 */
.tree .fa:before{margin-right:5px;}
.tree .fa-minus-circle, .tree .fa-plus-circle{cursor:pointer;}

里面引的fontawesome圖標沒法加載進來,導致折疊按鈕顯示不出,下面是原始樹狀圖的截圖:

數據是我用JS加載的,寫了個加載數據的tree.js文件,源碼如下:

/** tree.js zyj 2018.4.22 */
(function(name){var tree, outer, defaultDateFormat;outer = {setData : setData,};defaultDateFormat = {unfold : true,name : 'name',childName : 'children'};function getDataFormat(dataFormat){var index;if(!dataFormat){return defaultDateFormat;}for(index in defaultDateFormat){dataFormat[index] = typeof dataFormat[index] == 'undefined'? defaultDateFormat[index] : dataFormat[index];}return dataFormat}function initTreeJs(name){var tree;if(checkTreeNameUsed(name)){return;}window[name] = outer;initFoldIcon($('.tree'));}function checkTreeNameUsed(name){if(window[name]){console.error("The window object name [" + name + "] has been used, tree.js can't be loaded! You can try another name." );return true;}return false;}function initFoldIcon(target){target.off('click', 'span>i.fa').on('click', 'span>i.fa', function(e){var ele = $(e.target);if(ele.hasClass('fa-minus-circle')){ele.removeClass('fa-minus-circle').addClass('fa-plus-circle').parent().next('ul').hide(200);}else if(ele.hasClass('fa-plus-circle')){ele.removeClass('fa-plus-circle').addClass('fa-minus-circle').parent().next('ul').show(200);}})}function getJqueryObjectBySelector(selector){var ele = $(selector);if(typeof selector != 'string'){console.error("The first parameter jquery selector [" + selector +  "] must be a string!" );return;}if(!ele.hasClass('tree')){ele = ele.find('.tree');}if(ele.length != 1){console.error("The selector [" + selector +  "] expect only one element!" );return;}return ele;}function setData(selector, data, dataFormat){var ele = getJqueryObjectBySelector(selector);if(!ele){return;}if(!data){return;}if(!data.length){data = [data];}dataFormat = getDataFormat(dataFormat);dataFormat.topElement = true;ele.empty().append(getTreeList(data, dataFormat));initFoldIcon(ele);}function getTreeList(data, dataFormat){var i, single, name, children, childDataFormat, array = [];childDataFormat = dataFormat.child || dataFormat;if(dataFormat.unfold){array.push('<ul>');}else if(dataFormat.topElement){dataFormat.topElement = false;array.push('<ul>');}else{array.push('<ul style="display:none;">');}for(i=0; i<data.length; i++){single = data[i];if(typeof dataFormat.name == 'function'){name = dataFormat.name(single);}else if(typeof dataFormat.name == 'string'){name = single[dataFormat.name];}else{name = single['name'];}if(typeof dataFormat.childName == 'string'){children = single[dataFormat.childName];}else{children = single['children'];}array.push('<li>');array.push('<span>');if(children && children.length > 0){if(dataFormat.unfold){array.push('<i class="fa fa-minus-circle"></i>');}else{array.push('<i class="fa fa-plus-circle"></i>');}array.push(name);array.push('</span>');array.push(getTreeList(children, childDataFormat));}else{array.push(name);array.push('</span>');}array.push('</li>');}array.push('</ul>');return array.join('');}initTreeJs(name);
}('tree'))

偷懶沒寫注釋,tree.js中目前只寫了一個對外的接口 tree.setData(selector, data, dataFormat) 。參數selector是jQuery選擇器,data是數據,dataFormat是數據格式。

比如加載上圖的數據:

var dataTest = {
name:'拉莫小學', 
children:[{name:'一年級',children:[{name:'一班'},{name:'二班'}]},{name:'二年級'},{name:'三年級',children:[{name:'一班'},{name:'二班'},{name:'三班'}]}
]
};tree.setData('.tree', dataTest);

由于后臺加載的數據不一定是按照{name:'*', children:[{name:'*'},...]}這種結構,所以留了dataFormat參數,自己去定義數據格式。

簡單舉個例子,假如后臺數據格式是

var data =
{id :
'1',title : '百度',url : 'http://www.baidu.com',subWeb : [{id : '2',title : '百度新聞',url : 'http://news.baidu.com'},{id : '3',title : '百度知道',url : 'http://zhidao.baidu.com'},{id : '4',title : '百度圖片',url : 'http://image.baidu.com'},] }

那么dataFormat可以定義為

var dataFormat = 
{name : function(data){return '<a href="' + data.url + '">' + data.title + '</a>';},childName : 'subWeb'
}

至于效果,讀者自己去試咯。

?

轉載于:https://www.cnblogs.com/zengyuanjun/p/8903213.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452886.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452886.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452886.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python中__init__函數以及參數self

1.class類包含&#xff1a; 類的屬性&#xff1a;類中所涉及的變量 類的方法&#xff1a;類中函數 2. _init_函數&#xff08;方法&#xff09; 首先說一下&#xff0c;帶有兩個下劃線開頭的函數是聲明該屬性為私有,不能在類地外部被使用或直接訪問。init函數&#xff08;方…

程序的裝入方式

1 絕對裝入方式 2 可重定位裝入方式 3 動態運行時裝入方式

嵌套集合模型(Nested set model)介紹

原文鏈接&#xff1a;www.pilishen.com/posts/an-in… 此文檔是 nestedset-無限分類正確姿勢的擴展閱讀 本文翻譯自維基百科Nested set model nested set model(嵌套集合模型)是一種在關系型數據庫中表示nested sets&#xff08;嵌套集合&#xff09; 的特殊技術。[nested sets…

互聯網商業模式:增值還是減值?

網絡可以為服務增值&#xff0c;這是人們的共識。不但是增值&#xff0c;而且是按照用戶的平方增值&#xff0c;這是梅特卡夫定律說的。 我認為&#xff0c;網絡也可以為服務減值&#xff0c;是按照服務提供商的數量的平方減值。如果按用戶增值是網絡的第一定律&#xff0c;這…

程序的鏈接方式

1 靜態鏈接 2 裝入時動態鏈接 3 運行時動態鏈接

Django中--自定義模型管理器類

BookInfo.objects.all()->objects是一個什么東西呢&#xff1f; 答&#xff1a;objects是models.Manger類的一個對象&#xff0c;是Django幫我自動生成的管理器對象&#xff0c;通過這個管理器可以實現對數據的查詢。 自定義管理器之后Django不再幫我們生成默認的objects管…

字符驅動之按鍵(四:poll機制)

1 采用之前的中斷按鍵法&#xff0c;程序會一直在read函數中死循環。2 使用了poll之后&#xff0c;在一段時間內如果有按鍵按下就會返回&#xff0c;如果沒有按鍵按下等時間到再返回。3 4 應用程序的open,read,write,poll分別對應了驅動程序的open,read,write和poll。5…

第二章 API的理解和使用

2.1.1全局命令 Key * 查看所有鍵&#xff0c;(慎用&#xff0c;會把所有鍵都遍歷一次并列出) Dbsize 查看鍵總數&#xff0c;不會遍歷所有鍵&#xff0c;只是從內置函數中讀取一個數 Exists [key] 檢查鍵是否存在 Del [key] 刪除鍵 Expire [key] [seconds] 設置鍵過期時間 Type…

java uuid 線程安全_java – 在多線程應用程序中生成相同的UUID

我使用UUID.randomUUID().toString()將一個唯一值附加到最終存儲在數據庫中的字符串,并對其具有唯一約束但是因為我的應用程序是多線程的,所以執行在UUID生成的同時發生,并且最終將相同的UUID附加到字符串并且持久性失敗.有沒有更好的方法來生成隨機字符串,即故障安全方法.我嘗…

社會生活、工作中的著名法則

社會生活中的著名法則(1)&#xff1a;馬太效應 《新約 馬太福音》中有這樣一個故事&#xff0c;一個國王遠行前&#xff0c;交給三個仆人每人一錠銀子&#xff0c;吩咐他們&#xff1a;“你們去做生意&#xff0c;等我回來時&#xff0c;再來見我。”國王回來時&#xff0c;第一…

Django中--使用redis存儲歷史瀏覽記錄

class UserInfoView(LoginRequiredMixin, View):用戶中心-信息頁def get(self, request):顯示# Django會給request對象添加一個屬性request.user# 如果用戶未登錄->user是AnonymousUser類的一個實例對象# 如果用戶登錄->user是User類的一個實例對象# request.user.is_aut…

3D虛擬試衣有望解決厘米級服裝誤差 網購服裝不再蒙

還在擔心網購服裝對實際穿著效果沒把握嗎&#xff1f;隨著京東App 6.6.3版本的更新&#xff0c;京東試試3D虛擬試衣功能正式上線&#xff0c;消費者可按照自己的身材比例創建專屬的3D模型&#xff0c;而試穿效果則可以完全依照模型來展現。據了解&#xff0c;這個系統未來還將實…

關于idea修改當前使用的git賬戶的問題

1、問題描述&#xff1a; 由于前一段時間公司遷移git&#xff0c;就是將項目代碼等遷移到另一個git服務器上&#xff0c;結果用idea從git上clone代碼的時候發現沒有指定倉庫,如下提提示 2、排查原因&#xff1a; 開始懷疑是沒有把自己加入到項目成員里面&#xff0c;經過檢查是…

分頁和分段的區別

1.頁是信息的物理單位&#xff0c;分頁是由于系統管理的需要。段是信息的邏輯單位&#xff0c;分段是為了滿足用戶的要求。 2.頁的大小固定且由系統決定&#xff0c;段的長度不固定&#xff0c;決定于用戶所編寫的程序&#xff0c;通常由編譯程序在對源程序緊進行編譯 時&…

java 修飾_Java 修飾符

摘錄自http://www.runoob.com/java/java-modifier-types.htmlJava 修飾符Java語言提供了很多修飾符&#xff0c;主要分為以下兩類&#xff1a;訪問修飾符非訪問修飾符修飾符用來定義類、方法或者變量&#xff0c;通常放在語句的最前端。我們通過下面的例子來說明&#xff1a;pu…

內存分配,任意字節對齊

有這么一道題目&#xff0c;要求按任意字節對齊分配內存&#xff0c;接口&#xff1a;char * aligned_malloc(int size, int alignment)//size 為分配的內存大小&#xff0c;alignment對齊基數&#xff08;可以為任意數&#xff09;這個在gcc庫函數里能找到源碼&#xff0c;在f…

day16-Dom提交表單以及其他

一、前言 之前我們學習的是from提交表單&#xff0c;那個是html的提交表單方式&#xff0c;現在我們用dom來提交表單&#xff0c;還有一些其他的方式 二、dom提交表單 2.1、html提交表單 說明&#xff1a;form標簽跟submit類型的input標簽結合 <body><form id"f1…

分布式文件系統FastDFS

1. 什么是FastDFS FastDFS 是用 c 語言編寫的一款開源的分布式文件系統。FastDFS 為互聯網量身定制&#xff0c; 充分考慮了冗余備份、負載均衡、線性擴容等機制&#xff0c;并注重高可用、高性能等指標&#xff0c;使用 FastDFS 很容易搭建一套高性能的文件服務器集群提供文件…

html5 下拉刷新(pc+移動網頁源碼)

本文demo下載地址&#xff1a;http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId1071 本文實現在html5網頁中使用下拉功能自動刷新顯示更多內容, 使用jquery捕捉和處理相應的鼠標事件, 例如內容在頂部時&#xff0c;觸發下拉事件后顯示更多內容; 如內容在…

操作系統內存管理問題集錦

1. 可采用哪幾種方式將程序裝入內存?它們分別適用于何種場合? a. 首先由編譯程序將用戶源代碼編譯成若干目標模塊&#xff0c;再由鏈接程序將編譯后形成的目標模塊和所需的-庫函數鏈接在一起&#xff0c;組成一個裝入模塊&#xff0c;再由裝入程序將裝入模塊裝入內存&#x…