[英]How do I make my hamburger menu appear directly under my hamburger icon?
我想要點擊漢堡包菜單圖標,然后將列表顯示在我的圖標下方。 我用這種風格設置了漢堡包菜單圖標
.menu-btn div {
position: absolute;
left: 100%;
top: 64%;
padding-right: 8px;
margin-top: -0.50em;
line-height: 1.2;
font-size: 18px;
font-weight: 200;
vertical-align: middle;
z-index: 99;
}
.menu-btn span {
display: block;
width: 20px;
height: 2px;
margin: 4px 0;
background: #989da1;
z-index: 99;
}
單擊漢堡菜單后,應顯示選項菜單
<div class="responsive-menu">
<ul id="menu">
<li>Vote</li>
<li>Search</li>
<li>About</li>
<li>Log In</li>
</ul>
</div>
但是我不清楚如何設置漢堡包菜單的樣式,所以當你點擊它時它會直接出現在漢堡包菜單下面。 現在,它出現在屏幕的頂部 - https://jsfiddle.net/wtp1k57b/1/ 。 我該如何設置這樣的風格?
PS - 我正在尋找一種不依賴於硬編碼數字(例如頂部:27px)像素值的解決方案。 當然,在我的小小提琴中讓事情發揮作用是好的,但在我更廣泛的應用中,我不能保證漢堡包菜單會有多大或多小。
使用css
屬性: top
和right
在圖標下設置元素的位置。
#menu
{
position: absolute;
top: 48px;
right: 2px;
background: #ededed;
list-style-type: none;
}
將此CSS用於您的菜單 - 無邊距,以及由top
和right
設置定義的位置:
#menu {
position: absolute;
width: 300px;
margin: 0;
padding: 50px;
background: #ededed;
list-style-type: none;
-webkit-font-smoothing: antialiased;
top: 50px;
right: 0;
}
https://jsfiddle.net/meuexde6/
我省略了測試的轉換,但你基本上應該將right
參數從-100px設置為0,以實現你的想象。
評論后的補充:
要定義菜單相對於按鈕的position: relative
,您必須應用position: relative
對於它們的公共父元素.mobile-nav
。 具有position: absolute
的元素的位置值始終與具有position: relative
的第一個祖先position: relative
。
我相應地更改了我更新的小提琴中的值:
#menu {
position: absolute;
width: 300px;
margin: 0;
padding: 50px;
background: #ededed;
list-style-type: none;
-webkit-font-smoothing: antialiased;
top: 40px;
right: -32px;
}
更新小提琴: https : //jsfiddle.net/meuexde6/1/
如果你真的希望菜單直接粘在按鈕上(很難說 - 它沒有邊框),只需根據需要調整top
和right
值。
所以,這里。 我知道你要求解決一個特定的問題,我解決了它,但我不禁注意到你正在努力解決你的代碼問題。 您必須簡化您的思考方式,並使您的代碼變得更加精簡。 這個論壇的目的是幫助別人變得更好,對吧? :)
HTML
保持菜單切換按鈕OUTSIDE是一個好習慣 - 將解決很多問題 - 請查看下面的內容。
在語義上使用其他任何東西而不是button
來進行切換功能都是正確的,所以,為什么不在這里使用button
呢? 我也刪除無用的垃圾,從您的代碼,像一些div
S和id
-該id
可以與被交易class
,你的電話。 我也刪除了.mobile-nav
因為根本不需要它。
<button class="menu-btn">
<span></span>
<span></span>
<span></span>
</button>
<div class="responsive-menu">
<ul id="menu">
<li>Vote</li>
<li>Search</li>
<li>About</li>
<li>Log In</li>
</ul>
</div>
CSS
我絕對將menu-btn
定位在右上角,並給它一個等於#pageTitle
height
的width
(我設置為50px - 金標准)以保持矩形; 根據經驗,切換按鈕是矩形的,並且始終與頂部導航欄的高度相同 - 在這種情況下是前面提到的id
。 我為.responsive-menu
做了同樣的.responsive-menu
。 我絕對定位它如下圖所示。 這些更改讓我刪除了很多css樣式 - 現在已經過時 - 比如在.responsive-menu
中的ul
菜單的絕對定位。
.menu-btn {
position:absolute;
display:block;
right:0;
top:0;
width:50px;
height:50px;
background:yellow;
border:none;
padding:16px;
}
.responsive-menu {
position: absolute;
top: 50px;
right: 0;
display: none;
}
使用Javascript
通過多年的實踐,我意識到切換菜單而不是添加和刪除類的最有效方法是在body
標簽上添加一個class
; 如果您想要重新打開頁面上的任何其他內容,這可以幫助堆積,具體取決於菜單是否打開。
$('.menu-btn').on('click', function() {
$('body').toggleClass('responsive-menu-open');
});
這是一個工作的jsfiddle: https ://jsfiddle.net/scooterlord/4atafhge/
我可以做很多其他的事情,以便進一步簡化代碼 - 刪除不必要的id和類,因為大多數元素被認為是唯一的,可以使用后代類來定位,例如.responsive-menu ul
等。經過大量的實踐中,您將設法更簡單地思考並生成占用空間更小的代碼。
編輯:關於你不喜歡對齊的絕對像素這一事實是一個技巧。
給父容器一個固定的height
,等於切換按鈕 - 在這種情況下'#pageTitle'並將其位置設置為relative
允許你使用top:100%
將響應式菜單正確放置在按鈕下方(這實質上是相同的高度):
#pageTitle {
display: flex;
height: 50px;
position:relative;
}
.responsive-menu {
position: absolute;
top: 100%;
right: 0;
display: none;
}
這是一個更新的小提琴: https : //jsfiddle.net/scooterlord/4atafhge/1/
編輯:納塔利婭,我給了它一些思考,這就是我想出來的。 我創建了一個絕對定位的.menu-wrapper
,在其中我放置了按鈕和響應式菜單float:right
沒有定位 - 也就是說它們是靜態定位的。 沒有像素值了! 好極了!
.menu-wrapper {
position:absolute;
top:0;
right:0;
}
.menu-btn {
float:right;
...
}
.responsive-menu {
float:right;
clear:both; // to clear the .menu-btn and sit exactly below it
...
}
這是一個工作小提琴: https : //jsfiddle.net/scooterlord/4atafhge/2/
HTML5語義元素。
details > summary { padding: 2px 6px; width:12px; border: none; list-style: none; } details > summary::-webkit-details-marker { display: none; } ul{ list-style: none; margin-left:0; padding-left:0; }
<details> <summary>☰</summary> <ul> <li>a</li> <li>b</li> <li>c</li> </ul> </details>
我想在不使用display: flex
情況下展示一種完全不同的方法。
在我看來,你的方法使用了太多的包裝器。 你絕對可以減少divs
的數量。 此外,您應該始終嘗試使用語義標記而不是像div
或ul
這樣的常規標記。 考慮一下這篇文章。
因此,作為@scooterlord已經提到的,你應該使用一個button
的漢堡包圖標。 此外,我建議使用nav
而不是列表。
首先,您應該將同一選擇器的屬性捆綁在同一位置,以提高清晰度。 您不應該有三個部分應用通用選擇器,但將其合並為一個。 此外,不要將box-sizing
設置為特定值,而是將其設置為inherit
,因此您始終可以為特定元素覆蓋此值,而無需為其所有子元素執行此操作。 此外,我不明白你想用margin: 0 auto
實現什么margin: 0 auto
所有元素和body
都是margin: 0 auto
。 這對我沒有任何意義。
由於您不想使用絕對定位,我強烈建議您避免使用像素作為測量單位。 如果有些人因視力不佳或其他原因改變了默認font-size
,他們表現得很糟糕。 相反,考慮應用相對單位,如rem
, em
或%
。 通過將根元素的font-size
為62.5%
您仍然可以像使用像素一樣計算(1rem = 10px)。
正如我已經提到的,我避免使用display: flex
來處理這樣一個微不足道的事情。 我不明白為什么在這一點上應該使用它。 因此,我還不得不改變菜單按鈕的位置。 可以使用top
和left
百分比輕松定位導航。
作為旁注:您應該嘗試僅發布相關的CSS代碼 - 我的第一步是刪除它的所有不相關的部分。
這是我沒有Flexbox的最終解決方案,沒有固定的尺寸,也沒有使用px
絕對定位:
$('.menu-btn').click(function() { $('nav').toggleClass('nav-open'); });
* { margin: 0; padding: 0; box-sizing: inherit; } html { font-size: 62.5%; } body { font: 1.6rem/1.4 Benton Sans, -apple-system, BlinkMacSystemFont, Roboto, Helvetica Neue, Helvetica, Tahoma, Arial, sans-serif; -webkit-font-smoothing: antialiased; box-sizing: border-box; } header { width: 100%; background-color: orange; text-align: center; padding: 1rem; position: relative; } nav { display: none; width: 30rem; padding: 5rem; background-color: #ededed; position: absolute; right: 5%; top: 100%; } .nav-open { display: block; } nav a { display: block; width: 100%; text-align: center; padding: 1.4rem 1.6rem; text-decoration: none; cursor: pointer; font-size: 2.2rem; color: #000; } nav a:hover { background-color: #111; color: #fff; } .menu-btn { position: absolute; right: 5%; top: 50%; margin-top: -1.1rem; display: inline-block; cursor: pointer; border: none; outline: none; background-color: transparent; } @media only screen and (min-width: 500px) { .menu-btn, nav { display: none !important; } } .menu-btn span { display: block; width: 2rem; height: 0.2rem; margin: 0.4rem 0; background: #989da1; z-index: 99; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <header> <h2>Page Title</h2> <button class="menu-btn"> <span></span> <span></span> <span></span> </button> <nav> <a href="vote.html">Vote</a> <a href="search.html">Search</a> <a href="about.html">About</a> <a href="login.html">Log In</a> </nav> </header>
或者看到這個小提琴。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.