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

1. 实现效果

输入图片说明

2. 实现方法

  1. 使用 JS 获取盒子的高度,来添加对应的按钮和样式;
  2. 使用 CSS 的浮动效果,参考CSS 实现超过固定高度后出现展开折叠按钮;
  3. 使用容器查询 – container 语法;
  4. 使用 clamp 函数进行样式判断。

3. 优劣分析

  1. JS 需要在内容加载完成后来进行获取高度进行判断;
  2. CSS 的浮动首先需要你理解浮动的一些特殊特性,还需要添加一些辅助样式属性;
  3. 容器查询需要设置容器的最开始的固定高度,目前没有尝试;
  4. 本文采用的方法,使用 clamp 函数判断显示与否展示按钮。

4. 创建基础的 DOM

<div class="rui-flex-content"><div class="rui-container"><div class="rui-fwb">内容超出限制</div><input class="rui-content-check" type="checkbox" id="rui-pre" hidden /><div class="rui-content"><pre class="rui-text">
.rui-flex-content {display: flex;font-size: 20px;justify-content: space-around;
}
.rui-fwb {font-weight: bold;
}
.rui-content {--max-h: 200px;margin-top: 15px;width: 400px;max-height: var(--max-h);overflow: hidden;border-radius: 4px;outline: 2px dashed royalblue;position: relative;
}
.rui-content::before {content: '';display: block;position: absolute;bottom: clamp(-40px, calc(100% - var(--max-h)), 1px);left: 0;width: 100%;height: 40px;background-image: linear-gradient(to top, #fff, transparent);
}
.rui-text {white-space: pre-wrap;box-sizing: border-box;width: 100%;padding: 10px 15px;line-height: 1.1;margin: 0;font-size: 14px;color: #232323;
}</pre><label for="rui-pre" class="rui-btn"></label></div></div><div class="rui-container"><div class="rui-fwb">内容未超出限制</div><input class="rui-content-check" type="checkbox" id="pre" hidden /><div class="rui-content"><pre class="rui-text">.rui-content{width: 400px;max-height: 200px;overflow: hidden;border-radius: 4px;outline: 2px dashed royalblue;}</pre><label for="pre" class="rui-btn"></label></div></div></div>

5. 设置容器的样式

.rui-flex-content {display: flex;font-size: 20px;justify-content: space-around;
}
.rui-fwb {font-weight: bold;
}
.rui-content {--max-h: 200px;margin-top: 15px;width: 400px;max-height: var(--max-h);overflow: hidden;border-radius: 4px;outline: 2px dashed royalblue;position: relative;
}
.rui-text {white-space: pre-wrap;box-sizing: border-box;width: 100%;padding: 10px 15px;line-height: 1.1;margin: 0;font-size: 14px;color: #232323;
}

6. 基础效果

输入图片说明

7. 添加底部的渐变

7.1 实现分析
  1. 使用 ::before 伪元素实现过渡的渐变效果;
  2. 使用 linear-gradient(to top, #fff, transparent) 做白色到透明的渐变背景;
  3. 使用 clamp 计算渐变的定位底部位置。
7.2 实现样式
.rui-content::before {content: '';display: block;position: absolute;bottom: clamp(-40px, calc(100% - var(--max-h)), 0px);left: 0;width: 100%;height: 40px;background-image: linear-gradient(to top, #fff, transparent);
}
7.3 实现效果

输入图片说明

7.4 注意
  1. 此处在盒子小于规定的最大尺寸200px时,隐藏渐变效果的方法是将渐变定位到盒子外,用overflow:hidden进行隐藏;
  2. 也就是 clamp(-40px, calc(100% - var(–max-h)), 0px) 句代码的判断定位,但是这个条件判断存在一个问题,这个条件判断小于-40px就取-40px,大于0px就取0px,问题是如果值在-40px到0px之间时,出现线性设置bottom的值,这就不符合我们这里的显示隐藏的需求。
7.5 bug 效果

输入图片说明

  1. 这里为了看到效果,直接将渐变颜色直接设置为黑色;
  2. 可以看到当盒子的高度是175px时,计算bottom的值就是 175px - 200px = -25px,而-25px处于-40px到0px之间,因此这个时候bottom的值就是 -25px,所以出现了一半。
7.6 实际需要的效果

我们实际需要的效果是当盒子的高度小于200px时,直接将渐变定位到盒子外隐藏,大于200px时,直接取0px直接定位在盒子的底部,上边 clamp(-40px, calc(100% - var(–max-h)), 0px) 这个公式其实已经满足我们大部分需求,现在的问题就是在盒子的高度在160px到200px之间时的取值,不符合我们的需求。我们的需求是在盒子高度在 160px到200px 之间,bottom 的值也需要是 -40px,这个问题该如何解决呢?

7.7 解决办法

盒子高度在 160px到200px 之间,bottom 的值就在 -40px到0px之间取值。但是我们需要的是这个时候bottom的值是-40px,如何解决呢?将当前bottom的值乘以一个基础系数,只要最后得到的结果小于-40px就可以,当然为了处理-1px到0px之间的小数,建议这个系数最好大于1000,这个时候比如盒子高度198px,bottom的值就是 (198px - 200px)*1000 = - 2000px这个结果和-40px比较,所以取值-40px,就能满足我们的需求。

7.8 解决后效果

输入图片说明

这个时候就可以看到盒子高度 174px 时,下边的渐变遮罩层就隐藏了,满足开发需求。

7.9 优化后样式
.rui-content::before {content: '';display: block;position: absolute;bottom: clamp(-40px, calc(calc(100% - var(--max-h)) * 1000), 0px);left: 0;width: 100%;height: 40px;background-image: linear-gradient(to top, #fff, transparent);
}

8. 添加隐藏展示按钮

8.1 样式代码
.rui-btn {width: 100px;text-align: center;position: absolute;left: calc(50% - 50px);bottom: clamp(-40px, calc(calc(100% - var(--max-h)) * 1000), 0px);cursor: pointer;
}
.rui-btn::after {content: '↑';display: block;height: 40px;line-height: 40px;text-align: center;transition: 0.2s all;
}
8.2 说明
  1. 按钮的定位和遮罩层一样,在小于200px时不显示,超出200px后就展示按钮,所以定位也使用 clamp(-40px, calc(calc(100% - var(–max-h)) * 1000), 0px) 进行计算。
8.3 效果

输入图片说明

9. 添加按钮的事件样式控制

9.1 说明
  1. 使用 rui-btn:hover::after 控制按钮 hover 的时候改变字体颜色;
  2. 使用 + 选择器在 input 选中时,控制盒子的高度自适应;
  3. 使用 + 选择器将底部的按钮箭头换方向;
  4. 使用 + 选择器将底部的渐变遮罩层隐藏。
9.2 样式实现
.rui-btn:hover::after {color: royalblue;
}
.rui-content-check:checked + .rui-content {max-height: fit-content;
}
.rui-content-check:checked + .rui-content .rui-btn::after {transform: rotate(180deg);
}
.rui-content-check:checked + .rui-content::before {opacity: 0;
}
9.3 效果

输入图片说明

10. 最终效果

输入图片说明

11. 总结

  1. 学习使用 CSS 函数 clamp 函数,此函数不但能作为区间取值,还可以作为一种判断;
  2. 此效果采用的纯 CSS 实现,减少了 JS 操作判断;
  3. 需要待解决问题,就是临界值 200px 的时候,刚好 200px 不应该显示按钮,超出200px才显示,这个目前还在思考解决办法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/892977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【matlab】matlab知识点及HTTP、TCP通信

1、矩阵运算 点乘&#xff1a;对于两个同维度的向量&#xff0c;点乘结果是这两个向量对应分量的乘积之和。 点除&#xff1a;是指对两个数组的对应元素进行除法运算。 点幂&#xff1a;表示元素对元素的幂运算。 >> A[1,2,3;4,5,6]; B[1,1,1;2,2,2]>> D1B.*AD…

【git】如何删除本地分支和远程分支?

1.如何在 Git 中删除本地分支 本地分支是您本地机器上的分支&#xff0c;不会影响任何远程分支。 &#xff08;1&#xff09;在 Git 中删除本地分支 git branch -d local_branch_name git branch 是在本地删除分支的命令。-d是一个标志&#xff0c;是命令的一个选项&#x…

如何使用PHP构建IoC容器,实现依赖注入!

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…

18. C语言 结构体内存布局分析与优化

本章目录: 结构体的内存布局1. 对齐规则2. 填充与对齐 示例分析代码示例输出结果分析1. debug_size1_t 结构体2. debug_size2_t 结构体 如何优化结构体内存布局1. 成员排序优化2. 使用 #pragma pack 指令注意事项 总结 在C语言中&#xff0c;结构体&#xff08;struct&#xff…

基于微信小程序的摄影竞赛系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

人工智能-机器学习之多分类分析(项目实战二-鸢尾花的多分类分析)

Softmax回归听名字&#xff0c;依然好像是做回归任务的算法&#xff0c;但其实它是去做多分类任务的算法。 篮球比赛胜负是二分类&#xff0c;足球比赛胜平负就是多分类 识别手写数字0和1是二分类&#xff0c;识别手写数字0-9就是多分类 Softmax回归算法是一种用于多分类问题…

Azure 100 学生订阅下,使用 Docker 在 Ubuntu VPS 上部署 Misskey 的详细教程

什么是 Docker 和 Misskey&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;包括物理机、虚拟机、云服务等。使用 Docker&#xff0c…

DeepSeek-v3在训练和推理方面的优化

1. 基础架构&#xff1a;MLA&#xff0c;大幅减少了KV cache大小。&#xff08;计算量能不能减少&#xff1f;&#xff09; 2. 基础架构&#xff1a;MoE&#xff0c;同等参数量&#xff08;模型的”能力“&#xff09;下&#xff0c;训练、推理的计算量大幅减少。 3. MoE的load…

python-44-嵌入式数据库SQLite和DuckDB

文章目录 1 SQLite1.1 世界上最流行的数据库1.1 SQLite简介1.2 插入语句1.3 查询数据1.4 更新数据1.5 删除数据2 DuckDB2.1 DuckDB简介2.2 DuckDB与Python结合使用2.2.1 创建表2.2.2 分析语句2.2.3 导出为parquet文件2.3 Windows中使用DuckDB3 参考附录1 SQLite Python的一个特…

MySQL8数据库全攻略:版本特性、下载、安装、卸载与管理工具详解

大家好&#xff0c;我是袁庭新。 MySQL作为企业项目中的主流数据库&#xff0c;其5.x和8.x版本尤为常用。本文将详细介绍MySQL 8.x的特性、下载、安装、服务管理、卸载及管理工具&#xff0c;旨在帮助用户更好地掌握和使用MySQL数据库。 1.MySQL版本及下载 企业项目中使用的…

C 语言运算符的优先级和结合性

运算符的结合性和优先级 优先级运算符描述结合性1()[]->.函数调用、数组下标、结构体 / 联合体成员通过指针访问、结构体 / 联合体成员访问从左到右2!~ (前缀)-- (前缀) (一元)- (一元)* (间接寻址)& (取地址)sizeof(type)逻辑非、按位取反、前缀自增、前缀自减、一元正…

centos 7 Mysql服务

将此服务器配置为 MySQL 服务器&#xff0c;创建数据库为 hubeidatabase&#xff0c;将登录的root密码设置为Qwer1234。在库中创建表为 mytable&#xff0c;在表中创建 2 个用户&#xff0c;分别为&#xff08;xiaoming&#xff0c;2010-4-1&#xff0c;女&#xff0c;male&…

紫光无人机AI飞控平台介绍

随着无人机技术的迅猛发展&#xff0c;无人机飞控平台的智能化需求不断提升。紫光无人机AI飞控平台作为一款创新型产品&#xff0c;为用户提供了从飞行控制到任务管理的一站式解决方案&#xff0c;尤其在AI实时识别和事件分析方面具有显著优势。本文将介绍平台的核心功能、技术…

Vue3 Element-Plus el-tree 右键菜单组件

参考代码&#xff1a;实现Vue3Element-Plus(tree、table)右键菜单组件 这篇文章的代码确实能用&#xff0c;但是存在错误&#xff0c;修正后的代码&#xff1a; <template><div style"text-align: right"><el-icon size"12" color"#…

【机器学习实战入门】有趣的Python项目:使用OpenCV进行性别和年龄检测

Gender and Age Detection Python 项目 首先,向您介绍用于此高级 Python 项目的性别和年龄检测中的术语: 什么是计算机视觉? 计算机视觉是一门让计算机能够像人类一样观察和识别数字图像和视频的学科。它面临的挑战大多源于对生物视觉有限的了解。计算机视觉涉及获取、处…

AutoAlign实体对齐方法的详细工作原理和在大规模知识图谱中的应用

AutoAlign是一种全自动且高效的知识图谱对齐方法&#xff0c;其工作原理主要基于大型语言模型&#xff08;LLM&#xff09;&#xff0c;如ChatGPT和Claude&#xff0c;通过构建谓词邻近图和实体嵌入模块来实现实体和谓词的自动对齐。这种方法不需要人工标注种子对齐&#xff0c…

【2025最新】国内中文版 ChatGPT镜像网站整理合集,GPT最新模型4o1,4o,4o-mini分类区别,镜像站是什么

1.快速导航 原生中转型镜像站点 立即Chat支持GPT4、4o以及o1,canvs等&#xff0c;同步官网功能 AIChat.com 支持最新4O 2.两者对比 官网立即Chat访问难度需要魔法直接访问支付手段国际支付国内支付封禁策略检测节点&#xff0c;随时封禁不会封禁价格每月140元订阅费用每年70元…

事务机制及Spring事务管理

事务概览 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位。 事务会将所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;换句话说&#xff1a;这些操作要么同时成功、要么同时失败。 具体案例 我们先看一个需求&#xff1a;现在有两张数据库表&…

java请编写程序,分别定义8种基本数据类型的变量,并打印变量的值。

为什么输出的是总和&#xff0c;而不是单个的换行的8行输出 public static void main(String[] args) {byte a 100;short b12345;int c 654321;long d 123456789;float e 1.5f;double f 123.456;boolean g false;char h a;System.out.println(a\nb\nc\nd\ne\nf\nString.valueO…

CCLINKIE转ModbusTCP网关,助机器人“掀起”工业智能的“惊涛骇浪”

以下是一个稳联技术CCLINKIE转ModbusTCP网关&#xff08;WL-CCL-MTCP&#xff09;连接三菱PLC与机器人的配置案例&#xff1a;设备与软件准备设备&#xff1a;稳联技术WL-CCL-MTCP网关、三菱FX5UPLC、支持ModbusTCP协议的机器人、网线等。 稳联技术ModbusTCP转CCLINKIE网关&…