【问题标题】:Angular Material Select w/ Columns带/列的角度材料选择
【发布时间】:2020-09-20 05:11:44
【问题描述】:

我正在尝试设置选择面板的样式,使项目显示在几列中,但每列的最后一项似乎偏离中心并拆分,溢出从下一列的顶部开始。理想情况下,滚动是垂直的,但它似乎是水平滚动以覆盖溢出。我的列表有 30 多个项目,并且允许多选。目标是一次向用户显示尽可能多的选项,这样他们就不必滚动太多。

全栈闪电战: https://stackblitz.com/edit/angular-bt3gs6

select-multiple-example.scss

.toppings-panel.mat-select-panel {
  column-count: 2;
  column-width: 200px;
  width: 400px;
  max-width: 400px;
}

select-multiple-example.html

  <mat-select [formControl]="toppings" panelClass="toppings-panel" multiple>
    <mat-option *ngFor="let topping of toppingList" [value]="topping">{{topping}}</mat-option>
  </mat-select>

select-multiple-example.ts

export class SelectMultipleExample {
  toppings = new FormControl();
  toppingList: string[] = ['Pepperoni', 'Sausage', 'Ham', 'Bacon', 'Chicken', 
                           'Mushroom', 'Red onion', 'White onion', 'Tomato', 'Olives', 
                           'Green bell peppers', 'Pineapple', 'Artichoke', 'Spinach', 
                           'Basil', 'Hot pepper flakes', 
                           'Parmesan', 'Shredded cheddar', 'Extra mozzarella'];
}

【问题讨论】:

  • 您的 Stackblitz 似乎没有包含您问题中发布的代码
  • 抱歉,我的 StackBlitz 技能有点生疏了。 :) 我已经更新了问题中的链接。

标签: css angular angular-material multiple-columns


【解决方案1】:

列偏离中心和拆分的问题是.mat-select-panel 的高度。

它有 max-height:256px;(在 Angular Material 代码中设置)。但是,由于它有一个水平滚动条(高度为17px,在 Windows - Chrome 中),可用剩余空间为:256 - 17 = 239px

mat-option 的高度为 48px,因此一列中的 5 个选项将占用 240px

一个快速的解决方案是将.mat-select-panel 的高度增加到257px

演示:https://stackblitz.com/edit/angular-bt3gs6-wxwkgg

但是,上面的示例在 MacOS 上无法正确显示;它像绝对定位的内容一样显示滚动条,并且有更多可用空间:


我通过删除列(跨浏览器和跨平台很难实现)并采用 使用display: flex 处理.mat-select-panel 元素:

水平滚动

.toppings-panel.mat-select-panel {
  width: 400px;
  max-width: 400px;
  display: flex;
  flex-direction: column;
  flex-wrap: wrap;
  min-height: 257px;   // min-height needed for windows browsers
}

 .toppings-panel.mat-select-panel .mat-option {
   min-width: 50%;  // 50% to have 2 columns visible
  }

演示:https://stackblitz.com/edit/angular-bt3gs6-lwvwav

垂直滚动

如果您更喜欢垂直滚动,只需从上面的代码中删除flex-direction: column; 并使用max-height 来设置默认可见行:

.toppings-panel.mat-select-panel {
  width: 400px;
  max-width: 400px;
  display: flex;
  flex-wrap: wrap;

  max-height: 240px; /* 240px - for 5 items / column */
}

.toppings-panel.mat-select-panel .mat-option {
  min-width: 50%;
}

演示:https://stackblitz.com/edit/angular-bt3gs6-iykn4w

【讨论】:

  • 我真的很想向下滚动而不是滚动查看更多选项,但这看起来很干净,所以我会接受它!谢谢一百万。
  • 看来我真的没有阅读您喜欢向下滚动的问题部分。请查看更新的示例:stackblitz.com/edit/angular-bt3gs6-iykn4w
  • 嗨@andreivictor,你知道为什么当你选择项目并且滚动条不在顶部或底部时,为什么选择项目会导致窗格滚动?
  • 这是Material Select 的默认行为...参见:github.com/angular/components/blob/…。我认为没有办法禁用它
猜你喜欢
  • 2016-10-18
  • 2020-02-06
  • 1970-01-01
  • 2017-05-13
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
相关资源
最近更新 更多