Выпадающее горизонтальное/вертикальное меню на CSS

#
Выпадающее горизонтальное/вертикальное меню на CSS
Шаблон предназначен для показа многоуровневого меню на сайте, с учётом вывода групп интернет-магазина и информационных систем. Шаблон адаптирован под сервис CSS Menu Maker.

Для показа меню на сайте нужно в разделе http://cssmenumaker.com/css-menus/ выбрать образец меню.
В разделе Customize скопировать CSS-код меню и добавить его к CSS-коду вашего макета. (Внимание! Некоторые образцы меню опубликованные на сайте являются демонстрационными и не содержат раздела Customize.)

Создать XSL-шаблон с приведённым ниже кодом.
Код XSL-шаблона:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:hostcms="http://www.hostcms.ru/"
  exclude-result-prefixes="hostcms">
  <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>

  <xsl:template match="/site">
    <div id="cssmenu">
      <ul>
        <!-- Выбираем узлы структуры первого уровня -->
        <xsl:apply-templates select="*[@id][show=1][active=1]" />
      </ul>
    </div>
  </xsl:template>

  <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
  <xsl:variable name="current_structure_id" select="/site/current_structure_id"/>

  <xsl:template match="*">
    <!-- Шаблон выборки дочерних узлов -->
    <xsl:variable name="sub" select="*[@id][show=1][active=1]" />

    <li>
      <xsl:attribute name="class">
        <xsl:if test="$current_structure_id = @id or count(.//structure[@id=$current_structure_id]) = 1">active </xsl:if>
        <xsl:if test="position() = last()">last </xsl:if>
        <xsl:if test="$sub">has-sub</xsl:if>
      </xsl:attribute>

      <!-- Определяем адрес ссылки -->
      <xsl:variable name="link">
        <xsl:choose>
          <!-- Если внутренняя ссылка -->
          <xsl:when test="link != ''">
            <xsl:value-of disable-output-escaping="yes" select="link"/>
          </xsl:when>
          <!-- Если внешняя ссылка -->
          <xsl:otherwise>
            <xsl:value-of disable-output-escaping="yes" select="url"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:variable>

      <!-- Показывать ссылку? -->
      <a href="{$link}">
        <span><xsl:value-of disable-output-escaping="yes" select="name"/></span>
      </a>

      <xsl:if test="$sub">
        <ul>
          <xsl:apply-templates select="$sub" />
        </ul>
      </xsl:if>
    </li>
  </xsl:template>
</xsl:stylesheet>


Добавить в макет код показа меню по указанному образцу.
Код показа меню в макете:
<?php
  $Structure_Controller_Show = new Structure_Controller_Show(
    Core_Entity::factory('Site', CURRENT_SITE));

  $Structure_Controller_Show->xsl(Core_Entity::factory('Xsl')
    ->getByName('CssMenuMaker')) // XSL-шаблон
    ->showInformationsystemGroups(TRUE) // показываем группы инфосистемы (TRUE/FALSE)
    ->showShopGroups(TRUE) // показываем группы магазина (TRUE/FALSE)
    ->menu(1) // идентификатор меню
    ->show();
?>


UPD: Репозиторий шаблона на GitHub https://github.com/lozoffoy/CssMenuMaker-HostCMS-v.6.x
#
Re: Выпадающее горизонтальное/вертикальное меню на CSS
Спасибо за меню, можете подсказать а как сделать такое же только для каталогов интернет магазина, без остальных пунктов меню.
#
Re: Выпадающее горизонтальное/вертикальное меню на CSS
А как сделать чтобы выпадающее меню перекрывало саму страницу? А то у меня оно находится в полосе header и выпадает ПОД следующую полосу content.
#
Re: Выпадающее горизонтальное/вертикальное меню на CSS
iteco писал(а):

к примеру так z-index: 999;
#
Re: Выпадающее горизонтальное/вертикальное меню на CSS
Sibirskiy писал(а):
к примеру так z-index: 999;


Я так понимаю это нужно в CSS вставить. А куда именно?

Для моего меню получился такой CSS

