当前位置: 首页 > news >正文

实现菜单下拉伸展折叠效果demo

背景:帮后台做的一个下拉效果,原来的在手机上点击反应很慢,而且没必要加载那么多js,索性就用原生js实现了。

这是折叠的状态。

图片描述

这是展开状态,中间有个拉开过度的效果,同一时间只能有一个展开。

图片描述

点击查看效果
html代码如下

<!DOCTYPE html>
<html lang="en">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        @charset "utf-8";

        body {
            margin: 0;
            padding: 0
        }

        body {
            font-family: "PingFang-SC-Bold", "Helvetica Neue", Helvetica, Arial, "PingFang SC Regular", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;
            overflow-x: hidden;
            line-height: 1.5;
            font-size: 15px;
            color: #333;
        }

        img {
            font-size: 0;
            line-height: 0;
            border: 0;
            vertical-align: middle
        }

        * {
            outline: 0;
            -webkit-tap-highlight-color: transparent;
            -webkit-tap-highlight-color: transparent;
            box-sizing: border-box;
        }

        .head {
            color: #333;
            background-color: #f5f5f5;
            border-color: #ddd;
            padding: 10px 15px;
            border-bottom: 0;
            cursor: pointer;
        }

        .head img {
            float: right;
            width: 14px;
            margin-top: 6px;
        }

        .item {
            margin-bottom: 0;
            border-radius: 4px;
            background-color: #fff;
            border: 1px solid transparent;
            -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
            box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
            border-color: #ddd;
        }

        .item+.item {
            margin-top: 5px;
        }

        .ctx .p1 {
            font-weight: 700;
        }

        .hide {
            display: none;
        }

        .content {
            overflow: hidden;
            padding: 15px;
            border-top: 1px solid #ddd;
            font-size: 12px;
        }

        .ctx {
            overflow: hidden;
            height: 0;
            transition: height 0.3s ease;
            -webkit-transition: height 0.3s ease;
        }
    </style>
</head>

