Содержание

Как заставить корректно работать многоуровневое Bootstrap меню в MODX?

Здравствуйте. Подскажите пожалуйста как подправить pdomenu, уже основная часть вроде бы работает но есть выпадающий пункт меню отличающийся от других
<li>
как его заставить заработать в pdomenu.
То что я сейчас вывожу работает но наполовину:

<div>
<nav>
[[pdoMenu?
&level=`5`
&parents=`mega-menu`
&firstClass=`nav nav-pills nav-main`
&lastClass=`0`
&hereClass=`active`
&parentClass=`dropdown dropdown-toggle`
&outerClass=`nav nav-pills nav-main`
&levelClass=``
&tplOuter=`@INLINE <ul [[+classes]]>[[+wrapper]]</ul>` 
&tplInner=`@INLINE <ul>[[+wrapper]]</ul>`
&tplParentRow=`@INLINE <li [[+classes]]><a href="[[+link]]" title="[[+pagetitle]]" [[+attributes]]><span>[[+menutitle]]</span></a>[[+wrapper]]</li>`
&tplParentRowActive=`@INLINE <li><a title="[[+pagetitle]]"><span>[[+menutitle]] <i aria-hidden="true"></i></span></a>[[+wrapper]]</li>`
]]
</nav></div>
Часть кода по которому реализуется в pdomenu:

<li>
<a href="#">
<span>НАШИ УСЛУГИ</span></a>

<ul>
<li>
<div>
<div>
<ul>
<li><span>ПОЛУСУХАЯ СТЯЖКА</span></li>
<li><a href="portfolio-grid-1-columns. html">1 COLUMN</a></li>
<li><a href="portfolio-grid-2-columns.html">2 COLUMNS</a></li>
<li><a href="portfolio-grid-3-columns.html">3 COLUMNS</a></li>
<li><a href="portfolio-grid-4-columns.html">4 COLUMNS</a></li>
<li><a href="portfolio-grid-5-columns.html">5 COLUMNS</a></li>
<li><a href="portfolio-grid-6-columns.html">6 COLUMNS</a></li>
</ul></div>

<div>
<ul>
<li><span>СУХАЯ СТЯЖКА</span></li>
<li><a href="[[~3]]">ОПИСАНИЕ</a></li>
<li><a href="portfolio-masonry-3-columns.html">3 COLUMNS</a></li>
<li><a href="portfolio-masonry-4-columns.html">4 COLUMNS</a></li>
<li><a href="portfolio-masonry-5-columns.html">5 COLUMNS</a></li>
<li><a href="portfolio-masonry-6-columns.
html">6 COLUMNS</a></li> </ul></div> <div> <ul> <li><span>КЛАССИЧЕСКАЯ</span></li> <li><a href="portfolio-single-extended.html">EXTENDED ITEM</a></li> <li><a href="portfolio-single-parallax.html">PARALLAX IMAGE</a></li> <li><a href="portfolio-single-slider.html">SLIDER GALLERY</a></li> <li><a href="portfolio-single-html5-video.html">HTML5 VIDEO</a></li> <li><a href="portfolio-single-masonry-thumbs.html">MASONRY THUMBS</a></li> <li><a href="portfolio-single-embed-video.html">EMBED VIDEO</a></li> </ul></div> <div> <ul> <li><span>НАЛИВНОЙ ПОЛ</span></li> <li><a href="portfolio-layout-default.html">DEFAULT</a></li> <li><a href="portfolio-layout-aside-left.
html">LEFT SIDEBAR</a></li> <li><a href="portfolio-layout-aside-right.html">RIGHT SIDEBAR</a></li> <li><a href="portfolio-layout-aside-both.html">BOTH SIDEBAR</a></li> <li><a href="portfolio-layout-fullwidth.html">FULL WIDTH (100%)</a></li> <li><a href="portfolio-layout-tabfilter.html">TAB FILTER & PAGINATION</a></li> </ul></div></div> </li></ul></li>
Нужно что бы было так (пункт наши услуги при наведении): Но на данный момент так: Подскажите пожалуйста что нужно добавить, и еще один момент почему title не работает в пунктах выше второго уровня 🙂 Заранее благодарен за ответ, и сайт Ваш интересный и информативный очень часто выручает!

Если статья понравилась, то поделитесь ей в социальных сетях:

Многоуровневое меню

Постановка задачи
Повторный вызов макроса
Использование шаблонов второй раз
Использование шаблонов третий раз (и более)
Итоговый набор шаблонов
Недостатки подхода
Один вызов макроса
Использование шаблонов второй раз (и более)
Финальная оптимизация
Итоговый набор шаблонов
Дополнение: снятие активности с родительского элемента
Развернут только активный пункт меню
Все пункты меню развернуты

В этом примере рассматривается самое сложное для понимания меню. Однако от топика «Меню в виде списка» пример отличается лишь небольшой логической надстройкой, и понимание принципов, описанных в этой главе, позволит в полной мере оценить преимущества XSLT в качестве языка шаблонизатора.

