实现手风琴效果的四种方法

1.hover

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .list {
            width: 200px;
            margin: 0 auto;
        } 
        .list h3 {
            height: 40px;
            line-height: 40px;
            font-size: 16px;
            font-weight: bold;
            display: block;
            cursor: pointer;
            border-bottom: 1px solid #ddd;
        }
        .list ul {
            display: none; 
            margin-left: 25px;
            -webkit-transition: all 0.5s linear;
            transition: all 0.5s linear;
        }
        .list:hover ul {
            display: block;
        }
    </style>
</head>
<body>
    <div class="list">  
        <h3>导航一</h3>
        <ul>
            <li>菜单1</li>
            <li>菜单2</li>
            <li>菜单3</li>
            <li>菜单4</li>
        </ul>
    </div> 
    <div class="list">  
        <h3>导航二</h3>
        <ul>
            <li>菜单1</li>
            <li>菜单2</li>
            <li>菜单3</li>
            <li>菜单4</li>
        </ul>
    </div> 
    <div class="list">  
        <h3>导航三</h3>
        <ul>
            <li>菜单1</li>
            <li>菜单2</li>
            <li>菜单3</li>
            <li>菜单4</li>
        </ul>
    </div> 
    <div class="list">  
        <h3>导航四</h3>
        <ul>
            <li>菜单1</li>
            <li>菜单2</li>
            <li>菜单3</li>
            <li>菜单4</li>
        </ul>
    </div>  
</body>
</html>

2.target

  • 目标伪类选择器:target
    URL 带有后面跟有锚名称 #,指向文档内某个具体的元素。这个被链接的元素就是目标元素(target element)。
    :target 选择器可用于选取当前活动的目标元素。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css"> 
        .list {
            width: 200px;
            margin: 0 auto;
            list-style: none;
        }
        .list li a {
            color: #000;
            height: 40px;
            line-height: 40px;
            display: block;
            font-weight: bold;
            margin-bottom: 5px;
            text-decoration: none;
        }
        .list li ul{
            line-height: 30px;
            display: none;
            overflow: hidden;
            -webkit-transition: all 0.5s linear;
            transition: all 0.5s linear;
        }
        .list li:target ul{
            display: block;
            border-top: 1px solid #ccc;
        }
    </style>
</head>
<body>
    <ul class="list">
        <li id="one"><a href="#one">导航一</a>
            <ul>
                <li>菜单1</li>
                <li>菜单2</li>
                <li>菜单3</li>
                <li>菜单4</li>
            </ul>
        </li>
        <li id="two"><a href="#two">导航二</a>
            <ul>
                <li>菜单1</li>
                <li>菜单2</li>
                <li>菜单3</li>
                <li>菜单4</li>
            </ul>
        </li>
        <li id="three"><a href="#three">导航三</a>
            <ul>
                <li>菜单1</li>
                <li>菜单2</li>
                <li>菜单3</li>
                <li>菜单4</li>
            </ul>
        </li>
        <li id="four"><a href="#four">导航四</a>
            <ul>
                <li>菜单1</li>
                <li>菜单2</li>
                <li>菜单3</li>
                <li>菜单4</li>
            </ul>
        </li>
    </ul>
</body>
</html>

3.checked

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .list {
            width: 200px;
            margin: 0 auto;
        }
        label {
            height: 40px;
            line-height: 40px;
            font-size: 16px;
            font-weight: bold;
            display: block;
            cursor: pointer;
            border-bottom: 1px solid #ddd;
        }
        input {
            display: none;
        }
        .list ul {
            display: none; 
            -webkit-transition: all 0.5s linear;
            transition: all 0.5s linear;
        }
        #list1:checked + ul {
            display: block;
        }
        #list2:checked + ul {
            display: block;
        }
        #list3:checked + ul {
            display: block;
        }
        #list4:checked + ul {
            display: block;
        }
    </style>
</head>
<body>
<!-- 点击label选中对应的ul -->
    <div class="list">
        <label for="list1">导航一</label>
        <input type="radio" name="list" id="list1" checked="checked">
        <ul>
            <li>菜单1</li>
            <li>菜单2</li>
            <li>菜单3</li>
            <li>菜单4</li>
        </ul>
        <label for="list2">导航二</label>
        <input type="radio" name="list" id="list2">
        <ul>
            <li>菜单1</li>
            <li>菜单2</li>
            <li>菜单3</li>
            <li>菜单4</li>
        </ul>
        <label for="list3">导航三</label>
        <input type="radio" name="list" id="list3">
        <ul>
            <li>菜单1</li>
            <li>菜单2</li>
            <li>菜单3</li>
            <li>菜单4</li>
        </ul>
        <label for="list4">导航四</label>
        <input type="radio" name="list" id="list4">
        <ul>
            <li>菜单1</li>
            <li>菜单2</li>
            <li>菜单3</li>
            <li>菜单4</li>
        </ul>
    </div>
</body>
</html>

4.JavaScript

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .list {
            width: 200px;
            margin: 0 auto;
        } 
        .list h3 {
            height: 40px;
            line-height: 40px;
            font-size: 16px;
            font-weight: bold;
            display: block;
            cursor: pointer;
            border-bottom: 1px solid #ddd;
        }
        .list ul {
            height: 0;
            overflow: hidden;
            margin-left: 25px;
        }
    </style>
</head>
<body>
    <div class="list">  
        <h3>导航一</h3>
        <ul>
            <li>菜单1</li>
            <li>菜单2</li>
            <li>菜单3</li>
            <li>菜单4</li>
        </ul>
    </div> 
    <div class="list">  
        <h3>导航二</h3>
        <ul>
            <li>菜单1</li>
            <li>菜单2</li>
            <li>菜单3</li>
            <li>菜单4</li>
        </ul>
    </div> 
    <div class="list">  
        <h3>导航三</h3>
        <ul>
            <li>菜单1</li>
            <li>菜单2</li>
            <li>菜单3</li>
            <li>菜单4</li>
        </ul>
    </div> 
    <div class="list">  
        <h3>导航四</h3>
        <ul>
            <li>菜单1</li>
            <li>菜单2</li>
            <li>菜单3</li>
            <li>菜单4</li>
        </ul>
    </div>  
    <script src="Move.js"></script>
    <script>
        var divs = document.querySelectorAll('.list');
        var uls = document.querySelectorAll('ul');
        var length = uls.length;
        for(var i = 0; i < length; i++) {
            divs[i].index = i;
            divs[i].onmouseover = function() {
                for(var j = 0; j < length; j++) {
                    Move(uls[j], {'height': 0}, 30);
                }
                Move(uls[this.index], {'height': 85}, 30);
            }
            divs[i].onmouseout = function() {
                for(var j = 0; j < length; j++) {
                    Move(uls[j], {'height': 0}, 30);

                }
            }
        }
        
    </script>
</body>
</html>
  • Move:
function getStyle(obj, attr) {
    if(obj.currentStyle) {    //IE
        return obj.currentStyle[attr];
    }else {
        return getComputedStyle(obj, false)[attr];
    }
}
function Move(obj, json, second, fn) {

    clearInterval(obj.time);

    obj.time = setInterval(function() {

        var flag = true;  // flag记录是否执行完成
        for(var key in json) {
            // 1.取当前的值
            var temp = 0;
            temp = parseFloat(getStyle(obj, key));

            //2.计算速度
            var speed = (json[key] - temp) / 8;
            speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);

            // 3. 监测停止
            if(temp != json[key]) {
                flag = false;   //flag 为 false 说明同时执行的属性没有执行完
                obj.style[key] = temp + speed + "px";
            }
        }
        //判断同时执行的属性,是否都执行完,若是则停止定时器
        if(flag == true) {
            clearInterval(obj.time);
            if(fn) {  
                fn();
            }
        }
    }, second);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • <a name='html'>HTML</a> Doctype作用?标准模式与兼容模式各有什么区别? (1)、<...
    clark124阅读 3,554评论 1 19
  • 转载请声明 原文链接地址 关注公众号获取更多资讯 第一部分 HTML 第一章 职业规划和前景 职业方向规划定位...
    前端进阶之旅阅读 16,620评论 32 459
  • 所以你学会了基础的id,类和后代选择符,然后你就一直用它们了吗?如果是这样,你丢失了(css的)巨大的灵活性。在本...
    xxiao1988阅读 566评论 0 2
  • 春子老师 在过去的两个周,我先后接待了两对少年少女,基本是为了感情问题和我这个没有代沟的老师聊天。看着他们纠结着、...
    栾春子阅读 1,153评论 0 0
  • 冰山漏出海面的部分只有它整体的八分之一。虽无法看到水面下的八分之七,却可以感觉出冰山整体的厚重感。以前读《老人与海...
    齐思宇阅读 254评论 0 0