【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才显示,这个目前还在思考解决办法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32F407接HX711称重传感器

在许多嵌入式项目中&#xff0c;如智能家居、物流管理等&#xff0c;都需要用到精确的重量测量功能。STM32F407作为一款高性能的微控制器&#xff0c;搭配HX711称重传感器&#xff0c;可以轻松实现这一需求。本文将详细介绍如何将STM32F407与HX711称重传感器进行连接和编程&…

大模型UI:Gradio全解11——Chatbot:融合大模型的聊天机器人(4)

大模型UI&#xff1a;Gradio全解11——Chatbot&#xff1a;融合大模型的聊天机器人&#xff08;4&#xff09; 前言本篇摘要11. Chatbot&#xff1a;融合大模型的多模态聊天机器人11.4 使用Blocks创建自定义聊天机器人11.4.1 简单聊天机器人演示11.4.2 流式传输Chatbot11.4.3 添…

卷积神经网络——食物分类

整体框架&#xff1a; 导入库 导入了各种必需的Python库&#xff0c;用于数据处理、图像读取、模型构建和训练。 设置随机种子 seed_everything: 用于设置所有随机数生成器的种子&#xff0c;确保每次运行时的结果都是相同的。 图像预处理&#xff08;transform&#xff09; 对…

Dify应用-工作流

目录 DIFY 工作流参考 DIFY 工作流 2025-1-15 老规矩感谢参考文章的作者,避免走弯路。 2025-1-15 方便容易上手 在dify的一个桌面上,添加多个节点来完成一个任务。 每个工作流必须有一个开始和结束节点。 节点之间用线连接即可。 每个节点可以有输入和输出 输出类型有,字符串,…

LLM实现视频切片合成 前沿知识调研

1.相关产品 产品链接腾讯智影https://zenvideo.qq.com/可灵https://klingai.kuaishou.com/即梦https://jimeng.jianying.com/ai-tool/home/Runwayhttps://aitools.dedao.cn/ai/runwayml-com/Descripthttps://www.descript.com/?utm_sourceai-bot.cn/Opus Cliphttps://www.opu…

ASP.NET Core - 依赖注入(四)

ASP.NET Core - 依赖注入&#xff08;四&#xff09; 4. ASP.NET Core默认服务5. 依赖注入配置变形 4. ASP.NET Core默认服务 之前讲了中间件&#xff0c;实际上一个中间件要正常进行工作&#xff0c;通常需要许多的服务配合进行&#xff0c;而中间件中的服务自然也是通过 Ioc…

刷刷题刷题刷题

springaop 和 aspect aop的区别 springaop 是动态代理增强 aspect aop 是静态代理&#xff0c;在编译阶段生成aop代理类。这个时候是编译时增强 aop通知执行顺序 AOP 、OOP是啥 aop是面向切面 oop是面向对象 ComponentScan 不设置 basepackage也能进行扫描 没有配置&…

【6】Word:海名公司文秘❗

目录 题目 List.docx Word.docx List.docx和Word.docx 题目 List.docx 选中1/4全角空格复制→选中全部文本→开始→替换&#xff1a;粘贴将1/4全角空格 替换成 空格选中全部文本→插入→表格→将文本转化成表格→勾选和布局→自动调整→勾选 选中第一列&#xff0c;单机右键…

【Linux】gawk编辑器二

一、变量 gawk编程语言支持两种变量&#xff1a;内建变量和自定义变量。 1、内建变量 gawk使用内建变量来引用一些特殊的功能。 字段和记录分隔符变量 数据字段变量 此变量允许使用美元符号&#xff08;$&#xff09;和字段在记录中的位置值来引用对应的字段。要引用记录…

Kafka客户端-“远程主机强迫关闭了一个现有的连接”故障排查及解决

Kafka客户端-“远程主机强迫关闭了一个现有的连接”故障排查及解决 1. 故障现象 Kafka客户端发送数据时&#xff0c;出现“远程主机强迫关闭了一个现有的连接”错误&#xff0c;导致数据发送失败。错误信息如下&#xff1a; 2. 故障排查 【1】. 查看服务网络状态 出现故障…

机器视觉5-全连接神经网络