Построение подобного меню тесно связано с построением так называемой «карты сайта» — списка страниц, отражающего реальную иерархию страниц на сайте (см. также

Карта сайта средствами XSLT-шаблонизатора).

Постановка задачи

Под многоуровневым меню мы будем понимать меню с вложенными пунктами, которые будут определяться реальной иерархией страниц на сайте.

Таким образом, если в структуре сайта мы видим иерархию:

  • страница 1

    • страница 1.1

    • страница 1.2

    • страница 1.3

      • страница 1.3.1

  • страница 2

  • страница 3

То в HTML-коде мы ожидаем получить следующее представление (содержимое тега <a> опущено):

<ul>
  <li>
    <a>страница 1</a>

    
    <ul>
       <li>
         <a>страница 1. 1</a>
       </li>
       <li>
         <a>страница 1.2</a>
       </li>
       <li>
         <a>страница 1.3</a>

         
         <ul>
            <li>
              <a>страница 1.3</a>
            </li>
         </ul> 

       </li>
    </ul>

  </li>
  <li>
    <a>страница 2</a>
  </li>
  <li>
    <a>страница 3</a>
  </li>
</ul>

Сконцентрируемся на задаче получения такого списка, а вопросы оформления его при помощи CSS уже можно будет решить самостоятельно.

За основу возьмем шаблоны, приведенные в топике «Меню в виде списка».

Повторный вызов макроса

Замечание

Этот подход не лишен недостатков, которые мы обсудим далее. Однако он иллюстрирует важные моменты работы XSLT-шаблонизатора.

Мы знаем, что шаблоны из топика «Меню в виде списка» выводят первый уровень, указывают ссылки на страницы и отмечают активный пункт меню.

Из задачи следует, что, если у нас есть вложенные подстраницы, то в текущий элемент списка <li></li> необходимо вставить новый элемент <ul></ul>, внутри которого нужно перечислить все подстраницы.

Таким образом исходные шаблоны для отдельного элемента списка первого уровня должен нам представляться следующим образом:



<xsl:template match="item" mode="menu">
  <li>
     <a href="{@link}">
        <xsl:value-of select="@name"/>
     </a>
     
  </li>
</xsl:template>



<xsl:template match="item[@status = 'active']" mode="menu">
  <li>
     <a href="{@link}">
       <xsl:value-of select="@name"/>
     </a>
     
  </li>
</xsl:template>

Мы знаем, что для того, чтобы получить список вложенных страниц (отображаемых в меню) для определенной страницы сайта, следует передать макросу %content menu()% еще один параметр — идентификатор страницы. Идентификатор доступен в этих шаблонах как атрибут id элемента item (так же как нам доступен атрибут

link, который мы вставляем в ссылку).

Логично было бы потом обработать результаты, которые вернет макрос, и вывести их в нужном нам месте.

Для обработки результатов воспользуемся инструкцией apply-templates, для получения результатов — функцией document(), а для построения запроса макроса с параметром — функцией concat():

<xsl:template match="item" mode="menu">
  <li>
     <a href="{@link}">
        <xsl:value-of select="@name"/>
     </a>
     <xsl:apply-templates select="document(concat('udata://content/menu/0/1/', @id))/udata"/>
  </li>
</xsl:template>

Использование шаблонов второй раз

В этот момент должен возникнуть резонный вопрос: следует ли нам назначить этому вызову свой собственный режим, например mode=»menu-level2″, чтобы обработать результаты макроса отдельно?

Правильный ответ в рамках поставленной задачи: НЕТ. Этот шаблон у нас уже есть.

Для того, чтобы понять, почему это так — рассмотрим уже имеющийся шаблон, обрабатывающий вызов макроса %content menu()%:

<xsl:template match="udata[@module = 'content'][@method = 'menu']">
  <ul>
      <xsl:apply-templates select="items/item" mode="menu"/>
  </ul>
</xsl:template>

Этот шаблон уже и так делает то, что нам нужно: берет содержимое элемента udata с атрибутами module = 'content' и method = 'menu', вставляет теги <ul></ul> и отправляет на обработку все элементы item, результаты помещая между <ul></ul>.

Еще раз остановимся на этом моменте: когда мы отдаем результат в обработку при помощи инструкции apply-templates, шаблонизатор ищет подходящий шаблон среди всех доступных шаблонов. Поэтому условие match="udata[@module = 'content'][@method = 'menu'] также сработает и для повторного вызова макроса.

Аналогично, этот шаблон получит все элементы item при помощи <xsl:apply-templates select="items/item" mode="menu"/> и отправит их на обработку двум следующим шаблонам (в которые мы выше добавили повторный вызов макроса):



<xsl:template match="item" mode="menu">
  <li>
    <a href="{@link}">
      <xsl:value-of select="@name"/>
    </a>
    <xsl:apply-templates select="document(concat('udata://content/menu/0/1/', @id))/udata[items/item]"/>
  </li>
