簡體   English   中英

響應式設計 - 如何切換菜單的可見性

[英]Responsive Design - how to toggle a menu's visibility

更新

在這里有一篇關於 jsfiddles 的新帖子和一個更清晰的問題。


我正在嘗試使用響應式設計的原則來適應不斷變化的屏幕尺寸。 我有 CSS,它將隱藏 div ( main-nav-vert ) 中包含的垂直菜單,並在瀏覽器寬度下降到某個范圍內時顯示 div ( div_menu_toggle ) 中包含的“菜單”按鈕。 還有其他 div 大小調整發生,但此代碼已簡化。

單擊菜單按鈕時,js 代碼運行以通過更改其顯示屬性來切換菜單 div ( main-nav-vert )。

當瀏覽器寬度縮小時,按鈕出現和菜單被隱藏時,一切都很好。

然后,當單擊切換按鈕時,菜單會短暫顯示...然后再次自發消失。 我已經驗證隱藏 div 的代碼沒有運行( .display = 'none' )。 菜單是否因為 CSS 代碼始終處於活動狀態而再次隱藏? 如果是這樣,我該如何完成這項任務? 我正在尋找一個純 js 的答案,請不要使用 jQuery。 謝謝。

CSS

/* When screen shrinks to this range, hide Menu, display Menu button   */
@media (max-width: 697px) and (min-width: 320px) {
    .div_menu_toggle{
        display: block;
    }
    .main-nav-vert{
        display: none;
    }
    
}

JS

<script type="text/javascript">
function showmenu() {
    var mainnavvert = getElementsByClassName('main-nav-vert');
    var i, s, len = mainnavvert.length;
    for (i = 0; i < len; ++i) {
        if (i in mainnavvert) {
        // toggle the menu
            mainnavvert[i].style.display = 'block';
        } else {
            mainnavvert[i].style.display = 'none';
        }
    }
}

function getElementsByClassName(className) {
    if (document.getElementsByClassName) {
        return document.getElementsByClassName(className);
    } else {
        return document.querySelectorAll('.' + className);
    }
}
</script>

*未經測試,但我猜你只需要一個單獨的類 display:none 和 display:block;

然后改變班級,而不是風格。 就像是

 if (i in mainnavvert) {
        // toggle the menu
            mainnavvert[i].className = "show-me";
        } else {
            mainnavvert[i].className = "hide-me";
        }
 }

根據當前狀態切換顯示。 這樣的事情可能會奏效。

for (i = 0; i < len; ++i) {
    var menu = mainnavvert[i];
    if (menu.style.display === 'block') {
        menu.style.display = 'none';
    } else {
        menu.style.display = 'block';
    }
}

您需要學習新課程來設置活動/非活動切換菜單。

css

    /* When screen shrinks to this range, hide Menu, display Menu button   */
    @media (max-width: 697px) and (min-width: 320px) {
       .div_menu_toggle{
           display: block;
       }
       .main-nav-vert{
           display: none;
       }
       .main-nav-vert.active{
           display: block;
       }

    }

js

<script type="text/javascript">
function showmenu() {
    var mainnavvert = getElementsByClassName('main-nav-vert');
    var i, s, len = mainnavvert.length;
    for (i = 0; i < len; ++i) {
        if (i in mainnavvert) {
        // toggle the menu
            if(mainnavvert[i].style.display == "block")
               removeClass(mainnavvert[i]);
            }
            else {
               addClass(mainnavvert[i]);
            }
        }
    }
}

function getElementsByClassName(className) {
    if (document.getElementsByClassName) {
        return document.getElementsByClassName(className);
    } else {
        return document.querySelectorAll('.' + className);
    }
}

function addClass(ele) {
    var classString = ele.className; 
    var newClass = classString.concat(" active"); 
    ele.className = newClass; 
}

function removeClass(ele)
{
    [].forEach.call(ele, function(el) {
       el.classList.remove("active");
    });
}

});

因為你想要純 javascript,所以它在這里,但是如果你用 jquery 來做,代碼會非常流暢和優化,我不知道為什么你使用 for 循環,如果只有 1 個元素,那么你可以忽略循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM