下面是一个使用HTML的ul标签制作的关于国家区划的组织结构图。
- 中国
- United States of America
我们的目标是,在保持最干净的HTML源码不变的情况下,只使用CSS,将上面的结构图转换为下面的树形效果。

Ready? Go!
先看HMTL的代码。
遵循惯例,先将ul的margin及padding置0。

失去了层次结构。需将padding-left设为非零值。同时将li前面的项目图标去掉。

上面的图例中,海口市的四个区有最深的层次。为简化思路,我们从最深一级,即美兰区开始思考解决问题的方法。在海口市与美兰区之间应有一条直角线段“└”将它们连起来。
鉴于美兰区是一个li元素,我们先画出其方框看看。

现在,方框围住了美兰区,我们需要将此方框推到美兰区的左边。也就是,在美兰区的左边应有一方框。因为上面已经澄清了目标,我们不能动HTML源码,因此我们可以通过CSS的before伪元素来为我们添加这个方框。
先把li元素本身的边框去掉。因为我们只需一个方框而无需实质内容,因此content为空值。长、宽各设为1em的正方形。边框为黑线。

如上图所示,并没有出现一个正方形的边框。我们可以在content中输入实际内容,并较大幅度地增加长、宽值,比较其效果。

前面的围绕字符a的边框出现了,但尽管长宽值均设为10em,边框的面积还是不起变化。由于before伪元素的本意是在特定元素之前添加内容,应与该元素并排显示,因此被设定为inline型。而对处于流布局中的inline型设置具体的长宽不会有效果。此外,流布局元素也不能定位。解决的方法是将其脱离流布局即可。
因为content的内容隶属于li元素,因此我们先将其父元素li的position设为relative,再在li:before中将position设为absolute,这样可使content的内容脱离原来的流布局,且相对于li元素的位置来定位。注意上面的content已经恢复为空值,且长、宽恢复为1em。

别为上图的边框恰好围住一个汉字而搞晕了,看看图中的Florida,并没有围住单个字符。因此长、宽各为设1em碰巧围住了一个汉字而已。content的内容为空值也证明了边框面积与内容无关,而仅与长、宽值有关。同样,也别因为边框碰巧围住一个汉字而误以为边框会随汉字的移动而移动。再次重申,碰巧而已,这个边框是可以独立移动的。
现在,我们已经有了一个可以独立移动的边框,为了得到“└”的连线效果,还需做以下事情:
- 我们只需保留边框的左边及底边
- 把这两条边往左推至美兰区之前
- 调整这两条边的位置及长度
根据以上思路,调啊调,最终调成下面的数值及效果。

已经初具雏形了。但海口市下面的四个区应使用一条竖线将它们连通贯穿起来。此外,海口市与三亚市也应连起来。
由于海口市的四个区太密集了,这回换位思考,先看如何将海口市与三亚市连起来。
现在的问题变成:按照上面的思路,如果这条竖线也是通过边框的方式来实现,那么,在CSS中应选择哪个元素进行相应设置?是海口,还是三亚?先假设这条线已经调好相应的位置,则应顺着海南省的南字下边的竖线一直连向三亚市左边的竖线,贯穿了整个海口市所在区域。因此,应选择海口市的li元素。且由于三亚市左边的竖线已经高于其文字上端,因此,三亚市无需再设置竖线。
同样道理,北京连广东连海南连安徽,只需设置北京、广东和海南所在区域的竖线,而安徽无需设置。而对于中国与United States of America,只需设置中国。
找到规律了吗?如果没有,让我们借助图形来洞悉事实的真相。

上图中,红色部分表示需要设置连线的元素,而灰色表示无需设置连线的元素。
其规律是,每一层级的最后一项元素,无需设置连线;不是最后一项元素,则需设置连线。
如何找出最后一项元素,以及,不是最后一项的元素?幸喜CSS提供了这样的选择器。上图的效果所用到的CSS内容如下:
既然已经甄别出来,显而易见,只需对li:not(:last-child)进行设置即可。
我们上面已经使用before的伪元素设置了li元素之前的连线,这回,我们使用其搭档after伪元素设置左边的竖线。严格来说,after伪元素是在元素的后面添加新的内容。但由于我们通过绝对定位的方式,即使是后面的,我们也可将其调至前面来。参照之前的例子,设置CSS如下:

因为我们只需要一条线,因此无需设边框的宽度,且此边取值于边框的左线。
各个li元素的竖线已经站在其左边待命,但不够长。上面的height取固定值1em,显然不能应付各种长度不一致的的场合,如中国连向United States of America的连线就比海口市连向三亚市的连线要长。
如果说height是从top往下计算的数值,则bottom则是从下向上计算的数值。使用bottom代替height,可使这条直线的长度自动延伸到足以覆盖该元素的整个高度,而不管该元素的具体高度是多少。

已经胜利在望了,剩下需做的,就是将left值往左调。最后,将上面显示不同颜色的CSS代码去掉,就可得到下面的效果。

