1 Отредактировано Илья (02.02.2018 12:30:43)

Тема: Меню [Решено]

Всем привет. Есть меню 3х уровненое. Выводиться следующим образом

        {foreach $dirlist as $dir}
        <li class="{if !empty($dir.child)} node{/if}" {$dir.fields->getDebugAttributes()}>
            <a href="{$dir.fields->getUrl()}">{$dir.fields.name}</a><i></i>
            {if !empty($dir.child)}
                {* Второй уровень *}
                <ul>
                    {foreach $dir.child as $subdir}
                    <li class="dropdown"><a href="{$subdir.fields->getUrl()}">{$subdir.fields.name}</a>
                        {if !empty($subdir.child)}
                        {* Третий уровень *}
                        <ul>
                            {foreach $subdir.child as $subdir2}
                            <li><a href="{$subdir2.fields->getUrl()}">{$subdir2.fields.name}</a></li>
                            {/foreach}
                        </ul>
                        {/if}
                    </li>
                    {/foreach}
                </ul>
            {/if}
        </li>
        {/foreach}


Вот что получается в итоге: http://joxi.ru/4Akl8xotM4kwDr

Как сделать, что бы второй уровень у которого нет, дочерних элементов, встал друг под дружку?
Вот так: http://priscree.ru/img/1a423f63d19e57.jpg

https://jsfiddle.net/9L008q8r/2/

2

Re: Меню [Решено]

Ну здесь только очень костыльные решения приходят на ум. Прошу прощения, но код писать не буду.
Типа предварительно обойти уровень (foreach) и составить массив элементов имеющих детей и не имеющих, затем их вывести в разных дивах.

В одном диве у вас будут элементы второго уровня и третьего, в другом диве элементы второго уровня без детей, далее уже с помощью CSS можно эти два дива вывести друг за другом.

Или просто хард.кодом, если $subdir.fields.name == 'Детские лосины', то перед вывести <li class="nochild"><ul>,
если  $subdir.fields.name == 'Гольфы и носки', то после вывести </ul></li>, далее стилями приведите в порядок внешний вид, зацепка на класс .nochild - есть.

3

Re: Меню [Решено]

Понял, что то оба варианта не особо радужные. А если сделать по примеру как сделано, в теме молодежная? Как там реализовано, что без дочерней категории уходит под категорию? http://joxi.ru/p274bd9i0XKvWA

4

Re: Меню [Решено]

В молодежной самый обычный float:left, там тоже элементы по горизонтали распределяются.
На вашем скриншоте элемент просто "зацепился" за более высокий слева блок.
Если будет больше элементов без дочерних элементов они не будут вертикально строиться.

5

Re: Меню [Решено]

Разработчики, можно ли сделать видео урок для  весртальщиков, как интегрировать многоуровневое меню, допустим вертикально с подкатегориями .
Вот пример http://www.sotmarket.ru/  каталог. 
Постоянно все спрашивают.

6

Re: Меню [Решено]

Сделал следующим образом, решение взял из темы Современная
стили

