多层嵌套指什么 什么是多层嵌套if函数
本文旨在解决可折叠容器(collapsible) div)在展开时无法正确推动底部内容,导致内容重叠的问题。核心是传统的scrollHeight计算方式无法覆盖所有折叠子元素的高度。解决方案是预先计算所有可折叠容器可能达到的最大总高度,将其作为maxHeight值,确保父级容器在展开时能够容纳所有子级元素,从而实现正确的布局内容。问题背景与现象分析
在网页开发中,我们经常需要实现可折叠(collapsible)内容区域,通过点击按钮来展开或收起特定内容。当这些可折叠区域存在约定关系时,例如一个可折叠容器内部又包含另一个可折叠容器,传统的基于scrollheight的展开逻辑可能会遇到问题。
具体适配:当外部的可折叠容器(例如“Header”) 2”)展开后,如果其内部的子可折叠容器(例如“sub header”)也被展开,子容器的内容可能不会将外部容器下方的其他内容(例如“Header” 3”)推进高度,而是被其隐藏覆盖或考虑到用户体验上,这升降内容重叠,需要先关闭再重新打开父容器才能正确显示。
究其原因,是JavaScript中element.scrollHeight属性在计算元素总时,只了当前元素及其直接子元素的可视内容高度,感应动态捕获所有潜在的、未展开的内容高度纳入计算。当子容器展开时,父容器的maxHeight 捕获更新,导致其无法完全承载子容器的新高度。原始实现代码(存在问题)
以下是导致上述问题的典型HTML、CSS 和JavaScript 结构代码。
HTML 结构 lt;div class=quot;appquot;gt; lt;main class=quot;contentquot;gt; lt;h1gt;主标题 lt;/h1gt; lt;button class=quot;collapsiblequot;gt;页眉 1 lt;/buttongt; lt;div class=quot;collapsible-containerquot;gt; lt;img src=quot;quot; alt=quot;图片 1quot; style=quot;width:200px;height:200px;quot;gt; lt;/divgt; lt;button class=quot;collapsiblequot;gt;页眉 2 lt;/buttongt; lt;div class=quot;collapsible-containerquot;gt; lt;div class=quot;collapsible-contentquot;gt; 主要内容将写在这里 lt;/divgt; lt;button class=quot;collapsiblequot;gt;sub headerlt;/buttongt; lt;div class=quot;collapsible-containerquot;gt; lt;img src=quot;.quot; alt=quot;图片2quot; style=quot;width:200px;height:200px;quot;gt; lt;/divgt; lt;/divgt; lt;button class=quot;collapsiblequot;gt;页眉3lt;/buttongt; lt;div class=quot;collapsible-containerquot;gt; lt;img src=quot;quot; alt=quot;图片1quot; style=quot;width:200px;height:200px;quot;gt; lt;/divgt; lt;/maint;lt;/divgt;登录后复制CSS样式.app { display: flex; min-height: 100vh;}.content { flex-grow: 1; padding: 50px 0 50px 75px;}.collapsible-content { padding: 20px 28px; transition: max-height 0.2s ease-out; background-color: none; float: none;}.collapsible-container { max-height: 0; width: 75; overflow: hidden; padding: none; transition: max-height 0.2s ease-out; backgro
und-color: none; float: none;}.collapsible { background-color: rgb(218, 228, 238); color: rgb(84, 84, 84); cursor: pointer; padding: 18px; width: 75; text-align: left; text-indent: 20px; letter-spacing: 1px; outline: none; font-size: 18px; border: 1px solid white; float: top;}.active,.collapsible:hover { background-color: rgb(175, 186, 197); color: white;}.collapsible:after { content: '\002B'; /* '加号' 符号 ( ) */ color: rgb(74, 74, 74); font-weight: bold; float: right; margin-left: 5px;}.active:after { content: quot;\2212quot;; /* '减号' 符号 (-) */}登录后复制JavaScript 逻辑var coll = document.getElementsByClassName(quot;collapsiblequot;);var i;for (i = 0; i lt; coll.length; i ) { coll[i].addEventListener(quot;clickquot;, function() { this.classList.toggle(quot;activequot;); var content = this.nextElementSibling; if (content.style.maxHeight) { content.style.maxHeight = null; // 收起 } else { content.style.maxHeight = content.scrollHeight quot;pxquot;; // 展开 } });}登录后复制
JavaScript代码的核心问题提出,当一个collapsible-container内部包含另一个未展开的collapsible-container时,父容器的scrollHeight并不包含子容器的潜在高度计算。因此,当子容器展开时,父容器的maxHeight仍然是基于旧的scrollHeight,导致无法显示子容器内容。解决方案:预计算最大高度
为了彻底解决这个问题,我们需要确保父级可折叠容器在展开时,其maxHeight能够容纳所有可能的子级内容,包括所有边框的可折叠内容。一个有效的策略是预先计算所有可折叠容器元素可能达到的最大总高度,将其作为一个通用的最大高度值。
优化后的JavaScript代码var allHeights = 0;var content = document.getElementsByClassName(quot;collapsible-containerquot;);var j;//遍历所有可折叠容器,计算它们的最大可能高度总和for (j = 0;j lt;contents.length;j ) { //注意:这里scrollHeight是在元素和最大内容高度限制时,其实际高度 //此时,如果所有内容全部展开,该值就是其应有的高度 var h = document.getElementsByClassName(quot;collapsible-containerquot;)[j].scrollHeight; allHeights = h;}var coll = document.getElementsByClassName(quot;collapsiblequot;);var i;for (i = 0; i lt; coll.length; i ) { coll[i].addEventListener(quot;clickquot;, function() { this.classList.toggle(quot;activequot;); var content = this.nextElementSibling; // 获取当前按钮对应的可折叠内容容器 // 判断当前容器是否已展开 // 如果当前maxHeight等于allHeights,则表示已展开,点击后应收起 if (content.style.maxHeight === allHeights quot;pxquot;) { content.style.maxHeight = quot;0pxquot;; // 收起 } else { // 展开时,设置为预计算的最大总高度 content.style.maxHeight = allHeights quot;pxquot;; // 展开 } });}登录后复制代码解析allHeights的计算:代码首先遍历页面上的collapsible-container元素。对于每一个collapsible-container,它获取scrollHeight。这里的关键已经累了,scrollHeight属性在元素丢失内容时返回其所有内容的完整高度。通过加所有collapsible-container的scrollHeight,我们得到了一个理论上的最大总高度allHeights,这个高度超过了所有可内部的高度包含展开时的总和。maxHeight的设置:在点击事件监听器中,当需要完全展开一个可折叠容器时,不再使用该容器自身的scrollHeight,而是统一使用事先计算好的allHeights作为maxH这样,无论该容器内部有多少层布局,其maxHeight都足够大,能够保证所有子级内容(包括子可折叠容器展开后的内容)被完整显示,并正确推动底部内容。收起逻辑:收起操作保持固定,将maxHeight设置为0px。
为了保证展开和收起逻辑的匹配,展开时的maxHeight现在是allHeights "px",因此在判断是否展开时,也需要与该值进行比较。CSS与HTML结构
本解决方案中,CSS样式和HTML结构与原始实现保持一致,需要修改。CSS负责定义折叠容器的初始状态(max-height: 0;溢出:隐藏;)以及模板内容效果,HTML则定义了折叠的结构。注意事项allHeights的通用性:此解决方案使用一个全局的allHeights值来评估所有可折叠容器。这意味着即使是一个简单的可折叠容器有时,它会展开时同时调用所有高度的高度。在某些情况下,这可能会导致不必要的空白区域。如果需要更精确的高度控制,可能需要为每个可折叠容器单独计算最大可能高度(包括所有子孙元素),或者采用动态函数来动态计算父容器的scrollHeight。其动态内容:allH八分之一的计算是在页面加载时进行的。如果可折叠容器内部的内容是动态加载的(例如通过AJAX尺寸请求),或者图片等媒体元素在加载后了,那么allHeights可能不再准确改变。在这种情况下,需要重新触发allHeights的计算或采用更灵活的高度计算策略。性能考虑:对于拥有大量可折叠容器且DOM结构非常复杂的页面,在页面加载时遍历所有元素并计算scrollHeight可能会对性能产生微小影响。在大多数常见情况中,这种影响可以忽略不计。替代方案:对于简单的可折叠需求,可以使用HTML5 lt;详细gt;和lt;摘要gt;标签,它们提供了折叠的可折叠功能,并且通常能够更好地处理折叠。对于更复杂的交互,可以考虑使用成熟的UI库或框架,它们通常提供完善的折叠/展开组件。总结
通过预先计算所有可折叠容器的潜在最大高度总和,并将其作为每个容器时的maxHeight值,我们成功解决了折叠可折叠内容无法正确推进下方内容的问题。这种方法保证了父级容器始终有足够的空间来承载其所有子级内容,从而实现了清晰、无重叠的布局效果。虽然存在一些通用性上的考量,但对于大多数预设可折叠场景来说,这是一种简单而有效的解决方案。
以上就是实现多层码头可折叠内容的正确布局的详细信息,更多内容请关注乐哥常识网其他文章!