2016-03-11 1 views
0

Я создал пользовательские выпадающие меню, которые имеют один <div>, удерживающий текущее значение и действующее как поле <select>, а другое под ним, которое отображается, когда нажимается верхняя часть , удерживая все значения <option>.Отображение div поверх другого без использования z-индекса

Для этого требуется нижняя часть <div>, чтобы она была расположена чуть ниже верхней (странные закругленные углы и т. Д.), Поэтому я использовал z-index для достижения этого. Все работает до тех пор, пока у меня нет двух выпадающих меню, расположенных близко друг к другу. Если вы нажмете верхний, появится раскрывающийся список опций, но он будет ниже второго выпадающего меню, что крайне нежелательно. Вот упрощенная версия в jsfiddle: jsFiddle

Как вы можете видеть, первое выпадающее меню прекрасно, а второе скрыто под третьим. Любые идеи, как я могу достичь этого, так и второе меню работает? Может быть, без использования z-index?

+0

Можно открыть несколько выпадающих меню одновременно? В вашем примере два открыты, однако, будет ли это так на практике? – Hatchet

+0

Два не могут быть открыты одновременно. Если вы проверите jsFiddle, вы увидите, что третий не открывается, а второй все еще скрыт под ним. Я показал первый, который был открыт, чтобы показать, что он далеко от других, но на практике этого не произойдет. Однако проблема с двумя другими стоит. – mmvsbg

ответ

1

во-первых, завернуть каждое меню в элементе. Я использовал div.container.

Поскольку только одно меню будет открыто в то время, просто изменив z-index из .major и .minor элементов в каждом контейнере (при наведении курсора мыши в моем примере) работает правильно:

.major { 
 
    position: relative; 
 
    width: 100px; 
 
    background-color: red; 
 
    z-index: 1; 
 
} 
 
.minor { 
 
    position: absolute; 
 
    width: 150px; 
 
    background-color: blue; 
 
    padding-top: 10px; 
 
    margin-top: -10px; 
 
    z-index: 0; 
 
    display: none; 
 
} 
 
.container:hover .major { 
 
    z-index: 5; 
 
} 
 
.container:hover .minor { 
 
    display: block; 
 
    z-index: 4; 
 
} 
 
.moveup { 
 
    margin-top: -25px; 
 
}
<div class="container"> 
 
    <div class="major"> 
 
    First one fine 
 
    </div> 
 
    <div class="minor"> 
 
    Option part goes here Option part goes here Option part goes here 
 
    </div> 
 
</div> 
 
<br /> 
 
<br /> 
 
<br /> 
 
<br /> 
 
<div class="container"> 
 
    <div class="major"> 
 
    Second menu 
 
    </div> 
 
    <div class="minor"> 
 
    Option part goes here Option part goes here Option part goes here 
 
    </div> 
 
</div> 
 
<div class="container"> 
 
    <div class="major"> 
 
    Third menu 
 
    </div> 
 
    <div class="minor"> 
 
    Option part goes here Option part goes here Option part goes here 
 
    </div> 
 
</div>

+0

Отлично работает, спасибо! – mmvsbg

0

Я не уверен на 100%, что вы имеете в виду, но если я не ошибаюсь, решение должно состоять в том, чтобы обернуть разделители .major и .minor, чтобы они не перекрывали друг друга, например:

<div class="dropdown"> 
    <div class="major"> 
    First one fine 
    </div> 
    <div class="minor"> 
    Option part goes here 
    Option part goes here 
    Option part goes here 
    </div> 
</div> 

Смотрите мою вилку вашего JSFiddle: https://jsfiddle.net/jk1dn4yx/

+0

Не работает: https://jsfiddle.net/jk1dn4yx/1/ Две большие части могут быть одна под другой, я не могу это контролировать, и на самом деле это нормально, когда выпадающие меню не отображаются. Однако, как только вы нажимаете на верхнюю (которая недоступна в демонстрации, я показываю ее прямо, как там открыта), синяя часть становится видимой, и она находится за нижним красным div, что на самом деле является проблемой ... – mmvsbg

+1

Но вы можете добавить wrapping div? Если вы также добавляете класс при открытии .minor div, например, «open», попробуйте это расширенное решение z-index: https://jsfiddle.net/jk1dn4yx/2/ Также попробуйте решение Hatchet, которое, кажется, в основном, что я сделал для этого комментария, прежде чем я увидел ответ Хэтчета. :) – KochFolie

+0

Да, он также меняет индекс z, хотя и должен работать. – mmvsbg