CSS 实现超过固定高度后出现展开折叠按钮

网站建设4年前发布
49 0 0

20230307003435568fd882632c75061097524bc9db4e3a66f05b188,在平时开发中,经常会碰到一些需要判断高度的场景,比如当超过一定高度后,需要自动出现展开折叠按钮,如下:,20230307003436a1df12d79cee6c9ab1f3124b89485f3f9062d9667,传统的思路肯定是通过JS去动态计算容器的高度,但这样就涉及到加载时机的问题,获取早了可能元素还没渲染好,晚了又会有明显的卡顿感,或者会引起页面的闪烁。,那有没有仅通过CSS的方法呢?,当然也是有的!要实现上面这个例子的效果,需要解决以下几个问题:,花几分钟一起看看吧,明确来讲,CSS现在已经有相关方法可以判断高度了,那就是CSS容器查询[1]。不过这个特性太高级了,目前几乎还不能实战,我们这次介绍一种更加传统的方式。,如何判断不同的高度?换句话来说,什么样的布局在不同的高度下会有截然不同的效果?,思考一下:,绝对定位?位置完全固定了,不行。,flex布局?好像也只能控制水平方向上,grid布局?这个水太深,没来得及研究(可能也行?),等等,除了以上,还有一个现在都避而不谈的浮动布局,为啥现在都很少用了呢,原因在于浮动布局非常脆弱,细小的尺寸变化都能引起整个布局的坍塌。我记得以前用浮动布局的时候,都需要尺寸精确,稍微出一点差错就导致浮动元素不知道跑哪去了...,既然对尺寸非常敏感,是不是和本文的临界高度有一定联系呢?,没错,今天要用到的方式就是浮动布局。,一步一步,来搭建我们所需要的页面雏形。,我们先来看一个有趣的现象,这里有一个容器,里面有3个子节点,分别为A、B、C,其中A左浮动,B、C右浮动。,当横向空间足够时,效果是这样的。,2023030700343711487c7162ce38f52514210e02f529ae46d9e6219,此时,A贴近左边,B贴近右边,C贴着B。,如果横向空间不足,那么C就会换行。,20230307003438246567401bd2277e8b8921eecdba7ac63b80c9848,现在C看似好像跑到了B的下方,其实是因为B的高度还没有超过A。,当B的高度超过A时,那么C会有如下表现。,2023030700343958ab01a738de3d085ab658fa965f65fd8cbfac189,此时,C贴在B的左侧,A的下方。,是不是很神奇?除了浮动布局,没有什么方法可以实现这样的效果了吧。那么,这和本文的例子有什么关系呢?,别急,其实这是一种极端情况,接着往下看。,我们可以设置一个极限状态,比如A的高度充满容器,B的宽度充满容器,此时B肯定会掉下来,我们用负的margin让B仍保持在一行,如下:,20230307003440389bf14035c2f654184722580848bb5a2377c1489,此时,B的高度不高于A,所以C仍然是贴在B的下方,并且靠右。现在让B的高度超过A,也就是超出容器高度,就变成了这样。,202303070034418466e8445717affe3d2021e0999400f5b4e671417,此时,C位于A的下方。也就是,仅仅因为高度超过了一个临界值,C就得到了两种截然不同的位置,如下:,20230307003442529c40790e2010c96b3624b34767120fdb49d3392,下面是动态演示(动态改变B的高度)。,20230307003443d7bc6de522f1975095f3578f7f6f5ed1aeb806588,试想一下,把C当做是“展开折叠”按钮,在这个基础上挪动一下C的相对位置,移到正下方,是不是就是我们需要的效果了呢?下面的虚线框示意移动后的位置,这样在视区范围内,虚线框在高度不足时就是不可见的,只有在超过固定高度后才可见,示意如下(观察虚线框的位置)。,20230307003445c58313312ac60a895d84167559c6395b59f5ad204,完整 demo 可以查看以下任意链接,整个原理就是这样了,下面来看具体实现。,现在回到最开头的例子,根据前面的 demo 原型,可以改造成以下结构。,这里.text就相当于B,.btn就相当于C,至于A完全可以用伪元素::before来代替。,由于有点击切换的交互,所以需要用到input checkbox,和label关联起来,所以结构最终改造成这样。,然后加点样式美化一下吧,由于原理和前面是完全一致的,这里就不重复展示具体细节了。,效果如下:,20230307003446c365bb0265dbdc41e4852007d050a0d13c14b7475,然后是点击切换效果,可以用:checked来控制。,这样就可以控制不同的状态了。,2023030700344872088bb618c1c67cca17840f24d313656901bc168,还可以加点遮罩,让点击处有一种淡出弱化的效果,表示下面还有内容。,效果如下:,20230307003449c6a44d96555e31b022a120b50be923d58f1be2240,完整 demo 可以访问以下任意链接,想不到浮动布局还能实现这样的功能,总的来说,这是一种成本低廉但需要点想象力的实现方式,适应性和兼容性也都不错,下面总结一下:,[1]CSS容器查询: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries。,[2]float demo (juejin.cn): https://code.juejin.cn/pen/7201418511582199842。,[3]float demo (codepen.io): https://codepen.io/xboxyan/pen/zYJvxaN。,[4]float demo (runjs.work): ​https://runjs.work/projects/b7e36f3a248144cd。​,[5]CSS auto height expansion (juejin.cn): https://code.juejin.cn/pen/7201418292035059764。,[6]CSS auto height expansion (codepen.io): https://codepen.io/xboxyan/pen/xxawbWd。,[7]CSS auto height expansion (runjs.work): https://runjs.work/projects/5aa0d64cc2d74d09。

© 版权声明

相关文章