/* Категории */
.catContainer {
    background: #6a7077;
    height: 0px!important;
}
/*.newcategory {
    float: left;
    margin: 0;
    margin-bottom: 0;
    padding-left: 0;
    list-style: none;
}*/
ul.newcategory > li {
/*    margin-bottom: 0;*/
    position: static;
    transition: ease-in-out 0.2s;
}
/*.t-dropdown.open {
    background-color: rgba(0, 0, 0, 0.5);
}*/
@media (min-width: 768px) {
.newcategory>li {
    float: left;
}
}
.newcategory>li {
    position: relative;
    display: block;
}
.t-dropdown {
    transition: 0.3s;
}
ul.newcategory > li > a {
    background-color: #6a7077;
    color: #fff;
    letter-spacing: -0.05px;
    line-height: 28px;
    padding: 15px 20px 0px 0px;
    z-index: 21;
}
.newcategory .open>a, .newcategory .open>a:hover, .newcategory .open>a:focus {
/*    background-color: #eee;
    border-color: #337ab7;*/
    color: #77e0c3;
}
@media (min-width: 768px) {
  .newcategory>li>a {
    padding-top: 15px;
    padding-bottom: 15px;
}
}
.newcategory>li>a {
    padding-top: 10px;
    padding-bottom: 10px;
    line-height: 20px;
}
.newcategory>li>a {
    position: relative;
    display: block;
    padding: 10px 15px;
}
}
.open>a {
    outline: 0;
}
.t-dropdown.open > .t-dropdown-menu {
    -webkit-transform: translateY(0);
    -moz-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
    display: block;
}
.t-dropdown-menu {
    display: none;
    background-color: #6a7077;
    box-shadow: none;
    top: 20px;
    left: 0;
    position: absolute;
    width: 100%;
    -webkit-transform: translateY(-115%);
    -moz-transform: translateY(-115%);
    -ms-transform: translateY(-115%);
    transform: translateY(-115%);
    transition: 0.3s;
    overflow: hidden;
    z-index: 20;
    border-bottom-left-radius: 5px;
    border-bottom-right-radius: 5px;
    margin-left: -10px;
}
/*.container-fluid {
    max-width: 1540px;
}
.container-fluid {
    margin-right: auto;
    margin-left: auto;
    padding-left: 15px;
    padding-right: 15px;
}*/
.t-nav-catalog-list__inner {
    margin: 30px 0;
}
.t-nav-catalog-list__scene {
    -webkit-column-count: 4;
    -moz-column-count: 4;
    column-count: 4;
    -webkit-column-gap: 10px;
    -moz-column-gap: 10px;
    column-gap: 10px;
}
.t-nav-catalog-list-block {
    -webkit-column-break-inside: avoid;
    break-inside: avoid;
    display: block;
}
.t-nav-catalog-list-block {
    padding: 0px 10px;
/*    display: inline-block;*/
    margin: 0 0 10px;
    width: 100%;
}
.t-nav-catalog-list-block__header {
    color: #77e0c3;
    display: block;
    font-size: 18px;
    padding: 5px !important;
    transition: ease-in-out 0.1s;
}
.t-nav-catalog-list-block__list {
    list-style: none;
    padding: 0;
}
.t-nav-catalog-list-block__link {
    color: #ffffff;
    display: block;
        font-size: 14px;
    padding: 5px !important;
    transition: ease-in-out 0.1s;
}

Выод категорий

<div style="position: relative;">
    <ul class="newcategory">
        {hook name="catalog-blocks-category-category:list-item" title="{t}Доплнительные пункты меню, в меню каталога{/t}"}
        {foreach $dirlist as $dir}
        <li class="{if !empty($dir.child)} t-dropdown{/if}" {$dir.fields->getDebugAttributes()}>
            {* Первый уровень *}
            <a {$dir.fields->getDebugAttributes()} href="{$dir.fields->getUrl()}">{$dir.fields.name}</a>

            {if !empty($dir.child)}
                {* Второй уровень *}
                <div class="t-dropdown-menu">
                        <div class="t-nav-catalog-list__inner">
                            <div class="t-nav-catalog-list__scene">

                                {foreach $dir.child as $subdir}
                                    <div class="t-nav-catalog-list-block">
                                        <a {$subdir.fields->getDebugAttributes()} href="{$subdir.fields->getUrl()}" class="t-nav-catalog-list-block__header">{$subdir.fields.name}</a>

                                        {* Третий уровень *}
                                        {if !empty($subdir.child)}
                                        <ul class="t-nav-catalog-list-block__list">
                                            {foreach $subdir.child as $subdir2}
                                                <li><a {$subdir2.fields->getDebugAttributes()} href="{$subdir2.fields->getUrl()}" class="t-nav-catalog-list-block__link">{$subdir2.fields.name}</a></li>
                                            {/foreach}
                                        </ul>
                                        {/if}
                                    </div>
                                {/foreach}

                        </div>
                    </div>
                </div>
            {/if}
        </li>
        {/foreach}
        {/hook}
    </ul>
</div>

навешиваем класс

<script>
    $('.t-dropdown').hover(
function(){ $(this).addClass('open') },
function(){ $(this).removeClass('open') }
)
    </script>

7

Re: Меню [Решено]

Дмитрий пишет:

Разработчики, можно ли сделать видео урок для  весртальщиков, как интегрировать многоуровневое меню, допустим вертикально с подкатегориями .
Вот пример http://www.sotmarket.ru/  каталог. 
Постоянно все спрашивают.

В Маркетплейсе есть готовая тема, где такое меню реализовано. Яркая называется.