Подменю превышает поле страницы
[Другое решение]: Используя Jquery, можно узнать расстояние между меню и окном, поэтому для каждого меню необходимо проверить, меньше ли его расстояние, чем 0, когда мышь наводит на него курсор. Если оно меньше 0, используйте css для изменения положения.
Jquery:
var distance = $(window).width() - ($('#your-element').offset().left + $('#your-element').width());
if(distance<0){
/* manage if the menu that exceeds the window*/
}
Я пытаюсь закодировать подменю с помощью HTML и CSS.
До сих пор все работает нормально, но если в меню слишком много уровней, оно превышает запас.
Есть ли способ исправить это, переставив уровень, когда он превысит маржу?
Вот код: http://jsfiddle.net/mag2v/19/
HTML
<div class="menu">
<ul>
<li><a href="javascript:void(0)">HOME</a>
</li>
<li><a href="javascript:void(0)">PRODUCTS</a>
<ul class="sub-menu">
<li><a href="javascript:void(0)">E-COMMERCE</a>
</li>
<li><a href="javascript:void(0)">INTRANET</a>
</li>
<li><a href="javascript:void(0)">MARKETING</a>
</li>
</ul>
</li>
<li><a href="javascript:void(0)">HELP</a>
<ul class="sub-menu">
<li><a href="javascript:void(0)">F.A.Q</a>
</li>
<li><a href="javascript:void(0)">CHAT ONLINE</a>
</li>
</ul>
</li>
<li><a href="javascript:void(0)">BLOG</a>
</li>
<li><a href="javascript:void(0)">ABOUT US</a>
<ul class="sub-menu">
<li><a href="javascript:void(0)">OUR TEAM ></a>
<ul class="sub-sub-menu">
<li><a href="javascript:void(0)">DEVELOPERS</a>
</li>
<li><a href="javascript:void(0)">DESIGNERS</a>
</li>
<li><a href="javascript:void(0)">COMMERCIAL</a>
</li>
</ul>
</li>
<li><a href="javascript:void(0)">WHERE ARE WE? ></a>
<ul class="sub-sub-menu">
<li><a href="javascript:void(0)">BRAZIL ></a>
<ul class="sub-sub-menu">
<li><a href="javascript:void(0)">SÃO PAULO</a>
</li>
<li><a href="javascript:void(0)">RIO DE JANEIRO</a>
</li>
<li><a href="javascript:void(0)">PORTO ALEGRE ></a>
<ul class="sub-sub-menu">
<li><a href="javascript:void(0)">TESTE</a>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="javascript:void(0)">USA</a>
</li>
<li><a href="javascript:void(0)">GERMANY</a>
</li>
<li><a href="javascript:void(0)">CHINA</a>
</li>
<li><a href="javascript:void(0)">RUSSIA</a>
</li>
</ul>
</li>
<li><a href="javascript:void(0)">MEDIA</a>
</li>
<li><a href="javascript:void(0)">JOIN US</a>
</li>
</ul>
</li>
<li><a href="javascript:void(0)">CONTACT US</a>
</li>
</ul>
</div>
CSS
#header .container {
padding:30px 0 50px 0;
}
#header .container .logotipo {
float:left;
height:22px;
width:97px;
}
#header .container .menu {
float:left;
margin-left:20px;
margin-top:-30px;
}
.menu ul li {
float:left;
list-style:none;
margin-left:40px;
position:relative;
}
.menu ul li:hover > ul {
display:block;
}
/* 1 */
.menu ul li:nth-child(1) a {
border-top:3px solid #7F9614;
color:#7F9614;
display:block;
padding:29px 0 9px 0;
}
.menu ul li a {
color:#000;
cursor:pointer;
display:inline-block;
font-family:Gisha;
font-size:16px;
padding:32px 0 9px 0;
text-decoration:none;
}
.menu ul li:hover a {
border-top:3px solid #7F9614;
color:#7F9614;
display:block;
padding:29px 0 9px 0;
}
/* 2 */
.menu ul li > ul {
border-top:3px solid #7F9614;
display:none;
position:absolute;
width:240px;
}
.menu ul li > ul.sub-menu li {
float:left;
margin-left:-40px;
width:100%;
}
.menu ul li > ul.sub-menu li a {
-webkit-transition: all 0.3s;
-moz-transition: all 0.3s;
-ms-transition: all 0.3s;
-o-transition: all 0.3s;
transition: all 0.3s;
background:rgba(255, 255, 255, 0.8);
border-bottom:1px dotted #7F9614;
border-top:none;
color:#7F9614;
font-size:14px;
padding:10px 0px 10px 20px;
word-break:break-all;
}
.menu ul li > ul.sub-menu li a:hover {
background:#7F9614;
color:#fff;
}
/* 3... */
.menu .sub-sub-menu {
position:absolute;
left:100%;
top:0;
}
.menu .sub-sub-menu {
border-left:1px dotted #7F9614;
border-top:none;
word-break:break-all;
}
3 ответа
примечание: подобное меню - плохая идея, и проблема, с которой вы столкнулись, является хорошим примером того, почему это так. Посмотрите вокруг, есть веские причины, по которым большинство сайтов этого не делают, и даже больше причин не делать этого без JavaScript.
При этом можно заставить его работать только с HTML
А ТАКЖЕ CSS
,
Вы хотели бы использовать медиа-запросы, чтобы изменить CSS
в зависимости от размера окна; лайк:
@media (max-width: 800px) {/*just change 800 to whatever you need*/
/*css here*/
}
Я сделал рабочий пример в этой скрипке...
Это не без проблем / ошибок, но это просто для иллюстрации концепции. Я добавил пустой li
с классом trigger
который показывает, когда меню нужно свернуть.
Я также внес несколько изменений в ваш существующий CSS
и добавил комментарии, чтобы вы могли видеть, что изменилось.
Этот тип проблемы обычно решается с помощью главного меню, имеющего только один раскрывающийся уровень, и страницы внутри него, имеющие дополнительные ссылки, будут отображать эти дополнительные ссылки во вторичной навигации на этих страницах вместо того, чтобы пытаться поместить 10
фунты "вещи" в 5
фунт сумка.
Вот так они сделали вторичную навигацию из 3-х блоков под вводным содержанием страницы (для вас, для бизнеса, для разработчиков). Большинство сайтов решают эту проблему аналогичным образом.
Вы должны помнить ниже шаги.
- Всегда желательно сбрасывать теги html, чтобы уменьшить несоответствия в браузере по поводу полей, отступов и т. Д.
Два самых известных сброса CSS:
http://necolas.github.io/normalize.css/ - Я предпочитаю это.
http://meyerweb.com/eric/tools/css/reset/
- UL по умолчанию имеет стиль списка, следовательно, перезаписать его. список-стиль: нет;
Ссылка на скрипку JS http://jsfiddle.net/mag2v/22/ и теперь вот модифицированный css:
#header .container {
padding:30px 0 50px 0;
}
#header .container .logotipo {
float:left;
height:22px;
width:97px;
}
#header .container .menu {
float:left;
margin-left:20px;
margin-top:-30px;
}
.menu ul li {
float:left;
list-style:none;
margin-left:40px;
position:relative;
}
.menu ul li:hover > ul {
display:block;
list-style: none;
padding:0;
}
/* 1 */
.menu ul li:nth-child(1) a {
border-top:3px solid #7F9614;
color:#7F9614;
display:block;
padding:29px 0 9px 0;
}
.menu ul li a {
color:#000;
cursor:pointer;
display:inline-block;
font-family:Gisha;
font-size:16px;
padding:32px 0 9px 0;
text-decoration:none;
}
.menu ul li:hover a {
border-top:3px solid #7F9614;
color:#7F9614;
display:block;
padding:29px 0 9px 0;
}
/* 2 */
.menu ul li > ul {
border-top:3px solid #7F9614;
display:none;
position:absolute;
width:240px;
}
.menu ul li > ul.sub-menu li {
float:left;
margin-left:0;
width:100%;
}
.menu ul li > ul.sub-menu li a {
-webkit-transition: all 0.3s;
-moz-transition: all 0.3s;
-ms-transition: all 0.3s;
-o-transition: all 0.3s;
transition: all 0.3s;
background:rgba(255, 255, 255, 0.8);
border-bottom:1px dotted #7F9614;
border-top:none;
color:#7F9614;
font-size:14px;
padding:10px 0px 10px 20px;
word-break:break-all;
}
.menu ul li > ul.sub-menu li a:hover {
background:#7F9614;
color:#fff;
}
/* 3... */
.menu .sub-sub-menu {
position:absolute;
left:100%;
top:0;
}
.menu .sub-sub-menu {
border-left:1px dotted #7F9614;
border-top:none;
word-break:break-all;
}
.menu .sub-sub-menu1{position:absolute;left:-100%;top:0;}// does the trick alter
- -100% для отображения поля на боковой странице меню слева от выпадающего меню level2
- Изменить содержание HTML
.sub-sub-menu
в.sub-sub-menu1
или имя, которое вам нравится, используйте отдельное подменю для подуровней, чтобы они отображались слева от уровня 2, то есть уровня 3 слева от уровня 2 и уровня 4 слева от сына уровня 3, даже с этим следующим уровнем может быть очень трудно приспособиться к текущему коду
Предложение В случае, если у вас есть такие глубокие / многоуровневые выпадающие (Демо)
Я думаю, что было бы лучше, если вы используете сочетание обоих после подменю, следующий выпадающий список должен отображаться как вертикальное меню, которое помогает ограничить меню в пределах диапазона сетки
Ваши отступы и поля, и все это делает ваше меню более толстым (занимают пространство 240 x 37 пикселей), вы должны попытаться ограничить сумму длины всех видимых выпадающих меню до 1288.472 пикселей, что соответствует размеру меню, отображаемого в моем браузере. по сути, я пытаюсь сказать, что дать отступ и отступ в раскрывающемся меню (li и теги) таким образом, чтобы при наиболее глубоком раскрытии раскрывалась общая длина, которая должна быть меньше длины используемого вами размера сетки.