</xsl:template>



<xsl:template match="item[@status = 'active']" mode="menu">
  <li>
     <a href="{@link}">
       <xsl:value-of select="@name"/>
     </a>
     <xsl:apply-templates select="document(concat('udata://content/menu/0/1/', @id))/udata[items/item]"/>
  </li>
</xsl:template>

Использование шаблонов третий раз (и более)

Как видно, этих шаблонах мы снова вызываем макрос %content menu()% и снова у нас уже есть шаблон для обработки результатов. Эта процедура будет повторена снова и снова, пока у нас не будут выбраны все страницы с отмеченной опцией «Отображать в меню». Шаблонизатор, таким образом, «развернет» все дерево иерархии страниц, которые должны попасть в меню, и превратит его во вложенные списки.

Уточняющее условие [items/item] в select для apply-templates, позволяет выбирать элемент udata только в том случае, если у него есть вложенные элементы item (то есть вложенные подстраницы).

Замечание

Если мы уберем повторный вызов макроса из <xsl:template match="item" mode="menu">, то меню будет разворачиваться только для активных пунктов.

Итоговый набор шаблонов

В итоге, если нас интересует вся иерархия, мы должны получить следующий набор шаблонов:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output encoding="UTF-8" method="html" indent="yes"/>

  
  
  <xsl:template match="/">
    <html>
      <head></head>
      <body>
      
        <div>
          <xsl:apply-templates select="document('udata://content/menu/')/udata"/>
        </div>

        <div>
          
        </div>
      </body>
    </html>
  </xsl:template>

  

  <xsl:template match="udata[@module = 'content'][@method = 'menu']">
    <ul>
      <xsl:apply-templates select="items/item" mode="menu"/>
    </ul>
  </xsl:template>

  

  <xsl:template match="item" mode="menu">
    <li>
      <a href="{@link}">
        <xsl:value-of select="@name"/>
      </a>
      
      <xsl:apply-templates select="document(concat('udata://content/menu/0/1/', @id))/udata[items/item]"/>
    </li>
  </xsl:template>

  

  <xsl:template match="item[@status = 'active']" mode="menu">
    <li>
       <a href="{@link}">
         <xsl:value-of select="@name"/>
       </a>
       <xsl:apply-templates select="document(concat('udata://content/menu/0/1/', @id))/udata[items/item]"/>
    </li>
  </xsl:template>

</xsl:stylesheet>

Недостатки подхода

Как нетрудно заметить, вызов макроса осуществляется много раз. И чем более сложная иерархия — тем чаще. Ниже описывается способ, когда достаточно одного вызова макроса %content menu()% для того, чтобы обработать всю иерархию страниц, выводимых в меню.

Один вызов макроса

Рассмотрим ответ макроса %content menu()%, где параметр max_depth регулирует уровень отображения вложенных пунктов меню. Зададим max_depth = 3.

Вызов макроса: udatа://content/menu/0/3 (или можно набрать в URL: http://ваш_сайт/udata/content/menu/0/3)

Примерный ответ макроса (пустые строки вставлены для читаемости):

<udata module="content" method="menu" generation-time="0.035795">
  <items>
    <item link="/page1/" name="страница 1" xlink:href="upage://94">

      <items>
        <item link="/page11/" name="страница 1.1" xlink:href="upage://105">страница 1.1</item>
        <item link="/page12/" name="страница 1.2" xlink:href="upage://106">страница 1. 2</item>
        <item link="/page13/" name="страница 1.3" xlink:href="upage://107">

          <items>
            <item link="/page131/" name="страница 1.3.1" xlink:href="upage://115">страница 1.3.1</item>
          </items>

         страница 1.3

        </item>
      </items>

      страница 1

    </item>
    <item link="/page2/" name="страница 2" xlink:href="upage://95">страница 2</item>
    <item link="/page3/" name="страница 3" xlink:href="upage://96">страница 3</item>
  </items>
</udata>

Задачи у нас те же, что и в предыдущем топике, их можно выразить таким же представлением шаблона:

<xsl:template match="item" mode="menu">
  <li>
     <a href="{@link}">
        <xsl:value-of select="@name"/>
     </a>
     
  </li>
</xsl:template>

Однако, глядя на ответ макроса, мы можем видеть, что для некоторых элементов item мы уже имеем доступ ко вложенным страницам — вложенные элементы item описывают нам подпункты меню.

Тогда, мы можем обработать весь список без дополнительных вызовов и запросов к системе — просто укажем, что надо обработать эти элементы при помощи инструкции apply-templates.

Однако, нам необходимо, чтобы каждый новый список находился в элементе <ul></ul> — следовательно для всего списка подстраниц необходимо выбирать элемент items (он содержит весь список).

<xsl:template match="item" mode="menu">
  <li>
     <a href="{@link}">
        <xsl:value-of select="@name"/>
     </a>
     <xsl:apply-templates select="items" mode="menu"/>
  </li>