Game Over.
因篇幅不长,这里列出上述CSS的全部源码。
注::before及:after伪元素始自于CSS2.1,:last-child伪类及:not伪类始于CSS3。因此,本文的实现需要支持CSS3的浏览器支持。
[本文调试环境:Safari on Mac OS X Lion]
分享到:
相关推荐
在这个场景中,我们关注的是一个基于jQuery的"超漂亮树形控件",这通常用于构建可交互的、层次化的数据展示。树形控件是一种常见的用户界面元素,用于显示具有层级关系的数据,比如文件系统、组织结构或菜单。 标题...
总结来说,"基于C# + jQuery的树形控件"项目涉及了后端编程、前端交互、数据库操作和UI设计等多个方面,对于提升Web开发技能和理解前后端协作流程有着重要的实践意义。通过理解和实现这个项目,开发者可以深入了解...
例如,使用CSS(层叠样式表)在Web开发中,可以通过设置`background-image`属性来指定树形控件的背景图;在Windows Forms或WPF中,可以修改控件的模板,设置`Background`属性以加载图像。 2. **图片选择**:选择...
2. **CSS样式**:为了使树形控件具有良好的视觉效果,需要编写CSS来定义节点的样式,包括展开/折叠的图标、节点间的层级间距、选中状态等。 3. **JavaScript逻辑**:核心的逻辑部分主要由JavaScript负责。这包括: ...
2. 使用库:许多流行的JavaScript库,如jQuery、React、Vue等,提供了插件或组件来简化树形控件的实现。例如,jQuery有jQuery UI的Treeview,React有react-treeview,Vue有vue-tree等。这些库通常提供了丰富的API和...
"树形控件js"指的是使用JavaScript实现的这种控件,通过HTML文档来展示和交互。在本篇文章中,我们将深入探讨树形控件的概念、实现方式以及JavaScript在其中扮演的角色。 1. **树形控件的基本概念** 树形控件是一...
3. **准备工作**:为了实现树形控件,我们需要准备以下几个部分: - **图形资源**:包括折叠的分支、展开的分支和叶节点的图像。 - **CSS样式**:定义了树形控件的样式,如指针样式、节点的显示和隐藏等。 - **...
在JavaServer Pages (JSP) 中,我们可以利用各种库和组件来实现树形控件的功能,以提供用户友好的交互体验。 ### 1. JSP基础知识 JSP(JavaServer Pages)是Java平台上的动态网页技术,它允许开发者将HTML代码与...
在本主题中,我们将深入探讨如何使用 Three.js 的 CSS3DRenderer 来渲染全景图,这是一种将3D对象与CSS3变换相结合的技术,能够实现高效且性能良好的3D效果。 首先,CSS3DRenderer 是 Three.js 提供的一个渲染器,...
本教程将详细讲解如何使用ASP(Active Server Pages)、JavaScript和CSS来实现一个网页中的树形控件。 首先,ASP是微软开发的一种服务器端脚本语言,用于动态生成HTML页面。在创建树形控件时,ASP主要负责后端数据...
在这个基于Vue的项目中,"ZhuFaner-vue-tree-select-a1e5831" 指的是一款名为 "ZhuFaner Vue Tree Select" 的组件,它主要用于实现树形结构的选择功能。这种组件在数据管理和组织结构展示时特别有用,例如在组织架构...
文件名为“mztreeview2”的可能是一个压缩包,其中包含了实现这个树形控件的HTML、CSS和Javascript文件。HTML文件可能定义了树形结构的基本框架,通过DOM元素和特定的class来表示每个节点。CSS文件则提供了样式规则...
在网页交互中,树形控件是一种常见的数据展示方式,它以层级结构展示信息,常用于文件系统、菜单导航或组织结构等场景。本资料包集合了几个常用的JavaScript树形控件,有助于提升网页的用户体验。 1. **jQuery ...
8. **可选插件**:虽然可以直接用jQuery编写下拉树形控件,但也可以使用现有的jQuery插件,如jQuery UI的Treeview或jstree,它们提供了预定义的样式和丰富的功能,可以快速集成到项目中。 在实际应用中,可能还需要...
为了实现部门员工树形选择控件,我们通常会使用以下步骤: 1. **数据获取与处理**:首先,我们需要从后台获取部门和员工的数据,这通常通过Ajax请求实现。后台代码可能是PHP、Java、Python等,负责查询数据库并返回...
zTree是一款基于JavaScript的开源树形控件,它结合了ajax和json技术,实现了动态加载和数据交互,使得页面的交互性和用户体验得到了显著提升。本文将深入探讨zTree的核心特性和实际应用。 一、zTree简介 zTree是一...
Ztree是一款基于JavaScript的树形插件,它提供了丰富的功能和良好的性能,广泛应用于网页端的数据展示。Ztree_v3是其第三个主要版本,具有更多的特性和优化。在Java项目中,我们通常会结合后台服务(如Spring MVC或...
HTML+CSS+JS实现的下拉菜单源码HTML+CSS+JS实现的下拉菜单源码HTML+CSS+JS实现的下拉菜单源码HTML+CSS+JS实现的下拉菜单源码HTML+CSS+JS实现的下拉菜单源码HTML+CSS+JS实现的下拉菜单源码HTML+CSS+JS实现的下拉菜单...
树形菜单控件在ASP.NET中的实现通常基于服务器端控件模型。这些控件可以在客户端和服务器端交互,允许用户在浏览器中直接与菜单进行交互,而无需频繁地向服务器发送请求。控件的配置和数据绑定通常在后台代码(如C#...
**ZTree树形控件详解** ZTree是一款基于JavaScript的高性能、可高度定制的树形插件,广泛应用于Web开发中,特别是在数据管理和展示领域。它以其轻量级、丰富的API和灵活的配置选项,使得在网页上实现复杂的树形结构...