看到一款树形结构,比较喜欢它的样式,就参照它的外观自己做了一个,练习一下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

CSS实现树形结构 + js加载数据相关推荐

  1. IE11浏览器js加载数据不显示问题的解决

    这是谷歌浏览器的显示效果: 各栏均正常显示数据,以下是IE11的显示效果: 可以发现,IE11浏览器下数据栏很多栏均为空,同样的代码,在谷歌.火狐.360等浏览器均正常显示,唯独IE11不正常,下面是 ...

  2. python爬取js加载的数据_Python爬虫:爬取JS加载数据的网页

    比如简书: Paste_Image.png 我们来写个程序,爬取简书网站随便一个作者的所有文章,再对其所有文章进行分词统计 程序运行统计的结果见文章: 我统计了彭小六简书360篇文章中使用的词语 需要 ...

  3. html 下拉滚动加载,原生js滚动到底部加载数据和下拉刷新 Scrollload

    初衷 如今移动端站点越来越多,滚动到底部加载数据和下拉刷新的需求非常的常见,即使现在很多pc站点也会有这样的需求,比如百度首页就有.虽然简单的完成这么一个功能非常方便,但是滚动往往会成为性能的瓶颈,处 ...

  4. 原生js滚动到底部加载数据和下拉刷新 Scrollload

    原文地址 https://github.com/fa-ge/Scrollload/blob/master/README.md 初衷 如今移动端站点越来越多,滚动到底部加载数据和下拉刷新的需求非常的常见 ...

  5. js 下拉底部加载|滑轮滚动到页面底部ajax加载数据的实例

    转载链接:http://www.cnblogs.com/thinksley/archive/2013/05/12/3074237.html 滚动下拉到页面底部加载数据是很多瀑布流网站的做法,那来看看配 ...

  6. ajax加载vue数据,详解使用Vue.Js结合Jquery Ajax加载数据的两种方式

    整理文档,搜刮出一个使用vue.js结合jquery ajax加载数据的两种方式的代码,稍微整理精简一下做下分享. 废话不多说,直接上代码 html代码 demo {{message }} 测试jqu ...

  7. SpringMVC--Ajax异步加载数据$(function (){ 逻辑代码}) 的意思是让dom结构加载完毕后再去执行逻辑代码

    1. SpringMVC–Ajax异步加载数据 1.1 实体类user User.java package com.tian.pojo;import lombok.AllArgsConstructor ...

  8. node中怎样将css导入到html,CSS无法使用Node.js加载到我的HTML代码中

    我想通过Node.js使用express()函数在localhost:3000中将CSS添加到我的HTML中. 不幸的是,有些奇怪.我一步一步按照教程中的步骤,但仍然无法加载我的CSS.我的style ...

  9. python爬取js加载的数据_Python爬虫学习,记一次抓包获取js,从js函数中取数据的过程...

    昨天有小伙伴找我,新浪新闻的国内新闻页,其他部分都是静态网页可以抓到,但是在左下方的最新新闻部分,不是静态网页,也没有json数据,让我帮忙抓一下.大概看了下,是js加载的,而且数据在js函数中,很有 ...

最新文章

  1. python怎么把程序封装成函数_PYTHON中如何把固定格式代码,封装成一个函数?
  2. ArrayList和Vector的区别
  3. python的简单程序代码_小白学编程?从一个简单的程序开始学习Python编程
  4. gson 不忽略空_java – Gson序列化字段只有在不为null或不为空
  5. java 数组的索引_java如何寻找数组中心索引
  6. gatsby_与Gatsby一起使用React Context API
  7. php识别字符编码,PHP自动识别字符集编码并完成转码_PHP教程
  8. 若依如何修改数据监控登录账户密码?
  9. 如何配置YUM本地更新源
  10. arm linux系统启动流程
  11. postman实现接口请求
  12. CQF笔记M1L2二叉树模型
  13. 常见服务的默认端口_wuli大世界_新浪博客
  14. 对lambert diffuse(兰伯特漫反射)模型的理解
  15. 华为手机如何实现语音转文字?简单的很,一步步教你完成
  16. 做好个人时间管理的10个关键
  17. J - 最强王者 POJ - 1753 Flip Game 搜索+状态压缩
  18. php访问违例,关于UG内存访问违例的简单而有效的解决办法!!
  19. 哈工大计算机网络研究生,2020年哈尔滨工业大学软件工程考研经验分享
  20. 【iframe结合pdf.js实现pdf的预览/下载及打印功能】

热门文章

  1. 【CodeForces - 602D】Lipshitz Sequence(思维,单调栈,斜率单调性)
  2. 【qduoj】C语言课程设计_约瑟夫问题
  3. 【HDU - 2104】hide handkerchief (素数)
  4. 从零开始学视觉Transformer(1):Hello Vision Transformer
  5. eclipse 跑maven命令_eclipse中运行maven命令没有反应,console也不出现信息
  6. dart与java互调_Dart与Java不同的地方
  7. r语言读写word_R语言:在word中插入ggplot
  8. css现在还用浮动吗,css3-9 css中的浮动怎么使用
  9. ubuntu nginx配置负载均衡篇(二)
  10. h5获取http请求头_React 前端获取http请求头信息