</xsl:template>

И необходимо описать шаблон именно для него (условие match="items"). Этот шаблон обрамляет список <ul></ul> и отправляет (apply-templates) вложенные элементы item на обработку.

<xsl:template match="items" mode="menu">
  <ul>
    <xsl:apply-templates select="item" mode="menu"/>
  </ul>
</xsl:template>

Использование шаблонов второй раз (и более)

Также как в и предыдущем примере с повторным вызовом макроса, для элемента item уже есть шаблоны. И это шаблоны <xsl:template match="item" mode="menu"> — для неактивного пункта меню, и <xsl:template match="item[@status = 'active']" mode="menu"> — для активного пункта меню.



<xsl:template match="item" mode="menu">
  <li>
    <a href="{@link}">
      <xsl:value-of select="@name" />
    </a>
    <xsl:apply-templates select="items" mode="menu"/>
  </li>
</xsl:template>



<xsl:template match="item[@status = 'active']" mode="menu">
  <li>
    <a href="{@link}">
      <xsl:value-of select="@name" />
    </a>
    <xsl:apply-templates select="items" mode="menu"/>
  </li>
</xsl:template>

И в этих шаблонах теперь стоит запрос на вложенные элементы. В случае их наличия вызов <xsl:apply-templates select="items" mode="menu"/> снова отправит их к <xsl:template match="items" mode="menu">, который создаст новые теги списка, и отдаст элементы списка на обработку снова этим шаблонам.

Таким образом эти три шаблона обработают все дерево, отданное макросом %content menu()%.

Замечание

Если мы уберем вызов apply-templates из <xsl:template match="item" mode="menu">, то меню будет разворачиваться только для активных пунктов.

Финальная оптимизация

Можно заметить, что шаблон, обрабатывающий результаты вызова макроса, также вставляет элемент <ul></ul>. Можно воспользоваться этим свойством и передать эту задачу шаблону, обрабатывающему элемент items. Тогда набор шаблонов будет выглядеть следующим образом:

  

  <xsl:template match="udata[@module = 'content'][@method = 'menu']">
      <xsl:apply-templates select="items" mode="menu"/>
  </xsl:template>

  

  <xsl:template match="items" mode="menu">
    <ul>
      <xsl:apply-templates select="item" mode="menu"/>
    </ul>
  </xsl:template>

  

  <xsl:template match="item" mode="menu">
    <li>
      <a href="{@link}">
        <xsl:value-of select="@name"/>
      </a>
      
      <xsl:apply-templates select="items" mode="menu"/>    </li>
  </xsl:template>

  

  <xsl:template match="item[@status = 'active']" mode="menu">
    <li>
       <a href="{@link}">
         <xsl:value-of select="@name"/>
       </a>
       <xsl:apply-templates select="items" mode="menu"/>
    </li>
  </xsl:template>

</xsl:stylesheet>

Если посмотреть внимательно, то можно увидеть, что можно также обойтись без шаблона <xsl:template match="udata[@module = 'content'][@method = 'menu']">.

Тогда при первом вызове из шаблона дизайна просто достаточно сразу выбрать элемент items, но обязательно задать ему свой режим mode="menu":

  
  
  <xsl:template match="/">
    <html>
      <head></head>
      <body>
      
        <div>
          <xsl:apply-templates select="document('udata://content/menu/0/3')/udata/items" mode="menu"/>
        </div>

        <div>
          
        </div>
      </body>
    </html>
  </xsl:template>

Итоговый набор шаблонов

Этот вариант получился наиболее лаконичным, быстрым, и использующим всю гибкость языка XSLT:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output encoding="UTF-8" method="html" indent="yes"/>

  
  
  <xsl:template match="/">
    <html>
      <head></head>
      <body>
      
        <div>
          <xsl:apply-templates select="document('udata://content/menu/0/3')/udata/items" mode="menu"/>
        </div>

        <div>
          
        </div>
      </body>
    </html>
  </xsl:template>

  

  <xsl:template match="items" mode="menu">
    <ul>
      <xsl:apply-templates select="item" mode="menu"/>
    </ul>
  </xsl:template>

  

  <xsl:template match="item" mode="menu">
    <li>
      <a href="{@link}">
        <xsl:value-of select="@name"/>
      </a>
      
      <xsl:apply-templates select="items" mode="menu"/>
    </li>
  </xsl:template>

  

  <xsl:template match="item[@status = 'active']" mode="menu">
    <li>
       <a href="{@link}">
         <xsl:value-of select="@name"/>
       </a>
       <xsl:apply-templates select="items" mode="menu"/>
    </li>
  </xsl:template>

</xsl:stylesheet>

Дополнение: снятие активности с родительского элемента

Макрос %content menu()% помечает родительский элемент также атрибутом status = 'active'. Иногда это может быть нежелательно — в таком случае можно воспользоваться еще одним дополнительным уточняющим условием.

Рассмотрим два примера решения для шаблонов с одним вызовом макроса (см. выше).

