> ## Documentation Index
> Fetch the complete documentation index at: https://dokumentation.websale.de/llms.txt
> Use this file to discover all available pages before exploring further.

# Materialien Produktmenüs

> Zwei vollständige Gestaltungsbeispiele für frei positionierte Produktmenüs mit Flyout, einmal waagerecht und einmal senkrecht, jeweils mit Template-Quellcode und Stylesheet.

Ein frei positioniertes Produktmenü bauen Sie aus Bereichen und Schleifen selbst auf. Diese Seite zeigt zwei vollständige Beispiele dafür, die über eine einfache Liste hinausgehen: ein Menü mit Flyout, in dem die Unterkategorien als Raster erscheinen und Platz für Bilder bleibt.

| Beispiel | Hauptmenü | Flyout | Besonderheit |
| - | - | - | - |
| 1 | waagerecht am Seitenkopf | senkrecht darunter | Unterkategorien werden rechnerisch auf drei Spalten verteilt |
| 2 | senkrecht in der Seitenleiste | waagerecht daneben | im Flyout erscheinen zusätzlich Produkte der Hauptkategorie |

Wie Produktmenüs grundsätzlich aufgebaut sind, welche Ebenen-Tags es gibt und was die Status-Klassen bedeuten, steht auf der Anleitungsseite. Diese Seite setzt das voraus.

