CSS Transition通过改变Height实现展开收起元素


Posted in HTML / CSS onAugust 07, 2021

一个常见的开发需要,我们希望折叠元素的一部分,直到需要它为止。一些常见的框架(如 Bootstrap 和 JQuery)提供了转换效果。然而,CSS Transition 在转换高度方面给予了我们很大的灵活性。因此,您不必在项目中加入其他框架。
下面我们看看,如何使用 CSS Transition 设置 height 属性的动画效果以及其存在的问题、解决方案。
你可以在?查看效果

过渡高度

我们要实现的操作是,当点击查看更多按钮将增加元素的高度,以显示文章的所有内容,再次点击时,它将收回到原本的样子。
我们将为此创建一个 CSS 类。单击查看更多按钮时,将使用 JavaScript 将此类添加到 <article> 元素上。
首先,我们将向 HTML 文件添加一个  元素,并为其添加一些内容。

<article id="article">
  <h3>使用 CSS Transition 通过改变 Height 来展开收起元素</h3>
  <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Illo perspiciatis tempora iure accusamus rerum. Fuga porro unde, laboriosam soluta accusantium numquam quos adipisci commodi velit, expedita officia cum excepturi molestias.</p>

  <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ab doloribus optio, eaque harum blanditiis totam voluptatibus amet quibusdam veritatis animi ipsum eveniet modi aspernatur, vel repellat est commodi consequatur unde! A obcaecati soluta inventore, numquam impedit quaerat magnam incidunt sit cupiditate sequi cum. Exercitationem commodi reiciendis culpa iste optio aliquam incidunt at, ab consectetur quae est sapiente dignissimos, sit deleniti voluptatibus animi repudiandae. Itaque nemo laborum dolore numquam repudiandae mollitia quis. Placeat quis architecto eligendi distinctio quas perferendis officia voluptatem illo, nisi ullam voluptatum odio eveniet non eum vero vel dolorum deleniti adipisci culpa. Reprehenderit cum ut voluptates reiciendis iusto.</p>

  <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ab doloribus optio, eaque harum blanditiis totam voluptatibus amet quibusdam veritatis animi ipsum eveniet modi aspernatur, vel repellat est commodi consequatur unde! A obcaecati soluta inventore, numquam impedit quaerat magnam incidunt sit cupiditate sequi cum. Exercitationem commodi reiciendis culpa iste optio aliquam incidunt at, ab consectetur quae est sapiente dignissimos, sit deleniti voluptatibus animi repudiandae. Itaque nemo laborum dolore numquam repudiandae mollitia quis. Placeat quis architecto eligendi distinctio quas perferendis officia voluptatem illo, nisi ullam voluptatum odio eveniet non eum vero vel dolorum deleniti adipisci culpa. Reprehenderit cum ut voluptates reiciendis iusto.</p>

  <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ab doloribus optio, eaque harum blanditiis totam voluptatibus amet quibusdam veritatis animi ipsum eveniet modi aspernatur, vel repellat est commodi consequatur unde! A obcaecati soluta inventore, numquam impedit quaerat magnam incidunt sit cupiditate sequi cum. Exercitationem commodi reiciendis culpa iste optio aliquam incidunt at, ab consectetur quae est sapiente dignissimos, sit deleniti voluptatibus animi repudiandae. Itaque nemo laborum dolore numquam repudiandae mollitia quis. Placeat quis architecto eligendi distinctio quas perferendis officia voluptatem illo, nisi ullam voluptatum odio eveniet non eum vero vel dolorum deleniti adipisci culpa. Reprehenderit cum ut voluptates reiciendis iusto.</p>
</article>
<button id="seeMoreBtn">查看更多</button>

CSS 样式如下:

article {
  max-width: 800px;
  height: 300px;
  overflow-y: hidden;
}

/* 单击按钮时添加此类 */
article.extended {
  height: 628px;
}

button {
  padding: .6rem;
}

JavaScript 如下:

const seeMore = document.getElementById('seeMoreBtn')
const article = document.getElementById('article')

seeMore.addEventListener('click', () => {
  article.classList.toggle('extended')

  const extended = article.classList.contains('extended')
  if (extended) {
    seeMore.innerHTML = '收起内容'
  } else {
    seeMore.innerHTML = '查看更多'
  }
})

向 article 添加 CSS transition 过渡属性,使其点击按钮时内容可以丝滑的上下滑动。