Развернут только активный пункт меню

Добавим шаблон с условием для неактивных пунктов меню:

<xsl:template match="item[.//item[@status = 'active']]" mode="menu">
    <li>
      <a href="{@link}">
        <xsl:value-of select="@name"/>
      </a>
      <xsl:apply-templates select="items" mode="menu"/>
    </li>
</xsl:template>

Это условие говорит о том, что этот шаблон будет выбран для элемента item, у которого есть дочерние элементы с атрибутом status = 'active'. Логично предположить, что в этот момент открыта дочерняя страница, для этого элемента.

Таким образом итоговый набор шаблонов должен выглядеть следующим образом:

<?xml version="1. 0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output encoding="UTF-8" method="html" indent="yes"/>

  
  
  <xsl:template match="/">
    <html>
      <head></head>
      <body>
      
        <div>
          <xsl:apply-templates select="document('udata://content/menu/0/3')/udata/items" mode="menu"/>
        </div>

        <div>
          
        </div>
      </body>
    </html>
  </xsl:template>

  

  <xsl:template match="items" mode="menu">
    <ul>
      <xsl:apply-templates select="item" mode="menu"/>
    </ul>
  </xsl:template>

  

  <xsl:template match="item" mode="menu">
    <li>
      <a href="{@link}">
        <xsl:value-of select="@name"/>
      </a>
    </li>
  </xsl:template>

  

  <xsl:template match="item[@status = 'active']" mode="menu">
    <li>
       <span>
         <xsl:value-of select="@name"/>
       </span>
       <xsl:apply-templates select="items" mode="menu"/>
    </li>
  </xsl:template>

  

  <xsl:template match="item[. //item[@status = 'active']]" mode="menu">
    <li>
       <a href="{@link}">
         <xsl:value-of select="@name"/>
       </a>
       <xsl:apply-templates select="items" mode="menu"/>
    </li>
  </xsl:template>

</xsl:stylesheet>

Все пункты меню развернуты

В этой ситуации мы можем немного оптимизировать код шаблонов, используя то же условие, что и в предыдущем примере:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output encoding="UTF-8" method="html" indent="yes"/>

  
  
  <xsl:template match="/">
    <html>
      <head></head>
      <body>
      
        <div>
          <xsl:apply-templates select="document('udata://content/menu/0/3')/udata/items" mode="menu"/>
        </div>

        <div>
          
        </div>
      </body>
    </html>
  </xsl:template>

  

  <xsl:template match="items" mode="menu">
    <ul>
      <xsl:apply-templates select="item" mode="menu"/>
    </ul>
  </xsl:template>

  

  <xsl:template match="item[@status = 'active']" mode="menu">
    <li>
       <span>
         <xsl:value-of select="@name"/>
       </span>
       <xsl:apply-templates select="items" mode="menu"/>
    </li>
  </xsl:template>

  

  <xsl:template match="item|item[. //item[@status = 'active']]" mode="menu">
    <li>
       <a href="{@link}">
         <xsl:value-of select="@name"/>
       </a>
       <xsl:apply-templates select="items" mode="menu"/>
    </li>
  </xsl:template>

</xsl:stylesheet>

Замечание