Wegweiser: [Frei positioniertes Produktmenü](https://dokumentation.websale.de/v8s/navigation/frei-positioniertes-produktmenue.md) · Referenz: [PM- (Produktmenü)](https://dokumentation.websale.de/v8s/referenz/tags/pm-produktmenue.md)

## Was beide Beispiele voraussetzen

Beide Menüs blenden ihr Flyout mit jQuery ein und aus. jQuery kommt im Vorlagenshop aus der WEBSALE JavaScript-Bibliothek ab Version 1.8.1, die im `head`-Bereich jedes Templates stehen muss, das eines dieser Menüs enthält.

Der fünfte Parameter von `WS-LoadProductMenu()` steht in beiden Beispielen auf `no`. Die eingebaute MouseOver-Funktion des Shopsystems wird hier also nicht verwendet, das Ein- und Ausblenden erledigen die Beispiele selbst. Die Bibliothek brauchen Sie trotzdem, aber nur wegen jQuery.

Wenn Ihr Shop jQuery bereits auf anderem Weg einbindet, brauchen Sie die Bibliothek nicht. Für neue Shops ist ohnehin der Weg über die WS-Module vorgesehen.

Materialien: [WEBSALE JavaScript-Bibliothek](https://dokumentation.websale.de/v8s/materialien/websale-javascript-bibliothek.md) · Referenz: [WS-LoadProductMenu()](https://dokumentation.websale.de/v8s/navigation/frei-positioniertes-produktmenue.md#schritt-1-menubaum-vorladen)

## Beispiel 1: Waagerechtes Hauptmenü mit senkrechtem Flyout

Das Hauptmenü steht waagerecht am Seitenkopf. Fährt der Besucher über einen Hauptnavigationspunkt, klappt darunter ein Kasten auf, in dem die Unterkategorien der zweiten und dritten Ebene stehen. Diese Unterkategorien verteilt das Template rechnerisch auf drei gleich hohe Spalten, sodass der Kasten wie ein Raster wirkt. Rechts daneben ist Platz für eine weitere Spalte mit verlinkten Bildern.

![Pm Ep Beispiel1](https://mintcdn.com/websaleag-44ee7ea6/so3Yzq5sY0p_nwzU/images/pm_ep_beispiel1.png?fit=max\&auto=format\&n=so3Yzq5sY0p_nwzU\&q=85\&s=f53463911a38f3517e47382f80ee15ef)

### Wie die Spaltenverteilung rechnet

Der Kern des Beispiels sind vier Zeilen vor der Schleife über die zweite Ebene. Sie bestimmen, nach wie vielen Einträgen eine neue Spalte beginnt.

| Schritt | Was passiert |
| - | - |
| `~DC-Int1_set($PM-NumberOfDirectVisibleEntries$)~` | Anzahl der Unterkategorien dieses Hauptnavigationspunktes |
| `~DC-Int1_div(3)~` | geteilt durch die gewünschte Spaltenzahl, ergibt die Zeilen je Spalte |
| `~DC-Int2_mod(3)~` | prüft, ob bei der Division ein Rest bleibt |
| `{!DC-Int2(0)}~DC-Int1_inc~{/!DC-Int2(0)}` | bleibt ein Rest, bekommt jede Spalte eine Zeile mehr |

In der Schleife zählt `DC-Int2` dann die Einträge mit. Sobald der Zähler den berechneten Wert überschreitet, schließt das Template den Spalten-Container und öffnet den nächsten.

Die Spaltenzahl steht an drei Stellen im Quellcode: zweimal als Argument von `_div` und `_mod`, einmal im Stylesheet über die Breite von `pm-data-level2`. Wollen Sie statt drei Spalten vier, ändern Sie alle drei Stellen.

> [!WARNING]
>
> Weil erst aufgerundet und dann gezählt wird, füllt das Verfahren die vorderen Spalten voll und lässt die letzte gegebenenfalls kürzer. Bei vier Unterkategorien und drei Spalten entstehen deshalb zwei Spalten mit zwei Einträgen und keine dritte. Das ist gewollt, sieht bei sehr wenigen Unterkategorien aber unausgewogen aus.

### Der Quellcode für das Template

> [accordion] Waagerechtes Produktmenü mit Flyout
>
> ```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
> <!-- WS-LoadProductMenu lädt die gewünschten Ebenen des Menüs vor -->
> ~WS-LoadProductMenu(horizontal,1,3,hide,no,0)~
>
> <!-- Setzt alle auf dem Template eventuell bereits gesetzten DC-Counter1 zurück -->
> ~DC-Counter1_reset~
> <ul class="pm-data_level1">
>    <!-- Schleife für die erste Ebene (Hauptnavigationspunkte) -->
>    {@PM-DataLevel1}
>       <!-- DC-Counter, der die vorhandenen Navigationspunkte der ersten Ebene durchzählt -->
>       ~DC-Counter1_inc~
>       <!-- Kategorieindex des Navigationspunktes merken, um Ausnahmen definieren zu können -->
>       ~DC-FP1_set($PM-Index$)~
>       <!-- Jeder Navigationspunkt bekommt über den Zählerwert eine eigene Klasse -->
>       <!-- Über diese Klasse laufen die Farbigkeit und das korrekte Einblenden der Unterpunkte -->
>       <li class="pm-data_level1_~DC-Counter1~"
>           onMouseOver="$('#pm-data_topnav_flyout_~DC-Counter1~').show();"
>           onMouseOut="$('#pm-data_topnav_flyout_~DC-Counter1~').hide();">
>       <!-- Anzeige der Hauptnavigationspunkte (Ebene 1) -->
>       <a href="~PM-Link~" class="level1{PM-IsOpened}_opened{/PM-IsOpened}{PM-IsClosed}_closed{/PM-IsClosed}{PM-IsSelected}_selected{/PM-IsSelected}">
>          ~PM-Name~
>       </a>
>
>       <!-- Erste Berechnung für die Verteilung der Navigationspunkte auf drei Spalten -->
>       <!-- Anzahl aller vorhandenen Unterpunkte -->
>       ~DC-Int1_set($PM-NumberOfDirectVisibleEntries$)~
>       <!-- Division der vorhandenen Unterpunkte, um die Spaltigkeit zu erreichen -->
>       ~DC-Int1_div(3)~
>       <!-- Zweite Berechnung, nötig falls die erste keine Ganzzahl ergeben hat -->
>       ~DC-Int2_set($PM-NumberOfDirectVisibleEntries$)~
>       <!-- Modulo-Berechnung, die prüft, ob ein Rest übrig bleibt -->
>       ~DC-Int2_mod(3)~
>       <!-- Bleibt ein Rest übrig, um 1 erhöhen -->
>       {!DC-Int2(0)}~DC-Int1_inc~{/!DC-Int2(0)}
>       <!-- Nach der Berechnung den Wert auf 0 zurücksetzen -->
>       ~DC-Int2_set(0)~
>
>       {PM-DataLevel2}
>       <div id="pm-data_topnav_flyout_~DC-Counter1~" style="display: none;">
>          {@PM-DataLevel2}
>             <!-- Beginnt bei 1 und öffnet den Container für die erste Spalte -->
>             ~DC-Int2_inc~
>             {DC-Int2(1)}<div class="pm-data-level2">{/DC-Int2(1)}
>             <!-- Schließt die volle Spalte und öffnet die nächste -->
>             {DC-CompareDigitGT($DC-Int2$,$DC-Int1$)}
>                ~DC-Int2_set(1)~
>                </div>
>                <div class="pm-data-level2">
>             {/DC-CompareDigitGT($DC-Int2$,$DC-Int1$)}
>             <!-- Darstellung der Unterpunkte -->
>             <a href="~PM-Link~" class="level2{PM-IsOpened}_opened{/PM-IsOpened}{PM-IsClosed}_closed{/PM-IsClosed}{PM-IsSelected}_selected{/PM-IsSelected}">
>                ~PM-Name~
>             </a>
>             {PM-DataLevel3}
>                {@PM-DataLevel3}
>                   <a href="~PM-Link~" class="level3{PM-IsOpened}_opened{/PM-IsOpened}{PM-IsClosed}_closed{/PM-IsClosed}{PM-IsSelected}_selected{/PM-IsSelected}">
>                      ~PM-Name~
>                   </a>
>                {/@PM-DataLevel3}
>             {/PM-DataLevel3}
>          {/@PM-DataLevel2}
>          </div> <!-- schließt den zuletzt geöffneten pm-data-level2-Container -->
>
>          <!-- Rechte Spalte, erscheint bei allen Hauptnavigationspunkten -->
>          <div class="rechte_spalte">
>             <a href="Ihr gewünschter Link" title="">
>                Ihre Überschrift<br>
>                <img src="Ihr Dateipfad" alt="">
>             </a>
>             <a href="Ihr gewünschter Link">
>                Ihre Überschrift<br>
>                <img src="Ihr Dateipfad" alt="">
>             </a>
>          </div> <!-- rechte Spalte -->
>
>          <!-- Soll eine rechte Spalte nur bei einem bestimmten Hauptnavigationspunkt -->
>          <!-- erscheinen, definieren Sie die Ausnahme über den weiter oben gemerkten Index -->
>          {DC-FP1(Ihr Kategorieindex)}
>             <div class="rechte_spalte">
>                <a href="Ihr gewünschter Link" title="">
>                   Ihre Überschrift<br>
>                   <img src="Ihr Dateipfad" alt="">
>                </a>
>                <a href="Ihr gewünschter Link">
>                   Ihre Überschrift<br>
>                   <img src="Ihr Dateipfad" alt="">
>                </a>
>             </div>
>          {/DC-FP1(Ihr Kategorieindex)}
>          <div class="clear"></div>
>       </div> <!-- pm-data_topnav_flyout -->
>       {/PM-DataLevel2}
>    </li>
>    {/@PM-DataLevel1}
> </ul>
> ```

### Das Stylesheet

> [accordion] Stylesheet zum waagerechten Produktmenü
>
> ```css theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
> /*#####################################################*/
> /* Definitionen für die Darstellung von PM-DataLevel1  */
> /*#####################################################*/
> .pm-data_level1 {
> 	margin: 0px 0px 0px 0px;
> }
> .pm-data_level1 li {
> 	float: left;
> 	position: relative;
> }
> .pm-data_level1 li a {
> 	color: #FFF;
> 	padding: 10px 20px 8px;
> 	text-decoration: none;
> 	text-transform: uppercase;
> 	font-size: 13px;
> }
>
> /*###########################################################################*/
> /* Definitionen für den DIV-Container, in dem PM-DataLevel2 dargestellt wird */
> /*###########################################################################*/
> #pm-data_topnav_flyout_1,
> #pm-data_topnav_flyout_2,
> #pm-data_topnav_flyout_3,
> #pm-data_topnav_flyout_4,
> #pm-data_topnav_flyout_5 {
> 	z-index: 100;
> 	position: absolute;
> 	width: 798px;
> 	padding-top: 20px;
> 	padding-bottom: 20px;
> 	left: 0px;
> }
>
> /*####################################################*/
> /* Definitionen für die Darstellung von PM-DataLevel2 */
> /*####################################################*/
> .pm-data-level2 {
> 	float: left;
> }
> .pm-data-level2 a {
> 	margin: 0px !important;
> 	padding: 0px 20px 8px 20px !important;
> }
> .pm-data-level2 a:hover {
> 	text-decoration: underline;
> }
> #pm-data_topnav_flyout_1 img,
> #pm-data_topnav_flyout_2 img,
> #pm-data_topnav_flyout_3 img,
> #pm-data_topnav_flyout_4 img,
> #pm-data_topnav_flyout_5 img {
> 	margin-top: 5px;
> }
>
> /*###############################################################*/
> /* Erster Hauptnavigationspunkt und dessen Unterpunkte auf Ebene 2 */
> /*###############################################################*/
> .pm-data_level1_1 .pm-data-level2 {
> 	background: #983E3E;
> }
> .pm-data_level1_1 a,
> .pm-data_level1_1 li a:hover {
> 	background: #983E3E;
> 	display: block;
> }
> #pm-data_topnav_flyout_1 {
> 	background: #983E3E;
> }
>
> /*################################################################*/
> /* Zweiter Hauptnavigationspunkt und dessen Unterpunkte auf Ebene 2 */
> /*################################################################*/
> .pm-data_level1_2 a,
> .pm-data_level1_2 li a:hover {
> 	background: #BF7BAE;
> 	display: block;
> }
> #pm-data_topnav_flyout_2 {
> 	background: #BF7BAE;
> 	left: -148px; /* bündig zum ersten Navigationspunkt schieben */
> }
>
> /*###############################################################*/
> /* Dritter Hauptnavigationspunkt und dessen Unterpunkte auf Ebene 2 */
> /*###############################################################*/
> .pm-data_level1_3 a,
> .pm-data_level1_3 li a:hover {
> 	background: #9FC3E5;
> 	display: block;
> }
> #pm-data_topnav_flyout_3 {
> 	background: #9FC3E5;
> 	left: -247px; /* bündig zum ersten Navigationspunkt schieben */
> }
>
> /*###############################################################*/
> /* Vierter Hauptnavigationspunkt und dessen Unterpunkte auf Ebene 2 */
> /*###############################################################*/
> .pm-data_level1_4 a,
> .pm-data_level1_4 li a:hover {
> 	background: #FC773D;
> 	display: block;
> }
> #pm-data_topnav_flyout_4 {
> 	background: #FC773D;
> 	left: -429px; /* bündig zum ersten Navigationspunkt schieben */
> }
>
> /*###############################################################*/
> /* Fünfter Hauptnavigationspunkt und dessen Unterpunkte auf Ebene 2 */
> /*###############################################################*/
> .pm-data_level1_5 a,
> .pm-data_level1_5 li a:hover {
> 	background: #41A838;
> 	display: block;
> }
> #pm-data_topnav_flyout_5 {
> 	background: #41A838;
> 	left: -594px; /* bündig zum ersten Navigationspunkt schieben */
> }
>
> /*#########################################################################*/
> /* Definitionen der separaten rechten Spalte für Grafiken mit Verlinkungen */
> /*#########################################################################*/
> .rechte_spalte {
> 	float: right;
> 	border-left: 1px dotted #fff;
> }
> .rechte_spalte a {
> 	padding: 0px 20px 0px 20px !important;
> }
> ```

> [!WARNING]
>
> Das Stylesheet ist auf **genau fünf Hauptnavigationspunkte** zugeschnitten. Jeder hat seine eigene Farbe und einen von Hand ausgemessenen `left`-Wert, der sein Flyout linksbündig zur Seite schiebt. Hat Ihr Katalog eine sechste Hauptkategorie, bleibt deren Flyout ohne Hintergrund und an der falschen Stelle stehen.
>
> Ergänzen Sie für jede weitere Hauptkategorie einen Block `pm-data_level1_6` samt `#pm-data_topnav_flyout_6`. Die `left`-Werte hängen von der Textbreite Ihrer Kategorienamen ab und müssen neu ausgemessen werden.

Der Wert `798px` in der Flyout-Breite ist die Inhaltsbreite des Beispielshops. Passen Sie ihn an Ihr Layout an, sonst steht der Kasten über oder unter der Seitenbreite.

## Beispiel 2: Senkrechtes Hauptmenü mit waagerechtem Flyout

Das Hauptmenü steht senkrecht in der Seitenleiste. Fährt der Besucher über einen Hauptnavigationspunkt, erscheint rechts daneben ein breiter Kasten mit den Unterkategorien der zweiten Ebene und zusätzlich mit Produktbildern aus dieser Hauptkategorie.

Klickt der Besucher dann auf eine Unterkategorie, bleibt sie zusätzlich im senkrechten Menü aufgeklappt, mitsamt der dritten Ebene. Dafür sorgen die freien Parameter `DC-FP2` und `DC-FP3`.

![Pm Ep Beispiel2n3](https://mintcdn.com/websaleag-44ee7ea6/so3Yzq5sY0p_nwzU/images/pm_ep_beispiel2n3.jpg?fit=max\&auto=format\&n=so3Yzq5sY0p_nwzU\&q=85\&s=552fce450b91c5d2e36031df1a06d880)

### Wie das Aufklappen funktioniert

Das Flyout und das aufgeklappte Untermenü sind zwei verschiedene Dinge, die beide aus derselben Schleife kommen.

| Teil | Wodurch gesteuert |
| - | - |
| Flyout rechts daneben | jQuery über `onMouseOver` und `onMouseOut` |
| aufgeklapptes Untermenü im Hauptmenü | `DC-FP2` beziehungsweise `DC-FP3` mit dem Wert `show` |

Der Trick dabei: Das Template durchläuft die zweite Ebene einmal probeweise und setzt `DC-FP2` auf `show`, sobald einer der Unterpunkte den Zustand geöffnet oder ausgewählt hat. Erst danach entscheidet `{DC-FP2(show)}`, ob der Block überhaupt ausgegeben wird. Für die dritte Ebene wiederholt sich das mit `DC-FP3`.

### Der Quellcode für das Template

> [accordion] Senkrechtes Produktmenü mit Flyout
>
> ```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
> <h2>Senkrechtes Produktmenü mit waagerechtem Flyout</h2>
> <!-- WS-LoadProductMenu lädt die gewünschten Ebenen des Menüs vor -->
> ~WS-LoadProductMenu(sidebar_navi,1,2,show,no,0)~
>
> <div class="ws_menu">
>   <ul class="level1">
>     <!-- Zähler zurücksetzen, er zählt die Navigationspunkte durch -->
>     ~DC-Counter1_reset~
>
>     <!-- Schleife für die erste Ebene (Hauptnavigationspunkte) -->
>     {@PM-DataLevel1}
>
>       <!-- Zähler für die Navigationspunkte der ersten Ebene -->
>       ~DC-Counter1_inc~
>
>       <!-- Kategorieindex merken, um weiter unten die Produkte dieser Kategorie zu laden -->
>       ~DC-FP1_set($PM-Index$)~
>
>       <li>
>         <!-- Über den Zählerwert bekommt jedes Flyout eine eigene Kennung -->
>         <div onMouseOver="$('#ws_topnav_flyout_~DC-Counter1~').show();"
>              onMouseOut="$('#ws_topnav_flyout_~DC-Counter1~').hide();"
>              class="ws_flyout">
>
>           <!-- Anzeige der Hauptnavigationspunkte -->
>           <a href="~PM-Link~" title="~PM-Name~" class="level1_link {PM-IsSelected}selected{/PM-IsSelected}{PM-IsOpened}opened{/PM-IsOpened}">
>             ~PM-Name~
>           </a>
>
>           <!-- Abfrage, ob eine zweite Ebene vorhanden ist -->
>           {PM-DataLevel2}
>           <div id="ws_topnav_flyout_~DC-Counter1~" class="ws_topnav_flyout" style="display: none;">
>
>             <ul class="level2_flyout">
>               <!-- Schleife für die zweite Ebene -->
>               {@PM-DataLevel2}
>                 <li>
>                   <a href="~PM-Link~" title="~PM-Name~" class="{PM-IsSelected}selected{/PM-IsSelected}{PM-IsOpened}opened{/PM-IsOpened}">
>                     ~PM-Name~
>                   </a>
>                 </li>
>               {/@PM-DataLevel2}
>             </ul>
>
>             <!-- Produkte, die dem Hauptnavigationspunkt zugeordnet sind -->
>             {DC-FP1}
>             <!-- DC-FP1 enthält den Index des Hauptnavigationspunktes, -->
>             <!-- die 3 begrenzt die Ausgabe auf drei Produkte -->
>             {Cat-AdvData($DC-FP1$,3)}
>             <div class="ws_topnav_flyout_offer">
>               <h3>Aus dieser Kategorie</h3>
>
>               <!-- Schleife über die geladenen Produkte -->
>               {@PR-Data}
>               <a href="~PR-Link~" class="ws_topnav_flyout_offer_images" title="~PR-Name~">
>                 <img src="~PR-Thumbnail~" alt="~PR-Name~" title="~PR-Name~">
>               </a>
>               {/@PR-Data}
>
>               <div class="clear"></div>
>             </div> <!-- ws_topnav_flyout_offer -->
>             {/Cat-AdvData($DC-FP1$,3)}
>             {/DC-FP1}
>
>             <div class="clear"></div>
>
>           </div> <!-- ws_topnav_flyout -->
>           {/PM-DataLevel2}
>
>           <!-- Unterpunkte bleiben im Hauptmenü aufgeklappt, wenn sie angeklickt wurden -->
>           {PM-DataLevel2}
>
>             <!-- Freien Parameter DC-FP2 zurücksetzen, er merkt sich den Zustand der zweiten Ebene -->
>             ~DC-FP2_reset~
>
>             <!-- Ist ein Unterpunkt der zweiten Ebene geöffnet oder ausgewählt, DC-FP2 auf show setzen -->
>             {PM-IsOpened}~DC-FP2_set(show)~{/PM-IsOpened}
>             {PM-IsSelected}~DC-FP2_set(show)~{/PM-IsSelected}
>
>             <!-- Nur dann wird die zweite Ebene offen angezeigt -->
>             {DC-FP2(show)}
>             <ul class="level2">
>
>               <!-- Schleife für die zweite Ebene -->
>               {@PM-DataLevel2}
>               <li>
>                 <a href="~PM-Link~" title="~PM-Name~" class="{PM-IsOpened}opened{/PM-IsOpened}{PM-IsSelected}selected{/PM-IsSelected}">~PM-Name~</a>
>
>                 <!-- Abfrage, ob eine dritte Ebene vorhanden ist -->
>                 {PM-DataLevel3}
>
>                   <!-- Freien Parameter DC-FP3 zurücksetzen, er merkt sich den Zustand der dritten Ebene -->
>                   ~DC-FP3_reset~
>
>                   <!-- Ist ein Unterpunkt der dritten Ebene geöffnet oder ausgewählt, DC-FP3 auf show setzen -->
>                   {PM-IsOpened}~DC-FP3_set(show)~{/PM-IsOpened}
>                   {PM-IsSelected}~DC-FP3_set(show)~{/PM-IsSelected}
>
>                   <!-- Nur dann wird die dritte Ebene offen angezeigt -->
>                   {DC-FP3(show)}
>                   <ul class="level3">
>                     <!-- Schleife für die dritte Ebene -->
>                     {@PM-DataLevel3}
>                       <li><a href="~PM-Link~" title="~PM-Name~" class="{PM-IsOpened}opened{/PM-IsOpened}{PM-IsSelected}selected{/PM-IsSelected}">~PM-Name~</a></li>
>                     {/@PM-DataLevel3}
>                   </ul>
>                   {/DC-FP3(show)}
>
>                 {/PM-DataLevel3}
>               </li>
>               {/@PM-DataLevel2}
>
>             </ul>
>             {/DC-FP2(show)}
>
>           {/PM-DataLevel2}
>
>         </div> <!-- ws_flyout -->
>       </li>
>
>     {/@PM-DataLevel1}
>
>   </ul>
> </div> <!-- ws_menu -->
> ```

`Cat-AdvData()` öffnet eine Produktliste zu einem Kategorieindex und ist nicht dasselbe wie die `CAT-`Tags, die die gerade aktive Kategorie auslesen. Letztere sind innerhalb des Produktmenüs nicht zulässig, `Cat-AdvData()` dagegen bekommt den Index ausdrücklich als Parameter und wertet ihn als Tag im Tag aus. Deshalb funktioniert `$DC-FP1$` an dieser Stelle.

Die Zahl im zweiten Parameter von `Cat-AdvData()` ist die Höchstzahl der ausgegebenen Produkte. Ohne Stern erhalten Sie die ersten Produkte in Listenreihenfolge, mit Stern eine zufällige Auswahl. `{Cat-AdvData($DC-FP1$,*3)}` zeigt also drei wechselnde Produkte statt immer derselben drei.

### Das Stylesheet

> [accordion] Stylesheet zum senkrechten Produktmenü
>
> ```css theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
> /*######################################################*/
> /* Definitionen für den DIV-Container des Sidebar-Menüs */
> /*######################################################*/
> .ws_menu {
> 	width: 200px;
> }
>
> /*##############################################################*/
> /* Definitionen für die Darstellung von Ebene 1 im Sidebar-Menü */
> /*##############################################################*/
> .level1 {
> 	list-style: none;
> 	margin: 0px 0px 0px 0px;
> 	padding: 0px;
> 	border-bottom: 1px solid #ddd;
> }
> .level1 li {
> 	position: relative;
> }
> .level1 a,
> .level1 a:link,
> .level1 a:visited,
> .level1 a:active,
> .level1 a.opened,
> .level1 a.selected {
> 	display: block;
> 	color: #003366;
> 	font-size: 12px;
> 	border-top: 1px solid #ddd;
> 	padding: 5px 0px 6px 23px;
> 	text-decoration: none;
> 	font-weight: normal;
> 	margin: 0px 0px 0px 0px;
> }
> .level1 a.opened,
> .level1 a.selected {
> 	color: #00adef;
> }
> .level1 a:hover,
> .level1 .ws_flyout:hover a.level1_link {
> 	background: #666666;
> 	color: #00adef;
> 	margin: 0px 0px 0px 0px;
> }
>
> /*##############################################################*/
> /* Definitionen für die Darstellung von Ebene 2 im Sidebar-Menü */
> /*##############################################################*/
> .level2 {
> 	border-top: 1px solid #ddd;
> }
> .level2 a,
> .level2 a:link,
> .level2 a:visited,
> .level2 a:active,
> .level2 a.opened,
> .level2 a.selected {
> 	display: block;
> 	color: #003366;
> 	font-size: 12px;
> 	padding: 5px 0px 6px 33px;
> 	text-decoration: none;
> 	font-weight: normal;
> 	margin: 0px 0px 0px 0px;
> }
>
> /*##################################################################*/
> /* Definitionen für die Darstellung von Ebene 2 im Flyout-Container */
> /*##################################################################*/
> .level2_flyout {
> 	list-style-type: none;
> 	padding: 3px 0px 0px 0px;
> 	margin: 0px 0px 0px 20px;
> 	width: 225px;
> 	float: left;
> 	border-bottom: 1px solid #ddd;
> }
> .level2_flyout a,
> .level2_flyout a:link,
> .level2_flyout a:visited,
> .level2_flyout a:active,
> .level2_flyout a:hover,
> .level2_flyout a.selected {
> 	display: block;
> 	padding: 5px 0px 6px 25px;
> 	text-decoration: none;
> 	font-size: 12px;
> 	color: #fff;
> }
>
> /*##############################################################*/
> /* Definitionen für die Darstellung von Ebene 3 im Sidebar-Menü */
> /*##############################################################*/
> .level3 {
> 	border-top: 1px solid #ddd;
> }
> .level3 a,
> .level3 a:link,
> .level3 a:visited,
> .level3 a:active,
> .level3 a.opened,
> .level3 a.selected {
> 	color: #003366;
> 	font-size: 12px;
> 	padding: 5px 0px 6px 43px;
> 	text-decoration: none;
> 	font-weight: normal;
> 	margin: 0px 0px 0px 0px;
> }
>
> /*#######################################*/
> /* Definitionen für den Flyout-Container */
> /*#######################################*/
> .ws_topnav_flyout {
> 	position: absolute;
> 	top: 1px;
> 	left: 190px;
> 	width: 740px;
> 	padding: 10px 0px 10px 0px;
> 	z-index: 999;
> 	background: #666666;
> }
>
> /*####################################################################################*/
> /* Definitionen für die Grafiken mit Verlinkungen (Produktdarstellung) im Flyout-Menü */
> /*####################################################################################*/
> .ws_topnav_flyout_offer {
> 	float: right;
> 	margin: 0px 28px 0px 0px;
> 	width: 387px;
> }
> .ws_topnav_flyout_offer h3 {
> 	color: #fff;
> 	font-size: 12px;
> 	font-weight: normal;
> 	margin: 0px 0px 6px 9px;
> }
> a.ws_topnav_flyout_offer_images,
> a.ws_topnav_flyout_offer_images:link,
> a.ws_topnav_flyout_offer_images:visited,
> a.ws_topnav_flyout_offer_images:active,
> a.ws_topnav_flyout_offer_images:hover {
> 	float: left;
> 	margin: 0px 0px 0px 10px;
> 	background: #fff;
> 	padding: 0px 0px 0px 0px;
> }
> ```

> [!WARNING]
>
> Die Namen passen nicht zusammen, das Flyout bleibt deshalb ohne Position, ohne Breite und ohne Hintergrund stehen. Hier auf die Namen des Quellcodes vereinheitlicht.

Die Werte `190px` für den linken Abstand und `740px` für die Breite des Flyouts gehören zusammen mit der Menübreite von `200px`. Ändern Sie die Menübreite, ziehen Sie den linken Abstand mit.

Das Ein- und Ausblenden über `onMouseOver` und `onMouseOut` stammt aus der Entstehungszeit der Beispiele. Für einen neuen Shop erreichen Sie dasselbe ohne JavaScript über `.ws_flyout:hover .ws_topnav_flyout { display: block; }`. Das Beispiel nutzt diese Technik bereits für die Hervorhebung des Hauptnavigationspunktes, siehe die Regel `.level1 .ws_flyout:hover a.level1_link`.

Referenz: [DC-Counter1…3](https://dokumentation.websale.de/v8s/referenz/tags/dc/rechnen.md#die-tags-im-uberblick) · [DC-FP1…9](https://dokumentation.websale.de/v8s/referenz/tags/dc/parameter.md) · [Cat-AdvData()](https://dokumentation.websale.de/v8s/referenz/tags/cat/navigation-und-kategoriebaum.md#cat-advdata)


## Related topics

- [Frei positioniertes Produktmenü](https://dokumentation.websale.de/v8s/navigation/frei-positioniertes-produktmenue.md)
- [PM- (Produktmenü)](https://dokumentation.websale.de/v8s/referenz/tags/pm-produktmenue.md)
- [Materialien Parameterentfernung](https://dokumentation.websale.de/v8s/materialien/materialien-parameterentfernung.md)
- [Materialien Direktbestellung](https://dokumentation.websale.de/v8s/materialien/materialien-direktbestellung.md)
- [Materialien Produktbewertung](https://dokumentation.websale.de/v8s/materialien/materialien-produktbewertung.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.