CSS3+HTML5+JS 实现一个块的收缩与展开动画效果


Posted in HTML / CSS onNovember 17, 2020

最近在做项目时,发现CSS3中关于动画的技术,自己很少运用在项目中,平时一些列表块的收缩和展开动画效果,几乎都是使用 display 的 none 和 block,或者 visibility 的 hidden 和 visible 来进行控制。因此,在最近的项目中,就开始深入研究CSS3关于动画的技术,并且运用到了项目中,下面是关于列表块的收缩&展开动画。

简单的一个效果图

 CSS3+HTML5+JS 实现一个块的收缩与展开动画效果

实现思路

大体上我们将列表块分割成 标题块 和 内容块

(1)标题块: 展示标题和一个带有收缩&展开动画效果的图标

①图标部分,我们可以使用伪类来绘画出箭头,并且使用 transform 的旋转属性 rotate 进行图标的方向控制和其动画效果

②动画控制,通常点击标题部分,列表则收缩&展开,因此点击标题时,要对class进行控制。

(2)内容块:内容块展示内容,且该块承载了主要的动画效果——列表的收缩&展开

①动画效果:该块的动画,我们的思路是整个块的高度收起来,里面的内容也向左边隐藏,因此需要控制高度和动画的隐藏,所以使用 max-height 进行高度控制和 transition(设置动画时间)、transform 的属性 translate 来进行内容的隐藏

完整代码如下:

<!DOCTYPE html>
   <html>
   <head>
       <title></title>
       <style type="text/css">
           .block_wrap {
               width: 500px;
               margin: 0 auto;
               border: 1px solid #e3e3e3;
              border-radius: 10px;
          }
          .chapter_wrap {
              background: white;
             text-align: left;
             border-radius: 8px;
            color: #333333;
            margin-bottom: 15px;
             font-size: 14px;
           overflow: hidden;
       }
       .title_item_wrap {
             padding: 10px 10px 10px 0;
           margin: 0 10px 0 10px;
           border-bottom: none;
            display: flex;
             align-items: center;
        }
         /*使用伪类进行图标绘画*/
         .title_item_wrap::after {
            content: '';
            width: 10px;
             height: 10px;
             border-top: 2px solid #999999;
             border-right: 2px solid #999999;
            transform: rotate(-45deg);
            display: inline-block;
           transition: 0.3s;
            float: right;
            margin-top: 10px;
       }
        /*使用类acitve类控制图标的旋转和展开时标题的下边界*/
        .active {
             border-bottom: 1px solid #F0F0F0;
        }
        .active::after{
            transform: rotate(135deg);
            margin-top: 5px;
         }
        .chapter_title {
             font-size: 16px;
             padding: 0;
            margin: 0;
             width: calc(100% - 30px);
        }
         .node_wrap {
             overflow: hidden;
             overflow-y: scroll;
             transition: 0.3s;
         }
         .node_wrap p {
           padding: 0 20px 5px 20px;
            margin: 10px 0;
            border-bottom: 1px solid #e3e3e3
        }
        /*隐藏内容块的滑动条*/
        .node_wrap::-webkit-scrollbar {
            display: none;
        }
        /*控制内容块隐藏 隐藏时,整块向左边平移200%的宽度,并且将最大高度设置为0,否则页面会留有空白*/
        .node_wrap_hide {
             transform: translate(-200%, 0);
             max-height: 0;
        }
        /*控制内容块显示,显示时,整块向右边复原,并且将最大高度设置为300px,里面的内容即会将块撑开*/
        .node_wrap_show {
            transform: translate(0, 0);
          max-height: 300px;
       }
    </style>
 </head>
 <body>
    <div class="block_wrap">
        <div id="block_wrap" class="title_item_wrap active">
            <p class="chapter_title">章节名称</p>
        </div>
        <div id="list_wrap" class="node_wrap node_wrap_show">
             <p>节名称一</p>
            <p>节名称二</p>
           <p>节名称三</p>
           <p>节名称四</p>
             <p>节名称五</p>
            <p>节名称六</p>
            <p>节名称七</p>
             <p>节名称八</p>
             <p>节名称九</p>
            <p>节名称十</p>
       </div>
     </div>
 </body>
 <script type="text/javascript">
     // 获取标题元素
   var block_wrap = document.getElementById('block_wrap')

    //给标题元素添加点击事件,通过点击控制class的添加&去除达成动画效果
     block_wrap.onclick = function() {
        // 获取标题元素className集合
        let classArray = this.className.split(/\s+/)

        // 获取内容块元素
        let list_wrap = document.getElementById('list_wrap')
 
        // 判断标题元素是否有类active,如若存在,则说明列表展开,这时点击则是隐藏内容块,否则显示内容块
         if (classArray.includes('active')) {
            // 隐藏内容块
            block_wrap.classList.remove('active')
             list_wrap.classList.remove('node_wrap_show')
           list_wrap.classList.add('node_wrap_hide')
             console.log(this.className.split(/\s+/))
             return
        } else {
           // 显示内容块
            block_wrap.classList.add('active')
            list_wrap.classList.add('node_wrap_show')
            list_wrap.classList.remove('node_wrap_hide')
            return
         }
     }
 </script>
 </html>

