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

news2025/1/20 6:14:49

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.coloradmin.cn/o/2279225.html

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

相关文章

【C语言】_字符串拷贝函数strcpy

目录 1. 函数声明及功能 2. 使用示例 3. 注意事项 4. 模拟实现 4.1 第一版&#xff1a;基本功能判空const修饰 4.2 第二版&#xff1a;优化对于\0的单独拷贝 4.3 第三版&#xff1a;仿strcpy的char*返回值 1. 函数声明及功能 char * strcpy ( char * destination, cons…

大文件上传服务-后端V1V2

文章目录 大文件上传概述:minio分布式文件存储使用的一些技术校验MD5的逻辑 uploadV1 版本 1uploadv2 版本 2 大文件上传概述: 之前项目做了一个文件上传的功能,最近看到有面试会具体的问这个上传功能的细节&#xff0c;把之前做的项目拿过来总结一下&#xff0c;自己写的一个…

【k8s面试题2025】1、练气期

主要通过呼吸吐纳等方法&#xff0c;将外界的天地灵气吸入体内&#xff0c;初步改造身体&#xff0c;使身体素质远超常人。 文章目录 docker 和虚拟机的不同Kubernetes 和 docker 的关系Kube-proxy IPVS 和 iptables 的异同蓝绿发布Kubernetes中常见的数据持久化方式关于 Docke…

快速入门:如何注册并使用GPT

文章目录 ProtonMail邮箱步骤 1&#xff1a;访问Proton官网步骤 2&#xff1a;创建ProtonMail账户步骤 3&#xff1a;选择注册免费账户步骤 4&#xff1a;填写邮箱地址和手机号&#xff08;可选&#xff09;步骤 5&#xff1a;邮箱验证&#xff08;必须进行验证&#xff09;步骤…

浅谈云计算22 | Kubernetes容器编排引擎

Kubernetes容器编排引擎 一、Kubernetes管理对象1.1 Kubernetes组件和架构1.2 主要管理对象类型 二、Kubernetes 服务2.1 服务的作用与原理2.2 服务类型 三、Kubernetes网络管理3.1 网络模型与目标3.2 网络组件3.2.1 kube-proxy3.2.2 网络插件 3.3 网络通信流程 四、Kubernetes…

Vulnhub DC-8靶机攻击实战(一)

导语   Vulnhub DC-8靶机教程来了,好久没有更新打靶的教程了,这次我们在来更新一期关于Vulnhub DC-8的打靶训练,如下所示。 安装并且启动靶机 安装并且启动靶机,如下所示。 开始信息采集 进入到Kali中,通过如下的命令来查找到靶机的IP地址。 arp-scan -l根据上面的结…

自学SpringBoot笔记

概念 什么是SpringBoot&#xff1f; Spring Boot 是基于 Spring Framework 的一款开源框架&#xff0c;主要用于简化 Spring 应用程序的开发。它通过提供一系列的 开箱即用的功能 和 自动配置&#xff0c;让开发者可以快速构建生产级别的独立应用程序&#xff0c;而无需手动配…

通过学习更多样化的生成数据进行更广泛的数据分发来改进实例分割

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 本次使用的英文整理的一些记录&#xff0c;练习一下为后续SCI发表论文打好基础 Improving Instance Segmentation by Learning Wider Data Distribution with More Diverse Generative Data Abstract In…

USB3020任意波形发生器4路16位同步模拟量输出卡1MS/s频率 阿尔泰科技

信息社会的发展&#xff0c;在很大程度上取决于信息与信号处理技术的先进性。数字信号处理技术的出现改变了信息 与信号处理技术的整个面貌&#xff0c;而数据采集作为数字信号处理的必不可少的前期工作在整个数字系统中起到关键 性、乃至决定性的作用&#xff0c;其应用已经深…

提示词的艺术----AI Prompt撰写指南(个人用)

