Меню и сетка, закодированные в TypeScript, отображаются некорректно

#css #angular #grid

#css #угловой #сетка

Вопрос:

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

Я хочу, чтобы меню выглядело так:

Предполагаемый дизайн

Однако в настоящее время поведение работает не очень хорошо, т.е.

Текущее поведение меню

Я создал здесь stackblitz: https://stackblitz.com/edit/angular-ivy-ejlj7n?file=src/app/app.module.ts

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

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

Спасибо!

Ответ №1:

Хорошо, поэтому я отказался от чистой версии pure css и с помощью небольшого кода заставил ее работать. Я все еще не уверен, почему это не работало раньше, но то, что я сделал, это повторил над пунктами меню, а при наведении курсора мыши на пункт меню обновил переменную в коде, которая позволяет отображать подпункты, поэтому весь [нестайлинговый] код был:

 menuHoverId: number;
menuMidHoverId: number;
menuHover(id: number) { this.menuHoverId = id; }
menuMidHover(id: number) { this.menuMidHoverId = id; }
  

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

     <header>
        <div class="grid-container">
           <div class="title">Test/Blocks/etc</div>

           <div class="top-menu">
              <div class="top-menu-item" *ngFor="let section of menuList; let i = index" (mouseover)="menuHover(i)">{{ section.title }}</div>
           </div>

           <div class="mid-menu">
              <span *ngFor="let section of menuList; let i = index">
                 <span *ngIf="menuHoverId===i">
                    <div class="mid-menu-item" *ngFor="let link of section.items; let o = index" (mouseover)="menuMidHover(o)">{{ link.name }}</div>
                 </span>
              </span>
           </div>
           
           <div class="bottom-menu">
              <span *ngFor="let section of menuList; let i = index">
                 <span *ngIf="menuHoverId===i">
                    <span *ngFor="let link of section.items; let o = index">
                       <span *ngIf="menuMidHoverId===o">
                          <div class="bottom-menu-item" *ngFor="let subsim of link.subItems; let t = index">
                             {{ subsim.name }}
                          </div>
                       </span>
                    </span>
                 </span>
              </span>
           </div>
        </div>
    </header>
  

и тогда css — это простая компоновка сетки:

 .grid-container {
   display: grid;
   grid-template-columns: 1fr;
   grid-template-rows: repeat(4, auto);
   gap: 4px 0px;
   grid-template-areas:
        "title"
        "top-menu"
        "mid-menu"
        "bottom-menu";
   }
   .title { grid-area: title; }
   .top-menu { grid-area: top-menu; }
   .top-menu-item { display: inline-block; }
   .mid-menu { grid-area: mid-menu; }
   .mid-menu-item { display: inline-block; }
   .bottom-menu { grid-area: bottom-menu; }
   .bottom-menu-item { display: inline-block; }
  

Это работает гладко — не то решение, которое я искал, но это решение, которое меня может беспокоить 🙂

Спасибо всем, кто рассмотрел проблему!