当前位置: 首页 > 科技观察

惊人的!巧妙构建页面结构的3D可视化

时间:2023-03-16 13:39:57 科技观察

熟悉Chrome扩展功能的朋友可能用过Chrome的3D显示页面层级功能。可以通过控制台打开-->右边三个小点-->更多工具-->图层。也就是你可以看到一个页面的3D层级关系,像这样:这个特性有几个很好的功能:页面层级概览。快速阐明页面z-index级别之间的关系。用于解决重绘过程(滚动过程)中部分页面卡顿的问题。当然,也存在一些问题。比如当页面DOM过多时,这个插件有时会卡住无法交互。同时,虽然可以快速明确页面的z-index层级之间的关系,但有时无法快速看出整个页面的嵌套关系。同时,它只能看到整个页面的概况,不能选择部分节点进行观察。在这篇文章中,我将介绍一种3D视图,快速使用CSS构建页面深度关系的3D视图,快速清晰的理清页面DOM层级与深度的关系。并且可以用来在不同的节点分别观察。一般来说,当然是基于:CSS选择器。CSS3D属性。一个大型的综合应用,整体看完,相信你能学到很多东西。使用CSS构建一个3D可视DOM结构视图假设,我们先实现一个任意时刻的DOM结构,简单的代码如下:这个是Header