Следует иметь в виду, что приоритет у условий item[@status = 'active'] и item[.//item[@status = 'active']] — одинаковый, поэтому шаблон для неактивных и родительских страниц нужно помещать после шаблона для активных пунктов. По правилам языка XSLT в случае одинакового приоритета выбирается последний встреченный шаблон.

Несколько меню на сайте

Была ли данная статья полезна? Как можно улучшить эту статью?

Меню с изображениями

Составление пользовательского интерфейса и анимация на чистом HTML


Гитхаб

Одна концепция для всех шаблонов UX

Шаблоны UX, такие как меню, ползунки, слои и лайтбоксы, эффекты параллакса, пролистывание страниц, эффекты масштабирования и т.  д. действительно просто интерактивных анимированных слоев . LayerJS — это просто библиотека с открытым исходным кодом , которая обеспечивает одна простая универсальная концепция для создания таких шаблонов в чистом HTML.

Как работает layerJS

В layerJS Фреймы — это контейнеры, которые содержат ваш контент, такой как подстраницы, меню, лайтбоксы, карточки, слайды и т. д. Эти вписываются в Этапы, похожие на виртуальные окна, в которых происходит взаимодействие с пользовательским интерфейсом. Посмотрите анимацию о том, как это работает:

▄▄▄▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄▄▄▄▄ ▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄ ▄▄ ▄▄▄ ▄▄▄▄▄

▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄ ▄▄ ▄▄▄▄▄▄▄

▄▄▄▄▄▄▄ ▄▄▄▄▄ ▄▄▄ ▄▄▄▄▄

▄▄▄▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄▄▄▄▄ ▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄ ▄▄ ▄▄▄ ▄▄▄▄▄

▄▄▄▄ ▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄ ▄▄▄▄▄ ▄▄▄ ▄ ▄ ▄▄ ▄▄▄ ▄▄▄

▄▄▄▄

▄▄▄▄▄▄▄


▄▄▄▄ ▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄ ▄▄▄▄▄ ▄▄▄ ▄ ▄ ▄▄ ▄▄▄ ▄▄▄

▄▄▄▄

▄▄▄▄▄▄▄


▄▄▄▄ ▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄ ▄▄▄▄▄ ▄▄▄ ▄ ▄ ▄▄ ▄▄▄ ▄▄▄

▄▄▄▄

▄▄▄▄▄▄▄


▄▄▄▄ ▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄ ▄▄▄▄▄ ▄▄▄ ▄ ▄ ▄▄ ▄▄▄ ▄▄▄

Играть Повтор

Преимущества

сфера

Универсальный

Одна библиотека для всех шаблонов UX. Слайдер, всплывающие окна, аккордеон, меню, параллакс, (сенсорные) жесты и т. д.

html5

Чистый HTML

Макет интерфейса с атрибутами HTML и определение взаимодействия со ссылками

angular

Играет с

Angular, VueJS, React, jQuery. Используйте свою структуру для изменения содержимого фрейма или динамического создания фреймов.

инструменты

Все дизайны

Полностью независимы от дизайна. LayerJS просто обеспечивает эффекты навигации, оставляя дизайн на ваше усмотрение.

document-file-zip

Lean

30 КБ свернуто в сжатом виде. Нет зависимостей.

Important_Devices

Адаптивный

Работает на мобильных и настольных устройствах. Используйте свой выбор медиазапросов. Добавляет еще больше возможностей для размещения контента на разных экранах.

Определить в чистом HTML

 
 1
2
3
4
5
6
7
8
9
10
 
 
… ваш HTML-код …
… ваш HTML-код …

Просто определите Этапы и Фреймы путем добавления атрибутов к элементам HTML. Определите размеры этапов с помощью CSS. Слои позволяют накладывать кадры. Для каждого этапа требуется как минимум один слой. Используйте HTML-ссылки для запуска переходов, например

 Кадр 2 

Чтобы все заработало, просто включите layerJS в заголовок вашего документа. Наш спонсор KeyCDN предоставит вам сверхбыстрый серверный доступ к библиотеке.

 
 1
2
 
   

Получить учебные пособия по электронной почте Прочтите руководство по началу работы См. примеры

Подходящие режимы и скорость отклика

Поскольку ваш контент будет отображаться на экранах разного размера, соотношение сторон ваших сцен и фреймов, как правило, будет не соответствует. LayerJS предлагает различные режимы подгонки, в том числе ширина, высота, обложка, содержание, отзывчивость, адаптивная ширина, адаптивная высота . Просто выберите режим с помощью атрибут HTML:

 

В зависимости от режима настройки может происходить прокрутка. Начальная позиция прокрутки может быть любой из сверху, слева, снизу, справа, по центру, сверху по центру, снизу слева и т. д. . Это будет установлено с помощью:

 

Вы можете отключить прокрутку, используя

 

Вы все еще можете определить начальную позицию «прокрутки», чтобы указать выравнивание фрейма.

▄▄▄▄▄▄▄ ▄▄▄▄

▄▄▄▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄

См. атрибуты кадра

Переходы

▄▄▄▄▄▄ ▄▄▄▄

▄▄▄▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄

Каждый слой имеет активный фрейм. Переходы заменяют текущий активный кадр слоя целевым кадром. с помощью анимации. Среди прочего существуют различные типы переходов влево, вправо, вверх, вниз, затухание, размытие, увеличение, уменьшение . Активный фрейм может стать специальным фреймом "!none". в этом случае кадр не отображается. Вы можете указать тип перехода в ссылке (см. раздел «Маршрутизация») или в виде рамки или Атрибут слоя:

 

Макеты определяют, какие фреймы и где будут отображаться. Макет по умолчанию — это слайд-макет, который показывает только установленную активную рамку. на сцену. Во время перехода отображаются текущий кадр и целевой кадр. См. Разделы макетов в Wiki.

Межстадийные переходы позволяют отправлять кадры между слоями и этапами. Это позволяет, например, «масштабировать» кадр из сетки. в полноэкранный режим.

Управление с помощью CSS

Альтернатива управлению layerJS с помощью атрибутов HTML ( lj-* или data-lj-* ), вы также можете использовать пользовательские свойства CSS. Преимущество заключается в том, что вы можете сделать само поведение адаптивным с помощью медиа-запросов.

 #меню {
  ширина: 100 пикселей;
  --lj-fit-to: адаптивная высота;
  --lj-переход: левый;
}
@media (максимальная ширина: 640 пикселей) {
  #меню {
    --lj-fit-to: отзывчивый;
    --lj-переход: затухание;
  }
} 

В приведенном выше примере будет изменен режим подгонки и тип перехода кадра с идентификатором 9.0165 меню для экранов меньше 640 пикселей.