以上代码直接复制到HTML文件保存后即可看到效果。此动画效果适应移动端,PC端会有点瑕疵,稍微处理即可。

到此这篇关于CSS3+HTML5+JS 实现一个块的收缩与展开动画效果的文章就介绍到这了,更多相关html5展开收缩动画内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

HTML / CSS 相关文章推荐
网页切图的CSS和布局经验与要点
Apr 09 HTML / CSS
6种非常炫酷的CSS3按钮边框动画特效
Mar 16 HTML / CSS
CSS3实现多重边框的方法总结
May 31 HTML / CSS
Html5之svg可缩放矢量图形_动力节点Java学院整理
Jul 17 HTML / CSS
html5标记文字_动力节点Java学院整理
Jul 11 HTML / CSS
HTML5的结构和语义(5):内嵌媒体
Oct 17 HTML / CSS
HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍
Jan 30 HTML / CSS
HTML5 Canvas——用路径描画线条实例介绍
Jun 09 HTML / CSS
使用phonegap操作数据库的实现方法
Mar 31 HTML / CSS
html5 Canvas实现图片旋转的示例
Jan 15 HTML / CSS
移动端HTML5开发神器之vconsole详解
Dec 15 HTML / CSS
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
Apr 07 HTML / CSS
10种CSS3实现的loading动画,挑一个走吧?
Nov 16 #HTML / CSS
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
Nov 16 #HTML / CSS
CSS3 实现穿梭星空动画
Nov 13 #HTML / CSS
CSS3 实现图形下落动画效果
Nov 13 #HTML / CSS
css3实现平移效果(transfrom:translate)的示例
Nov 13 #HTML / CSS
CSS3 文字动画效果
Nov 12 #HTML / CSS
css3弹性盒子flex实现三栏布局的实现
Nov 12 #HTML / CSS
You might like
粗略计算在线时间,bug:ip相同
2006/12/09 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
验证坐标在某坐标区域内php代码
2016/10/08 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
让jQuery与其他JavaScript库并存避免冲突的方法
2013/12/23 Javascript
javaScript 页面自动加载事件详解
2014/02/10 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
flag和jq on 的绑定多个对象和方法(必看)
2017/02/27 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
修改Nodejs内置的npm默认配置路径方法
2018/05/13 NodeJs
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
[51:28]EG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/16 DOTA
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
Python多层嵌套list的递归处理方法(推荐)
2016/06/08 Python
详解Python import方法引入模块的实例
2017/08/02 Python
rabbitmq(中间消息代理)在python中的使用详解
2017/12/14 Python
python生成1行四列全2矩阵的方法
2018/08/04 Python
pandas.cut具体使用总结
2019/06/24 Python
Python 如何实现访问者模式
2020/07/28 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
销售总监岗位职责
2014/01/04 职场文书
小学生读书感言
2014/02/12 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
企业元宵节主持词
2014/03/25 职场文书
年终奖发放方案
2014/06/02 职场文书
交通工程专业推荐信
2014/09/06 职场文书
党员进社区活动总结
2015/05/07 职场文书
2015中学教学工作总结
2015/07/22 职场文书
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python