LoremLOrem
LoremLOrem
ThisisFooter部分CSS代码:.g-wrap{margin:汽车;宽度:300px;高度:500px;背景:#ddd;显示:弹性;对齐内容:flex-start;弹性包装:包装;弹性方向:列;间隙:10px;填充:10px;&>div{宽度:100%;-成长:1;边框:1px实心#333;}}.g-content{高度:200px;显示:弹性;填充:10px;框大小:边框框;10像素;间隙:10px;&>分区{宽度:100px;高度:50px;边框:1px实心#333;}}}得到这么简单的结构,深度最多4层:而我们想要,快速看一下这个页面的3D深度图,像这样:或者,你可以使用类似Hover的交互效果来实现悬停某个Div,展示它当前的3D深度结构图,看看效果:很有意思的效果,你应该能明白我们这里要做什么。总的来说,我们的核心需求是,不管页面的DOM结构和深度如何,我们都希望能够通过简单的流程(纯CSS实现)快速的查看到页面的3D深度结构视图。使用强大的CSS选择器,批量处理样式的整体效果看似复杂,但实际上可以使用CSS选择器递归调用自己。因为我们希望我们的效果可以从任意一个DOM节点开始,首先我们需要一个CSS根节点,简单的命名为.g-3d-visual。那么整个3D样式,我们会写在.g-3d-visual的范围下:.g-3d-visual{//...}为了让整个代码更容易理解,我们会使用SASSpresetProcessors主要是利用了它的选择器可以拥有的嵌套特性。在这一点上,我们可以开始构建我们的基本样式。首先我们会处理两点:整个效果会稍微有点3D,所以我们会在.g-3d-visual的根元素中添加3D相关的样式,比如transform-style:preserve-3d,这样整个内部元素可以是3D。您可以使用通配符选择器*对.g-3d-visual下的所有元素进行快速统一处理。此时,我们的CSS代码可能看起来像这样:g-3d-visual{转换样式:preserve-3d;变换:旋转Y(-30度)旋转X(30度);*{位置:相对;变换样式:保留3d;转换:translateZ(0);}}整个图形变成了这样:虽然变化不多,但是我们通过*通配符简单的处理了所有的内部元素。图形3D的下一步其实非常关键。我们需要利用元素本身和元素的两个伪元素来构造元素的立体效果。比如这张图:它的构成是:主体部分由元素本身构成,对于每一层结构,我们加上transform:translateZ(16px)来产生不同的深度。右侧和底部的两条边只是通过变换将元素的两个伪元素旋转不同角度得到的。整体颜色调整和阴影。看代码:.g-3d-visual{transform-style:preserve-3d;变换:旋转Y(-30度)旋转X(30度);*{位置:相对;变换样式:保留3d;背景:rgba(0,0,255,0.2);变换:translateZ(16px);盒子阴影:1px1px10pxrgba(0,0,0,0.1);&::before,&::after{内容:“”;显示:块;位置:绝对;背景:rgba(0,0,255,0.2);}&::before{宽度:100%;高度:16px;左:0;底部:0;变换原点:中心底部;:scaleY(1)rotateX(90deg);}&::after{宽度:16px;高度:100%;右:0;顶部:0;变换原点:右中心;变换:scaleX(1)rotateY(-90deg);}}}嗯,其实到这里,基本上可以说核心代码都在了,最核心的就是理解:我们给.g-3d-visual每个lowerlayer的元素,也就是*通配符选中的元素,都添加了一个transform:translateZ(16px),这个很重要,为了逐渐增加元素在Z轴方向的深度。这两个伪元素的使用需要仔细了解,它们是构建整体3D效果的关键元素。box-shadow:1px1px10pxrgba(0,0,0,0.1)加入一个小的阴影效果,让整个效果看起来更真实。这样,我们就用3个面,加上简单的阴影,一块一块地搭建立体效果。我们来看看目前为止的效果:根据以上,我们可以希望通过改变交互方式来实现当鼠标悬停到DOM上时元素的3D深度变换只有在元素的某一层级被触发时才会被触发到达。只需修改代码,对于一些重复使用的元素,也可以使用CSS变量来统一。至此,我们的完整CSS代码:ThisisHeaderLoremLOremLoremLOrem这是页脚:root{--side-height:16px;--悬停颜色:rgba(0、0、255、0.2);--box-shadow:1px1px10pxrgba(0,0,0,0.1);--transform-duration:0.3s;}.g-3d-visual{transform-style:preserve-3d;变换:旋转Y(-30度)旋转X(30度);*{位置:相对;变换样式:保留3d;转换:translateZ(0);过渡:变换var(--变换持续时间);游标:指针;&::before,&::after{内容:“”;显示:块;位置:绝对e;背景:透明;过渡:所有var(--transform-duration);}&::before{宽度:100%;高度:var(--边高);左:0;底部:0;变换原点:中心底部;变换:scaleY(0)rotateX(90deg);}&::after{width:var(--side-height);高度:100%;右:0;顶部:0;变换原点:右中心;变换:scaleX(0)rotateY(-90deg);}&:hover{背景:var(--hover-color);转换:translateZ(var(--side-height));盒子阴影:var(--盒子阴影);&::before,&::after{background:var(--hover-color);}&::before{变换:scaleY(1)rotateX(90deg);}&::后{变换:scaleX(1)rotateY(-90deg);}}}}这样我们也得到了题图开头的Hover图的效果:CodePenDemo--3DVisualizationofDOM[1]extendedmigrationwiththeabovecode之后,因为是SASS代码,记得编译它,你可以在.g-3d-visual下得到所有相关的CSS代码。在尝试将整个CSS代码注入任何页面后,将.g-3d-visual样式添加到要观察的节点。我在这里尝试的是我目前正在写的GithubIssues页面,看看效果:当然,颜色可能不太匹配,但要知道整个页面的DOM结构是相当复杂的。不过整体效果还是很不错的,在实际操作的过程中,并不会感到卡顿。这段简单的代码可以进行简单的修改,比如结合Chrome扩展,快速注入代码,快速指定哪个元素添加.g-3d-visual类名,修改配色方案等。一个小插件可以快速观察页面层次!对于上面的效果,我手动修改了当前页面的HTML代码,注入了相应的CSS代码:)综上所述,我们可以简单总结一下完整的步骤:需要一个整体的3D效果,所以需要一个根CSS节点,对于.g-3d-visual,并为其设置相关的CSS3D属性值,这样整个内部元素就可以是3D的了。使用通配符选择器*可以快速查询.g-3d-visual统一处理下的所有元素。利用每个元素的另外两个伪元素实现每一层的3D立体效果,利用translateZ()逐层推进深度。通过:hover、transition等设置,实现整体的交互效果。当然,这种做法肯定会存在一些小问题。例如,如果元素的伪元素已经被使用,它会在3D效果中被重写。但由于它没有完全覆盖,可能会导致一些样式错误。其次,如果父子DIV大小完全一样,完全重叠,视觉上会有一定的影响。最后,你可以在这里获得完整的代码:CodePenDemo--3DVisualizationofDOM[2]。最后,本文到此结束,希望本文对你有所帮助:)参考[1]CodePenDemo——DOM的3D可视化:https://codepen.io/Chokcoco/pen/oNdKzNX。[2]CodePenDemo——DOM的3D可视化:https://codepen.io/Chokcoco/pen/oNdKzNX。