如何控制角度材质中的md-select下拉位置

Sco*_*ner 12 javascript css angularjs angular-material

我需要自定义md-select,以便选项列表更像传统的选择.选项应显示在select元素下方,而不是悬停在元素顶部.有没有人知道存在这样的东西,或者如何实现这个目标?

cam*_*kid 6

你去吧 - CodePen

使用该md-container-class属性.来自文档:

在此输入图像描述

标记

<div ng-controller="AppCtrl" class="md-padding" ng-cloak="" ng-app="MyApp">
  <md-input-container>
    <label>Favorite Number</label>
    <md-select ng-model="myModel" md-container-class="mySelect">
      <md-option ng-value="myVal" ng-repeat="myVal in values">{{myVal.val}}</md-option>
    </md-select>
  </md-input-container>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS

.mySelect md-select-menu {
  margin-top: 45px;
}
Run Code Online (Sandbox Code Playgroud)

JS

(function () {
  'use strict';
  angular
      .module('MyApp',['ngMaterial', 'ngMessages', 'material.svgAssetsCache'])
      .controller('AppCtrl', function($scope) {
        $scope.required = "required";
        $scope.values = [
          {val:1, des: 'One'},
          {val:2, des: 'Two'}
        ];
      });
})();
Run Code Online (Sandbox Code Playgroud)

  • 这不会一直有效.请注意,当您再次更改所选值时选择了值2,现在输入框已部分覆盖.你拥有的选择越多,这就越明显.选择一个值后,所选值所在列表中的位置越远,一旦您再次单击再次选择,弹出窗口就会向上移动得越多. (2认同)

sta*_*247 6

这适用于Angular 2+的材质

使用disableOptionCentering选项,例如:

<mat-select disableOptionCentering>
  <mat-option *ngFor="let movie of movies" [value]="movie.value">
    {{ movie.viewValue }}
  </mat-option>
</mat-select>
Run Code Online (Sandbox Code Playgroud)


Sco*_*ner -1

所以这就是我必须用 Javascript 和 setTimeout 做的事情,尽管解决方案很丑陋。仅使用 CSS 无法有效地做到这一点,因为 Material Design 使用下拉菜单的 javascript 定位。因此,我必须将一个函数附加到内部的弹出窗口,我设置了 200 毫秒的超时,用于计算屏幕上下拉列表的所需位置并将其移动到那里。我还在控制器中附加了一个函数到窗口调整大小事件,这样它就会随着调整大小而移动。

最终,您必须使用超时来获得材料设计时间来执行基于 javascript 的弹出窗口移动,然后自己移动它。我还使用了一个技巧来在移动发生时隐藏它,这样用户就看不到跳跃。这就是我必须做的事情的描述,以防其他人尝试类似的情况。

  • 你的解决方案很好,但为什么没有代码示例? (4认同)