响应式导航保持隐藏在窗口调整大小(纯JS)

时间:2014-08-21 23:48:00

标签: javascript html css css3 responsive-design

我一直在寻找解决方案超过十个小时,仅限今天,并且在此之前已经搜索了很多天。我在这里问一个问题,因为如果这样的话,我很快就会把头发撕掉。

我的问题:我有一个响应式导航,看起来像桌面大小的屏幕上的常规导航栏,当窗口缩小或设备宽度变得太小时会转换为下拉菜单。在媒体查询面前,我想我已经涵盖了所有内容。

Javascript是导致问题的原因。让我解释一下:

  • 桌面导航在调整窗口大小时缩小
  • 点击打开/关闭收缩菜单会使列表项弹出/隐藏而不会出现问题
  • 当窗口调整为原始宽度(菜单关闭)时导航保持隐藏状态

以下两个例子来说明我的意思。

Responsive menu hidden on window resize

Responsive navigation hidden on window resize

我知道人们可能会提出什么建议:只要让它与jQuery一起使用,就会有许多工作示例。虽然这可能是真的,但我根本不熟悉jQuery,如果可以的话,我宁愿不为此使用整个库。我对JavaScript也不是很有经验,但我更喜欢纯粹的JS方法。

HTML

   <header class="header" id="return">
    <div class="floatWrapper">

        <nav class="grid70"  >

            <input type="button" onclick="toggle(navi)"/>
                <ul class="allGrids navigation grid1" id="navi">
                            <li><a data-scroll href="#profil">About</a></li>
                            <li><a data-scroll href="#competences">Skills</a></li>
                            <li><a data-scroll href="#parcours">Work</a></li>
                            <li><a data-scroll href="#contact">Contact</a></li>
                </ul>
        </nav>

    </div>
    </header>

CSS

       *,
    :after,
    :before{

        -moz-box-sizing: border-box;
        -webkit-box-sizing: border-box;
        -ms-box-sizing:border-box;
        box-sizing: border-box;
        word-wrap:break-word;
    }

    html, body{

        padding: 0px;
        margin: 0px;
        height: 100%;
        width: 100%;
        font-size: 100%;
    }
    ul, li{

        list-style-type: none;
        padding:0;
        margin:0;

    }
    a{

        text-decoration: none;
    }
    .floatWrapper{
        width: 90%;
        max-width: 1120px;
        margin:0 auto;


    }
    .floatWrapper:before,
    .floatWrapper:after {
      content:"";
      display:block;
    }

    .floatWrapper:after {
      clear:both;
    }
    .allGrids{

            height: auto;
            float:left;
            margin: 1% 0%;
            display:block;
        }

    .grid1{

            width: 100%;
            margin:1% 0;

    }


.grid70{
    width: 66%;
}

    .header{
         position: fixed;
         top: 0;
         left:0;
         width:100%;
         z-index: 100000;
         padding:0;
         height: auto;
          -moz-transition: all .2s ease-in-out;
         -webkit-transition: all .2s ease-in-out;
         -ms-transition: all .2s ease-in-out;
         -o-transition: all .2s ease-in-out;
         transition: all .2s ease-in-out;

     }
    .header input{

        display:none;
    }
    .header .floatWrapper .grid70{

        float:right;
    }
    .navigation{

        margin:0;
        padding: 0;

    }
    .navigation li{

                float:left;
                font-family: "Century Gothic", CenturyGothic, AppleGothic, sans-serif;
                width: 24%;
                margin-left: .3%;
                padding-top:0;
                border-radius: 0 0 10px 10px;
            }

.navigation li:nth-child(odd) a{

    background: orange;
}

    .navigation li a{

                    display: block;
                    color: black;
    background-color: lightblue;
                    text-decoration: none;
                    word-wrap: normal;
                    padding-right: 8%;
                    height:4em;
                    line-height: 5.5em;
                    text-align : right;
                    border-radius: 0 0 10px 10px;
                    -moz-transition-proprety: background-color height;
                    -moz-transition-duration : 1s;
                    -webkit-transition-proprety: background-color height;
                    -webkit-transition-duration : 1s;
                    -ms-transition-proprety: background-color height;
                    -ms-transition-duration : 1s;
                    -o-transition-proprety: background-color height;
                    -o-transition-duration : 1s;
                    transition-proprety: background-color height;
                    transition-duration : 1s;


                }
    .navigation li:hover a{

                        box-shadow: 1px 2px 4px black; 
                        height:6em;
                        line-height: 8.5em;
                        -moz-transition-proprety: background-color height;
                        -moz-transition-duration : 1s;
                        -webkit-transition-proprety: background-color height;
                        -webkit-transition-duration : 1s;
                        -ms-transition-proprety: background-color height;
                        -ms-transition-duration : 1s;
                        -o-transition-proprety: background-color height;
                        -o-transition-duration : 1s;
                        transition-proprety: background-color height;
                        transition-duration : 1s;

                }

@media screen and (max-width: 769px) {
.header{

            padding:0;
            position:fixed;
            background-color: #22313F;
            border-top:none;
    }
.header .floatWrapper{

    padding-top: 1em;
    padding-bottom: 1em;
    position: relative;
    z-index:15000;
        width: 100%;
}
.header .floatWrapper .grid70{

        width: 2em;
        height: 2em;
        padding:0;
        float:right;
        margin-right: 5%;
}
.header .floatWrapper .grid70 input{
        display:block;
        color:#22313F;
        width: 100%;
        height: 100%;
        background-color: #6C7A89;
        padding:0;
        margin: 0;
    }
.header .floatWrapper .grid70 .navigation{

        position:absolute;
        top:70%;
        left:0%;
        display:none;
  padding-top: 15px;
    }
  .header .floatWrapper .grid70:hover .navigation {

        max-height: 1000px;
        display:block;
    }
.navigation li{

        width: 100%;
        padding:0;
        border-radius:0;
        margin-left: 0;
    }

.navigation li a {

        text-align: left;
        height: auto;
        line-height: 40px;
        border-radius:0;
        word-wrap:break-word;
        padding:1.5%;
        font-size: 18px;
    }
.navigation li:hover a{

                    box-shadow: none;
                    color:black;
                    height: auto;
                    line-height: 40px;

            }   
}

的JavaScript

var is_touch_device = 'ontouchstart' in document.documentElement;
if(is_touch_device){
   //code for touch devices


   function toggle(navi) {

        var tag=document.getElementById("navi");
        tag.style.display = tag.style.display === 'block' ? 'none' : 'block';
// set as defaut oposite defaut active value in document 
// here defaut is set to block cause it is none in CSS
    }
}

我非常清楚导致问题的原因不仅仅是这个JS片段。在移动设备上,它就像一个魅力。

由于.grid70上仍然启用了悬停,因此它也适用于桌面浏览器,但仅适用于Firefox。 Chrome,IE和Opera会检测到触摸并在点击几次后(当调整窗口大小时)使导航无法使用。

这是一个JSbin:http://jsbin.com/ziqij/1/edit?html,css,js,output

悬停仍然有效的原因是因为我认为触摸屏检测功能正常...并希望将鼠标悬停在桌面上/ onclick on mobile。

我现在意识到,我最好还是使用单击式解决方案和桌面触摸屏帐户。

任何帮助/见解都会非常感激。

拼命, 菲尔

0 个答案:

没有答案