提示词的艺术 写在前面 制定提示词就像是和朋友聊天一样&#xff0c;要求我们能够清楚地表达问题。通过这个过程&#xff0c;一方面要不断练习提高自己地表达能力&#xff0c;另一方面还要锻炼自己使用更准确精炼的语言提出问题的能力。 什么样的提示词有用&#xff1f; 有…

自定义提示确认弹窗-vue

最初可运行代码 弹窗组件代码&#xff1a; &#xff08;后来发现以下代码可运行&#xff0c;但打包 typescript 类型检查出错&#xff0c;可打包的代码在文末&#xff09; <template><div v-if"isVisible" class"dialog"><div class&quo…

【JavaEE】Spring(1)

一、什么是Spring和SpringBoot Spring是Java应用程序的开发框架&#xff0c;其目的就是为了简化Java开发&#xff1b;SpringBoot是在spring框架的基础上构建的一个快速开发框架&#xff0c;其作用是进一步简化Spring程序开发 二、SpringBoot项目 2.1 创建项目 1. 设置jdk版本…

【Rust自学】13.4. 闭包 Pt.4:使用闭包捕获环境

13.4.0. 写在正文之前 Rust语言在设计过程中收到了很多语言的启发&#xff0c;而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。 在本章中&#xff0c;我们会讨论 Rust 的一…

浅谈操作系统与初识Linux

一、Linux操作系统的出现 1.1操作系统的出现以及相关的四个要素 1.2最早出现的操作系统及其创始人 起初&#xff0c;IBM为了让计算机可以以更低技术成本进行使用&#xff0c;以此来售卖计算机&#xff1b; 为计算机搭载上了Unix操作系统&#xff0c;Unix由肯汤普森用汇编语…

K8S开启/关闭审计日志

K8S默认禁用审计 开启/关闭 k8s 审计日志 默认 Kubernetes 集群不会输出审计日志信息。通过以下配置&#xff0c;可以开启 Kubernetes 的审计日志功能。 准备审计日志的 Policy 文件配置 API 服务器&#xff0c;开启审计日志重启并验证 准备审计日志 Policy 文件 apiVersio…

深入探讨DICOM医学影像中的MPPS服务及其具体实现

深入探讨DICOM医学影像中的MPPS服务及其具体实现 1. 引言 在医疗影像的管理和传输过程中&#xff0c;DICOM&#xff08;数字影像和通信医学&#xff09;标准发挥着至关重要的作用。除了DICOM影像的存储和传输&#xff08;如影像存储SCP和影像传输SCP&#xff09;&#xff0c;…

VGG (Visual Geometry Group) :深度卷积神经网络的图像识别利器

前言 在深度学习的蓬勃发展历程中&#xff0c;卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;为图像识别领域带来了革命性的突破。而 VGG&#xff08;Visual Geometry Group&#xff09;作为其中的杰出代表&#xff0c;凭借其简洁而高效的…

【机器学习实战中阶】音乐流派分类-自动化分类不同音乐风格

音乐流派分类 – 自动化分类不同音乐风格 在本教程中,我们将开发一个深度学习项目,用于自动化地从音频文件中分类不同的音乐流派。我们将使用音频文件的频率域和时间域低级特征来分类这些音频文件。 对于这个项目,我们需要一个具有相似大小和相似频率范围的音频曲目数据集…

HTML基础与实践

目录 HTML 结构 认识 HTML 标签 HTML 文件基本结构 标签层次结构 快速生成代码框架 HTML 常见标签 注释标签 标题标签: h1-h6 段落标签: p 换行标签: br 格式化标签 图片标签: img 超链接标签: a ​编辑链接的几种形式: 表格标签 基本使用 合并单元格 …

差分(前缀和的逆运算)

作用&#xff1a; 在 [ l ,r ] 数组中&#xff0c;对全部数字c 思路 原数组a 构造差分数组b使得a[i]b1b2b3...bi; a数组是b数组的前缀和,b1b2b3...bnan b[i] a[i]-a[i-1]; 在d21,那在前缀和时&#xff0c;这些a都1 在数组中&#xff0c;要l~r这段数c 在l处c后&#xff0c…