article {
  max-width: 800px;
  height: 300px;
  overflow-y: hidden;
  transition: height 0.4s linear;
}

现在将它应用到你的文章,你可以看到它可以上下丝滑的滑动着,很简单、方便,但此方法存在的限制。下面我们来看看。

限制

这个限制体现在是否知其高度,以上的例子我们清楚的知道文章的高度,它工作的效果非常好,但当我们在处理动态内容时,我们不知道元素的高度,其高度也可能随着屏幕大小或其他方式进行变化。
其实解决方式也很简单,对于动态内容,元素的高度应设置为 auto。这样,任何增加或减少的元素高度都将自适应。但也会出现另一个问题:当元素的高度设置为 auto 时,CSS transition 将不起作用。
好消息是,有一种方法可以解决此问题,而不必求助于更多的 JavaScript。

解决方案

解决方法是转换 max-height 属性而不是 height 属性。首先,我们必须估计我们的元素能达到的最大高度。然后,当元素展开时,我们将该元素设置为 max-height 大于我们的估计值。
我们将 height 属性改为 max-height:

article {
    max-width: 800px;
    max-height: 300px;
    overflow-y: hidden;

    /* 增加过渡时间以适应高度 */
    transition: max-height 0.7s linear;
}

article.expanded {
    max-height: 1500px;
}

这样动画的工作原理,我们仍然得到我们想要的效果。过渡时间可能需要根据您需要的效果进行调整。

到此这篇关于CSS Transition通过改变Height实现展开收起元素的文章就介绍到这了,更多相关CSS  Height展开收起元素内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
HTML / CSS 相关文章推荐
对CSS3选择器的研究(详解)
Sep 16 HTML / CSS
CSS3轻松实现清新 Loading 效果的简单实例
Jun 06 HTML / CSS
使用CSS3制作响应式导航菜单的方法
Jul 12 HTML / CSS
老生常谈CSS中的长度单位
Jun 27 HTML / CSS
纯CSS3实现圆圈动态发光特效动画的示例代码
Mar 08 HTML / CSS
详解基于 Canvas 手撸一个六边形能力图
Sep 02 HTML / CSS
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
Apr 24 HTML / CSS
整理HTML5中表单的常用属性及新属性
Feb 19 HTML / CSS
canvas如何绘制钟表的方法
Dec 13 HTML / CSS
canvas实现圆形进度条动画的示例代码
Dec 26 HTML / CSS
POST提交数据常见的四种方式
Jan 18 HTML / CSS
常用的文件对应的MIME类型汇总
Apr 26 HTML / CSS
css3中transform属性实现的4种功能
Aug 07 #HTML / CSS
从QQtabBar看css命名规范BEM的详细介绍
Aug 07 #HTML / CSS
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
Aug 07 #HTML / CSS
CSS 实现Chrome标签栏的技巧
纯html+css实现Element loading效果
纯html+css实现奥运五环的示例代码
HTML+CSS实现导航条下拉菜单的示例代码
Aug 02 #HTML / CSS
You might like
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
Javascript attachEvent传递参数的办法
2009/12/14 Javascript
JavaScript中URL编码函数代码
2011/01/11 Javascript
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
2013/04/11 Javascript
ajax请求get与post的区别总结
2013/11/04 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
jquery validate demo 基础
2015/10/29 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
微信小程序实现倒计时补零功能
2018/07/09 Javascript
使用Vue CLI创建typescript项目的方法
2019/08/09 Javascript
python实现Floyd算法
2018/01/03 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
python 提高开发效率的5个小技巧
2020/10/19 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
HTML5中的新元素介绍
2008/10/17 HTML / CSS
YSL圣罗兰美妆英国官网:Yves Saint Laurent Beauty UK
2019/08/03 全球购物
DJI全球:DJI Global
2021/03/15 全球购物
Java面试题及答案
2012/09/08 面试题
夜大自我鉴定
2013/10/31 职场文书
《开国大典》教学反思
2014/04/19 职场文书
教师师德师风整改措施
2014/10/24 职场文书
行政司机岗位职责
2015/04/10 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
大学毕业典礼致辞
2015/07/29 职场文书
医院保洁员管理制度
2015/08/05 职场文书
素质教育培训心得体会
2016/01/19 职场文书
mysql主从复制的实现步骤
2021/10/24 MySQL