Вы можете использовать любой атрибут layerJS также в CSS, кроме lj-type , lj-name . Вы можете смешивать свойства CSS и атрибуты HTML, и в этом случае свойства CSS будут предшествовать.

▄▄▄▄▄▄▄ ▄▄▄▄

▄▄ ▄▄ ▄▄

▄▄▄▄ ▄▄▄▄

▄▄ ▄▄ ▄▄

Посмотреть все атрибуты

Маршрутизация и состояние

d.com/#f1

▄▄▄▄▄▄ ▄▄▄▄

d.com/#f2

▄▄▄▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄

Используя стандартную HTML-ссылку, вы можете запускать переходы. Ссылка должна содержать «#», за которым следует имя кадра. или идентификатор. Это сделает кадр активным кадром в содержащем слое.

  
Вы можете добавить параметры «p» для типа перехода и «t» для продолжительности перехода.

Существуют специальные фреймы, такие как !нет, !следующий, !предыдущий . Вам нужно будет указать идентификатор или имя слоя, чтобы использовать их:

  
Если вы укажете слой и кадр из другого слоя, вы вызовете промежуточный этап. переход.
  

Состояние пользовательского интерфейса определяет, какие фреймы находятся в каких слоях (и, следовательно, в каких стадиях) и какие фреймы активны. Состояние представлено массивом путей:

 stage.contentlayer.home stage.menulayer.leftmenu
stage.popuplayer.!none 
Вы можете предоставить такой массив как ссылку, используя ';' как разделитель для запуска несколько переходов одновременно. Обычно достаточно указать только имя слоя и имя кадра и только укажите пути, которые должны измениться:
  

Переходы изменяют состояние. Состояние будет представлено URL-адресом. При переходе с «f1» на «f2» URL-адрес будет изменять:

 https://domain.com#f1 --> https://domain.com#f2 
URL будет только показать информацию о состоянии, которая отличается от состояния по умолчанию. Как правило, первый кадр в слое будет использоваться по умолчанию. активный фрейм, если вы не укажете фрейм по умолчанию, используя:
 
Модификации URL можно отключить для каждого слоя с помощью атрибута слоя «lj-no-url».

Жесты

Жесты могут запускать переходы. Сюда входят сенсорные жесты и смахивания по сенсорной панели. Существует 4 направления влево, вправо, вверх, вниз . Эти направленные жесты вызовут переходы к указанным кадрам. в соседнем свойстве Frame.

 

▄▄▄▄▄▄ ▄▄▄▄

▄▄▄▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄

 

Отзывы и вопросы

Ваш отзыв очень приветствуется! Если у вас есть какие-либо вопросы или комментарии, пожалуйста, свяжитесь с нами в разработчики@layerjs.org. Мы постоянно совершенствуем layerJS, поэтому с вашими отзывами вы можете помочь сформировать будущее. разработка.

Также, пожалуйста, ознакомьтесь с нашим учебник «Начало работы», Примеры, Часто задаваемые вопросы и Wiki для более подробной документации по функциям layerJS.

Не пропустите обновления от layerJS

Подпишитесь сейчас на нашу рассылку и получайте учебники , Примечания к выпуску и обновления продукта . Применяется наша политика конфиденциальности. Мы не будем спамить вас. Обещано.

  • Гитхаб
  • Работа
  • Лицензия
  • Как внести свой вклад
  • Документация
  • Часто задаваемые вопросы
  • Выходные данные
  • Конфиденциальность
  • © 2016-2017 команда layerJS.
  • Для вопросов или комментариев, пожалуйста, свяжитесь с нами по адресу [email protected]
  • Подпишитесь на нас в:

  • Ускорено KeyCDN.

слоев CSS — учебник по CSS

С помощью CSS можно работать со слоями: фрагментами HTML, которые размещаются поверх обычной страницы с точностью до пикселя.

Преимущества этого очевидны, но опять же Netscape имеет очень ограниченную поддержку слоев CSS, и в довершение всего: предлагаемая им ограниченная поддержка довольно часто выполняется со сбоями.

Таким образом, реальная проблема при работе со слоями состоит в том, чтобы заставить их работать и в браузерах Netscape.

СЛОЙ ОСНОВНЫЕ

Первый взгляд на этот пример:

СЛОЙ 1 СВЕРХУ:

СЛОЙ 1

СЛОЙ 2

СЛОЙ 2 СВЕРХУ:

СЛОЙ 1

СЛОЙ 2

Второй взгляд на код:

СЛОЙ 1 СВЕРХУ:
СЛОЙ 1

СЛОЙ 2

СЛОЙ 2 СВЕРХУ:

СЛОЙ 1

СЛОЙ 2

Чтобы создать слой, все, что вам нужно сделать, это назначить атрибут положения для вашего стиля. Позиция может быть как абсолютной, так и относительной.

Сама позиция определяется свойствами top и left.

Наконец, какой слой находится сверху, определяется атрибутом z-index.


