Материал Sidenav переполняет содержимое, если изображение находится в sidenav

Доброе утро!

Я использую боковую навигацию Material Design в своем приложении Angular, чтобы предложить пользователю выбор страницы. Боковая навигация сначала содержит логотип, а затем все страницы, которые пользователь может выбрать, если он вошел в систему.

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

Материал Sidenav переполняет содержимое, если изображение находится в sidenav

Как видите, sidenav учитывает ширину логотипа. Контента нет.

HTML:

<mat-card>
    <mat-sidenav-container>
        <mat-sidenav #drawer mode = "side" opened role = "navigation">
            <mat-nav-list>
                <div class = "logo-nav">
                    <img src = "./assets/MyLogo.png">
                </div>
                <a id = "nav-home" mat-list-item routerLink='home' routerLinkActive = "active">Home</a>
                <a id = "nav-schulauswahl" mat-list-item routerLink='page1' routerLinkActive = "active" *ngIf = "loggedIn">
                    Page 1
                </a>
                <a id = "nav-schule-list" mat-list-item routerLink='page2' routerLinkActive = "active" *ngIf = "loggedIn">
                    Page 2 with very long name
                </a>
                <a id = "nav-logout" mat-list-item (click)='logout()' routerLinkActive = "active">Logout</a>
            </mat-nav-list>
        </mat-sidenav>

        <mat-sidenav-content>
            Some Content
        </mat-sidenav-content>
    </mat-sidenav-container>
</mat-card>

Машинопись:

import { Component } from '@angular/core';

@Component({
    selector: 'my-sidenav',
    templateUrl: './sidenav.component.html',
    styleUrls: ['./sidenav.component.scss']
})
export class SidenavComponent {

    get loggedIn(): boolean {
        return true; // <- Toogle this to see all page links
    }
}

Суть проблемы: margin-left из mat-sidenav-content вычисляется неправильно. В качестве обходного пути я жестко запрограммировал его на 230 пикселей, но это, конечно, создает уродливый разрыв между sidenav и контентом, если пользователь не вошел в систему:

CSS:

@import '../../styles/colors.scss';

.logo-nav {
    width: 100%;
    text-align: center;
}

// Workaround
mat-sidenav-content {
    margin-left: 230px !important;
}

Материал Sidenav переполняет содержимое, если изображение находится в sidenav

Если пользователь вошел в систему, то отображаются более длинные имена страниц, что делает расчет left-margin правильным.

Материал Sidenav переполняет содержимое, если изображение находится в sidenav

Вы развернули свой код на любом сервере? Если да поделитесь ссылкой. Спасибо

Hassan Siddiqui 08.04.2019 11:49
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
1
1 334
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть несколько способов исправить это. Например:

  1. Применение свойства width к вашему логотипу. Может быть 100% или 230px, как вы использовали.
.logo-nav img {
  min-width: 230px;
}
  1. Установка свойства width для самого sidenav. https://material.angular.io/components/sidenav/overview#setting-the-sidenav-39-s-size
.mat-sidenav {
  width: 230px;
}
  1. Изменение отображения mat-nav-list на flex с направлением column.
.mat-nav-list {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}

Спасибо за все эти варианты. Я использовал второй из-за другой проблемы с материалом sidenav: когда появляется другая опция и изменяется ширина sidenav, левое поле mat-sidenav-content не пересчитывается сразу - только после обновления страницы. Но для моих целей подходит фиксированная ширина сиденава.

Ruik 15.04.2019 14:39

Другие вопросы по теме