<body>
    <div class="nav">
        <div class="item">
            <div class="head">积分 <img src="https://img-blog.csdnimg.cn/2022010611382875682.png"
                    alt=""> </div>
            <div class="ctx showonce" num=0 open=1>
                <div class="content">
                    <p class="p1">一、账号被锁定</p>
                    <p class="p2">在平台发布违法信息、恶意攻击中伤他人、传播谣言、主播直播违规都将可能会被封禁账号</p>
                </div>
            </div>
        </div>
        <div class="item">
            <div class="head">金币 <img src="https://img-blog.csdnimg.cn/2022010611382882376.png"
                    alt=""></div>
            <div class="ctx hide" num=1 open=0>
                <div class="content">
                    <p class="p1">一、账号被锁定</p>
                    <p class="p2">在平台发布违法信息、恶意攻击中伤他人、传播谣言、主播直播违规都将可能会被封禁账号</p>
                    <p class="p2">在平台发布违法信息、恶意攻击中伤他人、传播谣言、主播直播违规都将可能会被封禁账号</p>
                    <p class="p2">在平台发布违法信息、恶意攻击中伤他人、传播谣言、主播直播违规都将可能会被封禁账号</p>
                    <p class="p2">在平台发布违法信息、恶意攻击中伤他人、传播谣言、主播直播违规都将可能会被封禁账号</p>
                    <p class="p2">在平台发布违法信息、恶意攻击中伤他人、传播谣言、主播直播违规都将可能会被封禁账号</p>
                    <p class="p2">在平台发布违法信息、恶意攻击中伤他人、传播谣言、主播直播违规都将可能会被封禁账号</p>
                    <p class="p2">在平台发布违法信息、恶意攻击中伤他人、传播谣言、主播直播违规都将可能会被封禁账号</p>
                </div>
            </div>
        </div>
        <div class="item">
            <div class="head">用户账号 <img src="https://img-blog.csdnimg.cn/2022010611382882376.png"
                    alt=""></div>
            <div class="ctx hide" num=2 open=0>
                <div class="content">
                    <p class="p1">一、账号被锁定</p>
                    <p class="p2">在平台发布违法信息、恶意攻击中伤他人、传播谣言、主播直播违规都将可能会被封禁账号</p>
                    <p class="p2">在平台发布违法信息、恶意攻击中伤他人、传播谣言、主播直播违规都将可能会被封禁账号</p>
                    <p class="p2">在平台发布违法信息、恶意攻击中伤他人、传播谣言、主播直播违规都将可能会被封禁账号</p>
                    <p class="p2">在平台发布违法信息、恶意攻击中伤他人、传播谣言、主播直播违规都将可能会被封禁账号</p>
                </div>

            </div>
        </div>
        <div class="item">
            <div class="head">礼物 <img src="https://img-blog.csdnimg.cn/2022010611382882376.png"
                    alt=""></div>
            <div class="ctx hide" num=3 open=0>
                <div class="content">
                    <p class="p1">一、账号被锁定</p>
                    <p class="p2">在平台发布违法信息、恶意攻击中伤他人、传播谣言、主播直播违规都将可能会被封禁账号</p>
                    <p class="p2">在平台发布违法信息、恶意攻击中伤他人、传播谣言、主播直播违规都将可能会被封禁账号</p>
                    <p class="p2">在平台发布违法信息、恶意攻击中伤他人、传播谣言、主播直播违规都将可能会被封禁账号</p>
                </div>

            </div>
        </div>
    </div>
    <script>
        var head = document.querySelectorAll('.head');
        var ctx = document.querySelectorAll('.ctx');
        var h = 0,
            c_h, i = 0,
            index, classNames,
            num = 0;
        var transitions = {
            'transition': 'transitionend',
            'WebkitTransition': 'webkitTransitionEnd'
        }
        //给有高度的元素初始化height;
        var show = document.querySelector('.showonce');
        var show_h = show.querySelector('.content').clientHeight
        show.style.height = show_h + 'px';
        // 给每个ctx监听动画结束事件
        for (var key in transitions) {
            for (var i = 0, l = ctx.length; i < l; i++) {
                ctx[i].addEventListener(transitions[key], function () {
                    if (this.getAttribute('open') == '0') {
                        this.setAttribute('class', 'ctx hide');
                    }
                })
            }
        }

        for (var i = 0; i < head.length; i++) {
            head[i].addEventListener('click', function () {
                index = this.nextElementSibling.getAttribute('num');
                for (var j = 0, l = ctx.length; j < l; j++) {
                    if ((ctx[j].getAttribute('num') == index) && (ctx[j].getAttribute('class').indexOf('hide') !=
                            -1)) {
                        ctx[j].setAttribute("open", "1");
                        ctx[j].setAttribute('class', 'ctx');
                        c_h = ctx[j].querySelector('.content').clientHeight;
                        this.querySelector('img').setAttribute('src',
                            'https://img-blog.csdnimg.cn/2022010611382875682.png'
                        )
                        ctx[j].style.height = c_h + 'px';
                    } else {
                        ctx[j].setAttribute("open", "0")
                        ctx[j].previousElementSibling.querySelector("img").setAttribute('src',
                            'https://img-blog.csdnimg.cn/2022010611382882376.png'
                        )
                        ctx[j].style.height = 0;
                    }
                }
            })
        }
    </script>
</body>

</html>

相关文章:

  • Android中的树状(tree)列表
  • 基于MVC思想实现一个简单的贪吃蛇小游戏
  • Device Tree Usage 【转】
  • 从容器到云原生 – 极致弹性
  • 【NetApp】FPolicy的使用流程图
  • Android基础---获取手机硬件数据(转)
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • k8s基本概念及入门案例
  • httplib 和 httplib2区别之 gzip解压
  • 【第四期】图片轮播代码
  • 币泳金:比特现金分叉满月比特币跌去半数,比特币为何无法稳定的反弹上升...
  • 设计模式学习笔记(2) - 工厂方法模式
  • linux 淘宝开源监控工具tsar
  • Windows Server 2016 Storage Replica
  • 用MVC做支付宝手机网页支付问题
  • python3.6+scrapy+mysql 爬虫实战
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • exif信息对照
  • iOS编译提示和导航提示
  • JSDuck 与 AngularJS 融合技巧
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Objective-C 中关联引用的概念
  • orm2 中文文档 3.1 模型属性
  • php中curl和soap方式请求服务超时问题
  • React16时代,该用什么姿势写 React ?
  • Vue.js源码(2):初探List Rendering
  • 力扣(LeetCode)21
  • 区块链将重新定义世界
  • 使用API自动生成工具优化前端工作流
  • 事件委托的小应用
  • 数组大概知多少
  • 算法之不定期更新(一)(2018-04-12)
  • kubernetes资源对象--ingress
  • 带你开发类似Pokemon Go的AR游戏
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (力扣题库)跳跃游戏II(c++)
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (原創) 物件導向與老子思想 (OO)
  • (转)setTimeout 和 setInterval 的区别
  • (转)关于多人操作数据的处理策略
  • (转)甲方乙方——赵民谈找工作
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET Core 中的路径问题
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题