ОТНОСИТЕЛЬНОЕ И АБСОЛЮТНОЕ ПОЗИЦИОНИРОВАНИЕ

Вы можете расположить слой либо по верхнему левому углу (абсолютно), либо по позиции, в которую вставлен сам слой (относительно).

position:absolute
Если вы определяете позицию как абсолютную, она будет рассчитываться из левого верхнего угла страницы — если только слой не определен внутри другого слоя, в этом случае она будет рассчитываться из левого верхнего угла родительского слоя .

position:relative
Если вы определяете положение как относительное, оно будет относиться к положению тега, несущего стиль.
То есть, если вы добавите слой с относительным позиционированием в середине страницы, то позиция будет рассчитываться именно от того места в середине вашей страницы, где он был добавлен.

ОПРЕДЕЛЕНИЕ ПОЗИЦИИ

В то время как свойство position указывает исходную точку нашей системы координат, свойства left и top определяют точное положение нашего слоя.

Вы можете вводить как положительные, так и отрицательные значения для этих свойств - таким образом можно разместить контент выше и левее на странице, чем логическая позиция в HTML-коде, где определяется сам слой.

Другими словами: в нижней части вашего HTML-кода вы можете ввести код слоя, который расположен вверху результирующей страницы.

Свойства слева и сверху могут быть динамически изменены
с помощью JavaScript.

Это означает, что можно перемещать объекты на экране даже после завершения загрузки страницы.

На самом деле эта техника может использоваться (и использовалась) для создания целых игр. Другими вариантами использования могут быть всплывающие меню при обнаружении наведения мыши на ссылку. Возможности безграничны, но для простоты мы не будем вдаваться в подробности об этих динамических HTML-эффектах.


ПОЛОЖЕНИЕ В СТОПЕ - Z-ИНДЕКС

Представьте себе игру из 52 карт. Если бы туз пик был внизу, мы бы сказали, что он имеет z-index:1;. Если бы дама червей была наверху, мы бы сказали, что у нее z-index:52;.

Попробуйте еще раз просмотреть пример кода в верхней части этой страницы и посмотрите, как мы использовали z-индекс, чтобы поместить СЛОЙ 1 наверх в первом примере, а во втором — СЛОЙ 2.

Очень интересные возможности возникают из-за того, что z-индекс может быть динамически изменен с помощью JavaScript.

Вы можете создать несколько "страниц" друг над другом - все на одной странице. Когда пользователь нажимает на ссылку, он просто перемещает слой с нужной информацией вверх, а не загружает новую страницу. Однако методы создания таких эффектов выходят за рамки чистого CSS, поэтому сейчас мы просто обратимся к DHTML (динамический HTML — смесь JavaScript и CSS) для дальнейшего изучения этой области.

ВИДИМЫЕ И СКРЫТЫЕ СЛОИ

Последнее свойство — это свойство видимости, которое позволит вам создавать невидимые слои.

Зачем кому-то создавать невидимый слой? Что ж, представьте, какие возможности он дает для добавления всплывающих меню и других интересных эффектов на ваши страницы.

С помощью динамического HTML можно изменить видимость слоя в соответствии с определенными событиями. Чаще всего это используется для создания всплывающих меню (например, подменю в меню ПУСК в Windows). Хитрость этих меню заключается в том, чтобы создать все подменю как невидимые слои. Затем, когда на ссылке обнаруживается наведение курсора мыши, соответствующий слой становится видимым. (Звучит довольно просто — на самом деле это довольно просто — за исключением тех случаев, когда вы пытаетесь использовать браузеры Netscape, которые, кажется, имеют лишь смутное представление о логике, лежащей в основе слоев CSS).

Допустимые значения свойства видимости: видимый и скрытый.

В этом примере показано, как создать невидимый слой:

HELLO!!!


ПРАКТИЧЕСКОЕ ИСПОЛЬЗОВАНИЕ СЛОЕВ

Очевидно, что слои предлагают определенные возможности для точного позиционирования статических элементов на ваших страницах.

В реальности слои часто используются более динамично:

9009 4
  • Летающие элементы/баннеры на странице

  • Игры, в которых вы перемещаете объект

  • Меню, всплывающие при срабатывании

  • Меню, которые становятся видимыми при срабатывании

Хотя все эти эффекты могут показаться довольно крутыми и полезными — дело в том, что сеть наполнена динамическими эффектами, которые гораздо круче, чем на самом деле нравится среднему посетителю.

Чем больше вы создаете уникальный интерфейс для своего сайта, тем больше вы заставляете посетителя забыть о том, к чему он привык. Не стоит недооценивать силу прилипания к элементам, к которым привык средний посетитель.

Что хорошего в создании эффекта, который заставляет 90% всех веб-дизайнеров хлопать в ладоши, а 90% не-веб-дизайнеров озадачивают или разочаровывают?

В любом случае, судите сами, нужен ли тот или иной эффект, и если да, то смело используйте его.

Автор записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *