自适应导航条js原生版

自适应导航条js原生版

看到bootstrap等第三方库中的导航条非常简单好用,没想到自己用原生试着实现用了这么多行代码😳

效果如下:





实现思路:

html+css:
  1. 最外层nav宽度100%。高给固定值
  2. 中间内容部分全部用一个div包裹,宽度百分比,margin: 0 auto; 实现居中
  3. 左侧的logo图片外包div,给的固定宽高
  4. 中间的navbar包裹ul列表用的百分比宽度,使其宽度能够在屏幕缩放的时候随之变化
  5. 右侧按钮部分隐藏
  6. 媒体查询屏幕宽度<768px时,将navbar定位至nav下方,高度给0,并将按钮显示
js:
  1. 用布尔值作为开关控制点击状态
  2. 先设置bol = true,让判断走if语句
  3. 点击一次后,定时器执行navbar和nav的高度增大至预设值,关闭定时器
  4. 定时器后将bol改为false,这样下次点击就会执行else中语句
  5. else中定时器控制nav及navbar高度减小至预设值,关闭定时器
  6. 定时器后将bol再改为true,这样下次点击就会执行if中语句
遇到的坑:

遇到的比较棘手的问题就是开关状态、点击事件、定时器到底该如何嵌套,不过最后还是把思路理清楚了

  1. 先用布尔值判定是走if语句(高度+)还是else语句(高度-)
  2. 再到点击按钮
  3. 点击按钮后再触发定时器
  4. 高度变化至设定值时关闭定时器,及改变布尔值

还有个问题就是因为navbar定位之后失去了撑开下方区块的功能,最后只能将父级nav的高度同步增大,不知道是不是有点绕了

上代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自适应导航栏</title>
    <style>
        /*简单清除默认样式*/
        * {
            margin: 0;
            padding: 0;
        }
        
        /*导航宽屏时主体部分*/
        nav {
            width: 100%;
            height: 50px;
            background-color: #444;
            overflow: hidden;
            min-width: 320px;
        }
        .nav {
            max-width: 80%;
            margin: 0 auto;
            height: 50px;
        }
        .logo {
            width: 50px;
            height: 50px;
            float: left;
        }
        .logo img {
            width: 100%;
            display: block;
        }

        .navbar {
            width: 80%;
            height: 50px;
            float: right;
        }
        .navbar ul {
            list-style: none;
            height: 50px;
            overflow: hidden;
            float: right;
        }
        .navbar li {
            height: 50px;
            float: left;
            padding: 0 10px;
        }
        .navbar a {
            display: block;
            width: 100%;
            height: 50px;
            line-height: 50px;
            text-decoration: none;
            text-align: center;
            color: #fff;
            font-size: 16px;
            font-weight: bold;
        }
        
        /*媒体查询屏幕宽度小于768px时生效以下效果*/
        @media screen and (max-width: 768px) {
            /*
                1、navbar定位到nav下方,宽度撑满屏幕
                2、高度给成0
                3、超出部分不显示
                4、其他样式相应调整
            */
            .navbar {
                float: right;
                position: absolute;
                top: 50px;
                left: 0;
                width: 100%;
                height: 0px;
                background-color: #444;
                overflow: hidden;
            }
            .navbar ul {
                width: 100%;
                height: 200px;
            }
            .navbar li {
                width: 80%;
                margin: 0 auto;
                float: none;
            }
            .navbar a { text-align: left; }
        }
        
        /*按钮部分,宽屏时是隐藏的*/
        .btn {
            border: 0;
            border-radius: 5px;
            margin-top: 5px;
            width: 40px;
            height: 40px;
            background-color: #aaa;
            float: right;
            display: none;
            opacity: 0.8;
            transition: all 0.5s;
            cursor: pointer;
        }
        .btn:hover { opacity: 1; }
        .btn span {
            display: block;
            width: 60%;
            height: 5px;
            border-radius: 5px;
            margin: 6px 20%;
            background-color: #fff;
        }
        
        /*媒体查询屏幕宽度小于768px时,按钮出现*/
        @media screen and (max-width: 768px) {
            .btn { display: block; }
        }
        
        /*内容部分*/
        .content{
            width: 100%;
            height: 500px;
            background-color: #ddd;
            /*overflow: hidden;*/
        }
        .content h2{
            width: 80%;
            margin: 0 auto;
            height: 50px;
            line-height: 50px;
            text-align: center;
            font-size: 60px;
            color: #fff;
            padding-top: 50px;
        }
        @media screen and (max-width: 768px) {
            .content h2{
                font-size: 40px;
            }
        }
    </style>
</head>
<body>
    <nav>
        <div class="nav">
            <div class="logo">[站外图片上传中……(5)]</div>
            <div id="btn" class="btn">
                <span></span>
                <span></span>
                <span></span>
            </div>
            <div id="navbar" class="navbar">
                <ul>
                    <li><a href="#">首页</a></li>
                    <li><a href="#">公司简介</a></li>
                    <li><a href="#">产品介绍</a></li>
                    <li><a href="#">联系方式</a></li>
                </ul>
            </div>  
        </div>  
    </nav>
    <div id="content" class="content">
        <h2>这是下方内容</h2>
    </div>
</body>
<script>
    
    //获取节点
    var btn = document.getElementById('btn');
    var navbar = document.getElementById('navbar');
    var nav = document.getElementsByTagName('nav')[0];

    //设置布尔值作为开关
    var bol = true;

    //设置定时器
    var timer = null;

    //设定navbar(就是会移到下方的部分)
    var t = navbar.offsetHeight;
    var maxH = 200;
    var minH = 0;

    //设定nav(就是最外面的父级)
    //因为navbar已经定位,所以他无法将下方内容顶开,所以需要同时变更父级的高度来顶开下方内容
    var navT = nav.offsetHeight;
    var navMaxH = 250;
    var navMinH = 50;

    btn.onclick = function () {
        
        // 判定布尔值
        if (bol){
            
            navbar.style.borderTop = "1px solid #fff";

            timer = setInterval(function () {
                t+=10;
                navT+=10;

                //父级nav上限
                if (navT>=navMaxH){
                    navT = navMaxH;
                }

                // navbar上限
                if (t>=maxH){
                    t = maxH;
                    navT = navMaxH;
                    clearInterval(timer);
                }

                navbar.style.height = t + 'px';
                nav.style.height = navT + 'px';

            }, 10)
            //布尔值改为false,下次点击时,就会执行else中的语句
            bol = false;
        }else{
            
            navbar.style.borderTop = "0";
            
            timer = setInterval(function () {
                t-=10;
                navT-=10;

                //父级nav下限
                if (navT<=navMinH){
                    navT = navMinH;
                }
                
                //navbar下限
                if (t<=minH){
                    t = minH;
                    navT = navMinH;
                    clearInterval(timer);
                }

                navbar.style.height = t + 'px';
                nav.style.height = navT + 'px';

            }, 10)

            //布尔值改为true,下次点击时,就会执行if中的语句
            bol = true;
        }
    }
</script>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,327评论 0 17
  • 第5章 菜单、按钮及导航 一、下拉菜单 小伙伴们注意,在Bootstrap框架中的下拉菜单组件是一个独立的组件,根...
    凛0_0阅读 4,911评论 0 66
  • 给妹妹的一封信 打开书桌的抽屉,里面有你当时写给我的贺卡和信,里面的话语,在现在的你看来是稚嫩的,姐姐读来却有久违...
    夏鸣阅读 862评论 0 1
  • 晚上牛牛一直黏着我,除了看电视那一会儿,我到哪他跟到哪。于是跟他一起看书,一起玩扑克,看着时间不早了,准备洗...
    未曾到达的彼岸阅读 142评论 0 0
  • 生下来,活下去,如此简单如此难!人,一辈子都在忙着,累着,奔波着,不论多苦,事,还是没做完。人,一辈子都在省着,攒...
    周鸿_MissZhou阅读 556评论 0 1