机器视觉5-全连接神经网络1 图像表示多层感知器全连接神经网络一、两层全连接网络表达式二、三层全连接网络表达式三、关于非线性操作的说明四、全连接神经网络的映射原理 全连接神经网络的权值一、线性分类器二、两层全连接网络三、总结 全连接神经网络线性不可分全连接神经网…

Android BottomNavigationView不加icon使text垂直居中,完美解决。

这个问题网上千篇一律的设置iconsize为0&#xff0c;labale固定什么的&#xff0c;都没有效果。我的这个基本上所有人用都会有效果。 问题解决之前的效果&#xff1a;垂直方向&#xff0c;文本不居中&#xff0c;看着很难受 问题解决之后&#xff1a;舒服多了 其实很简单&…

1️⃣Java中的集合体系学习汇总(List/Map/Set 详解)

目录 01. Java中的集合体系 02. 单列集合体系​ 1. Collection系列集合的遍历方式 &#xff08;1&#xff09;迭代器遍历&#xff08;2&#xff09;增强for遍历​编辑&#xff08;3&#xff09;Lambda表达式遍历 03.List集合详解 04.Set集合详解 05.总结 Collection系列…

聚铭网络6款产品入选CCIA《网络安全专用产品指南》

近日&#xff0c;中国网络安全产业联盟CCIA正式发布《网络安全专用产品指南》&#xff08;第二版&#xff09;&#xff08;以下简称《指南》&#xff09;。聚铭网络凭借突出技术优势、创新能力以及市场积累&#xff0c;旗下安全产品成功入选防火墙、网络安全审计、日志分析、网…

nacos环境搭建以及SpringCloudAlibaba脚手架启动环境映射开发程序

1&#xff1a;下载nacos 地址&#xff1a;https://github.com/alibaba/nacos/tags 2:选择server的zip包下载 3:启动mysql服务&#xff0c;新建数据库&#xff1a;nacos_yh 4&#xff1a;解压下载的nacos_server 进入conf目录 5&#xff1a;mysql运行sql脚本变得到下面的表 6&a…

Mac安装配置使用nginx的一系列问题

brew安装nginx https://juejin.cn/post/6986190222241464350 使用brew安装nginx&#xff0c;如下命令所示&#xff1a; brew install nginx 如下图所示&#xff1a; 2.查看nginx的配置信息&#xff0c;如下命令&#xff1a; brew info nginxFrom:xxx 这样的&#xff0c;是n…

Linux系统离线部署MySQL详细教程(带每步骤图文教程)

1、登录官网下载对应的安装包 MySQL :: Developer Zone 2、将压缩包上传到服务器上&#xff0c;这里直接上传到/usr/local路径上 使用sftp工具上传到/usr/local目录上 3、解压压缩包 tar -xf mysql-8.0.39-linux-glibc2.17-x86_64.tar.xz 4、将mysql-8.0.39-linux-glibc2.17…

鸿蒙开发实战二 TypeScript和JavaScript的区别

简介 基于第一篇文章中提到的&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/143515906 声明式开发范式&#xff1a;采用基于TypeScript声明式UI语法扩展而来的ArkTS语言&#xff0c;从组件、动画和状态管理三个维度提供UI绘制能力。 类Web开发范式&#xff1a;采…

初学stm32 --- CAN

目录 CAN介绍 CAN总线拓扑图 CAN总线特点 CAN应用场景 CAN物理层 CAN收发器芯片介绍 CAN协议层 数据帧介绍 CAN位时序介绍 数据同步过程 硬件同步 再同步 CAN总线仲裁 STM32 CAN控制器介绍 CAN控制器模式 CAN控制器模式 CAN控制器框图 发送处理 接收处理 接收过…

Mybatis-Plus:乐观锁与悲观锁

文章目录 一、场景二、乐观锁与悲观锁三、模拟修改冲突3.1 数据库中增加商品表3.2 添加数据3.3 添加实体3.4 添加mapper3.5 测试 四、乐观锁实现流程4.1 Mybatis-Plus实现乐观锁 一、场景 一件商品&#xff0c;成本价是80元&#xff0c;售价是100元。老板先是通知小李&#xf…