【问题标题】:setting row height not to go below bottom of page bootstrap设置行高不低于页面引导程序的底部
【发布时间】:2017-01-10 15:48:39
【问题描述】:

我正在尝试制作一个将根据窗口大小缩放其大小的 sidenav。

我给它一个项目列表,这些项目组合起来比窗口高度高。我想让它成为一个可滚动列表,而不设置最大高度,而是让它始终是窗口高度。

这是它目前的样子:

可以看到窗口向下滚动,sidenav 滚动被禁用。我已经尝试了很多东西,目前这是我的代码状态:

logs.component.html

<div class="container" [style.max-height]="containerHeight()" (window:resize)="resize($event.target.innerHeight)">
  <div class="row">
    <div class="col-2" color="primary">
      <app-search-sidebar (selectedChanged)="selected=$event" [items]="items"></app-search-sidebar>
    </div>
    <div class="col-10">
      <md-tab-group>
        <md-tab [label]="selected">
          <h1>{{selected}}</h1>
          <p>...</p>
        </md-tab>
      </md-tab-group>
    </div>
  </div>
</div>

logs.component.css

.container {
    width: 100%;
    min-height: 100%;
    overflow: hidden;
}

.row {
    height: 100%;
    margin-bottom: -9999px;
    padding-bottom: 9999px;
}

.row > div {
    padding: 10px;
}

logs.component.ts

import { Component, OnInit } from '@angular/core';
import { ProcessesList } from './mock_data';

@Component({
  selector: 'app-logs',
  templateUrl: './logs.component.html',
  styleUrls: ['./logs.component.css']
})
export class LogsComponent {

  items: string[] = ProcessesList;
  selected: string = '';
  height: number;


  containerHeight(): number {
    return this.height <= 0 ? window.innerHeight : this.height;
  }

  resize(height: number) {
    this.height = height;
  }
}

这是一个相当奇怪的尝试,但它仍然没有帮助。

内部组件:

搜索边栏.component.html

<div>
  <label class="sr-only" for="processName">Process Name</label>
  <div class="input-group mb-2 mr-sm-2 mb-sm-0">
    <div class="input-group-addon">
      <md-icon>search</md-icon>
    </div>
    <input type="text" [(ngModel)]="searchValue" class="form-control" id="processName" placeholder="Process Name">
  </div>
  <div class="process-list">
    <md-list>
      <md-list-item *ngFor="let item of items | listFilter:searchValue">
        <button md-raised-button [color]="isSelected(item) ? 'primary' : ''"
                class="process-name" (click)="changeSelected(item)">
          {{item}}
        </button>
      </md-list-item>
    </md-list>
  </div>
</div>

search-sidebar.component.css

.process-name {
    width: 100%;
}

.process-list {
    overflow-y: scroll;
}

search-sidebar.component.ts

import { Component, Input, Output, EventEmitter } from '@angular/core';

@Component({
  selector: 'app-search-sidebar',
  templateUrl: './search-sidebar.component.html',
  styleUrls: ['./search-sidebar.component.css']
})
export class SearchSidebarComponent {
  @Input() public items: string[] = [];
  @Output() selectedChanged: EventEmitter<string> = new EventEmitter<string>();
  private _selected: string = '';
  private searchValue: string;

  changeSearch(search: string) {
    this.searchValue = search;
  }

  isSelected(item: string) {
    return this.selected === item;
  }

  changeSelected(selected: string) {
    if (this.selected !== selected) {
      this.selected = selected;
    }
  }

  get selected() {
    return this._selected;
  }
  set selected(selected: string) {
    this._selected = selected;
    this.selectedChanged.emit(this.selected);
  }
}

我尽可能使用 Angular Material 2,否则纯 Bootstrap 4

【问题讨论】:

    标签: angular layout bootstrap-4 angular-material2


    【解决方案1】:

    这一切都可以通过 CSS 和使用 flex 来完成!

    工作示例:http://embed.plnkr.co/5NsImxRJc5dvddfnr6s6/

    诀窍是将 HTML 和 BODY 的高度设置为 100%,以及将所有父 DIV 设置为容器 DIV。然后将容器 DIV 设置为“display: flex; overflow-y: auto”。

    您很少应该将布局代码放入 Angular 类中。

    【讨论】:

    • 我没有提到的是我在顶部还有一个工具栏,它确实从顶部占据了一点高度,虽然我还没有检查过,但很可能当我使用 100%容器上的高度,它会溢出工具栏的高度。关于如何容纳工具栏的任何想法?也许做一个top: -TOOLBAR-HEIGHTpx 把戏什么的?
    • 我已经设法使用calc(100% - 64px) 限制了组件的包含 div 高度,但是现在,内部组件不会根据它包含 div 进行缩放(内部 div 高度大于它包含 div 的高度)。这是我打开的新帖子,以防您需要帮助:http://stackoverflow.com/questions/41563621/limiting-size-of-component-to-containing-divs-height
    • 无需使用 calc 或以像素为单位指定高度 - 每个 div 都可以自行调整大小。诀窍是在容器上使用另一个 flex(这次是垂直的),并将工具栏和日志面板放在其中:.container { display: flex; height: 100%; flex-direction: column; } .logpanel { display: flex; } 更新示例:plnkr.co/edit/5NsImxRJc5dvddfnr6s6?p=preview
    【解决方案2】:

    答案是在 css 中使用 calc,因为工具栏也有一些高度。

    最后,就是css:

    logs.component.css

    .row {
        width: 100%;
        margin: 0;
    }
    
    .row > .col* {
        padding: 0;
    }
    
    .container {
        display: flex;
        height: 100%;
        width: 100%;
        padding: 0;
        min-height: calc(100% - 64px);
        max-height: calc(100% - 64px);
    }
    
    app-search-sidebar {
        overflow-y: auto;
        display: block;
        height: 100%;
    }
    
    .sidebar-container {
      min-width: 300px;
      /*max-width: 300px;*/
    }
    

    【讨论】:

      猜你喜欢
      • 2021-01-19
      • 1970-01-01
      • 2017-04-12
      • 2022-11-15
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      相关资源
      最近更新 更多