#cssmenu{ height:37px; display:block; padding:0; margin: 0;  border:1px solid; border-radius:5px; }
#cssmenu > ul {list-style:inside none; padding:0; margin:0;}
#cssmenu > ul > li {list-style:inside none; padding:0; margin:0; float:left; display:block; position:relative;}
#cssmenu > ul > li > a{ outline:none; display:block; position:relative; padding:12px 20px; font:bold 13px/100% Arial, Helvetica, sans-serif; text-align:center; text-decoration:none; text-shadow:1px 1px 0 rgba(0,0,0, 0.4); }
#cssmenu > ul > li:first-child > a{border-radius:5px 0 0 5px;}
#cssmenu > ul > li > a:after{ content:''; position:absolute; border-right:1px solid; top:-1px; bottom:-1px; right:-2px; z-index:99; }
#cssmenu ul li.has-sub:hover > a:after{top:0; bottom:0;}
#cssmenu > ul > li.has-sub > a:before{ content:''; position:absolute; top:18px; right:6px; border:5px solid transparent; border-top:5px solid #fff; }
#cssmenu > ul > li.has-sub:hover > a:before{top:19px;}
#cssmenu ul li.has-sub:hover > a{ background:#3f3f3f; border-color:#3f3f3f; padding-bottom:13px; padding-top:13px; top:-1px; z-index:999; }
#cssmenu ul li.has-sub:hover > ul, #cssmenu ul li.has-sub:hover > div{display:block;}
#cssmenu ul li.has-sub > a:hover{background:#3f3f3f; border-color:#3f3f3f;}
#cssmenu ul li > ul, #cssmenu ul li > div{ display:none; width:auto; position:absolute; top:38px; padding:10px 0; background:#3f3f3f; border-radius:0 0 5px 5px; z-index:999; }
#cssmenu ul li > ul{width:200px;}
#cssmenu ul li > ul li{display:block; list-style:inside none; padding:0; margin:0; position:relative;}
#cssmenu ul li > ul li a{ outline:none; display:block; position:relative; margin:0; padding:8px 20px; font:10pt Arial, Helvetica, sans-serif; color:#fff; text-decoration:none; text-shadow:1px 1px 0 rgba(0,0,0, 0.5); }


#cssmenu, #cssmenu > ul > li > ul > li a:hover{ background:#333333; background:-moz-linear-gradient(top, #333333 0%, #222222 100%); background:-webkit-gradient(linear, left top, left bottom, color-stop(0%,#333333), color-stop(100%,#222222)); background:-webkit-linear-gradient(top, #333333 0%,#222222 100%); background:-o-linear-gradient(top, #333333 0%,#222222 100%); background:-ms-linear-gradient(top, #333333 0%,#222222 100%); background:linear-gradient(top, #333333 0%,#222222 100%); filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#333333', endColorstr='#222222',GradientType=0 ); }
#cssmenu{border-color:#000;}
#cssmenu > ul > li > a{border-right:1px solid #000; color:#fff;}
#cssmenu > ul > li > a:after{border-color:#444;}
#cssmenu > ul > li > a:hover{background:#111;}
#
Re: Выпадающее горизонтальное/вертикальное меню на CSS
iteco, можете добавить z-index ещё и для общего #cssmenu{ ... }.
Куда добалять его не принципиально, главное чтобы это решило проблему.
#
Re: Выпадающее горизонтальное/вертикальное меню на CSS
В предложенном варианте есть все основные типы меню, кроме одного - вертикального с раздвижением групп, если есть подгруппа ( т.н. "аккордеон" ).
Нужно чистое решение на css, уж потом приделать к нему разные красивости - не настолько сложно.
Аналогичная реализация меню каталога (ИМ) на пятерке: http://ooo-slaviya.ru/
#
Re: Выпадающее горизонтальное/вертикальное меню на CSS
wssd, приведённый шаблон Цитата:
адаптирован под сервис CSS Menu Maker
и приследует весьма конкретную цель.
Это быстрое и простое создание разнообразных меню с рюшечками и красивостями.

К сожалению указанный сервис не предоставляет CSS для реализации меню с вертикальным раскрытием групп ( т.н. "accordéon" ). А чистое решение на CSS, на самом деле не несёт в себе какой-либо сложности.

#
Re: Выпадающее горизонтальное/вертикальное меню на CSS
Цитата:
А чистое решение на CSS, на самом деле не несёт в себе какой-либо сложности.

lozoffoy, чтобы попросить Вас сделать крайне полезное дело, достаточно ли будет создать новый раздел с соответствующим названием и еще раз попросить Вас об опубликовании такого простого решения?

А за опубликование решения из этого топика - большое ВАМ спасибо, это большое подспорье, несмотря на скудность и однообразие предложенных там решений. Пользовался им, оценил.
#
Re: Выпадающее горизонтальное/вертикальное меню на CSS
Подскажите, а можно ограничить показ вложений например до второго уровня?
Или все ограничивается только css?
Кастомизация под hostcms http://alxpst.tmweb.ru/posts/tag/HostCMS/
Авторизация