当前位置: 首页 > Web前端 > JavaScript

3D可视化

时间:2023-03-27 17:12:07 JavaScript

快速构建页面结构熟悉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;框大小:边框框;填充:10px;间隙:10px;&>div{宽度: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;变换:rotateY(-30deg)rotateX(30deg);*{位置:相对;变换样式:保留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下每一层的元素,即就是,*通配符选中的元素,增加了一个transform:translateZ(16px),这个很重要,为了在Z轴方向逐渐增加元素的深度。两个伪元素的使用需要很好理解,它们是构建整体3D效果的关键因素box-shadow:1px1px10pxrgba(0,0,0,0.1)加入一个小的阴影效果使得整体效果看起来更像这样,我们用3个面,加上简单的阴影,一块一块的搭建立体效果。我们先看看目前为止的效果:根据上面,我们可以希望改变交互方式,实现鼠标Hover当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(--变换持续时间);游标:指针;&::之前,&::之后{内容:””;显示:块;位置:绝对;背景:透明;过渡:所有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);}&::after{transform:scaleX(1)rotateY(-90deg);}}}}这样我们也得到了题图开头的Hover图的效果:CodePenDemo--DOM扩展迁移的3D可视化有了上面的代码后,因为是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--DOM的3D可视化最后,本文到此结束,希望本文对你有所帮助:)更多精彩的CSS技术文章汇总在我的Github——iCSS,持续更新中,欢迎点个星订阅收藏。有什么问题或者建议可以多交流。原创文章文笔有限,知识匮乏。如果文章中有任何不准确的地方,请告诉我。