html - Bootstrap下拉高度不随数据变化而更新 - Angular
问题描述
很抱歉,我要重新发布此问题,但由于缺少最少的可重现代码,我之前的问题被标记为已关闭。我已经附上了一个stackblitz链接。
原始问题 - Bootstrap 搜索选择下拉列表,但现在当我尝试搜索列表并且下拉列表在顶部打开时,列表会缩小并漂浮在半空中
请不要关闭这个。这对我的项目非常重要,我已经坚持了 16 个小时。
我在 Angular 8 项目中使用引导下拉菜单创建了一个自定义搜索选择下拉菜单。该功能完美运行,但问题在于下拉菜单在元素顶部打开时。现在,当我使用搜索框进行搜索时,列表会相应地更新并缩短,但它会一直漂浮在半空中。您可以在下面的 GIF 中看到问题。
问题 GIF - https://imgur.com/a/SeMVjns
正如您在我搜索的第一种情况中看到的那样,列表被缩短并且漂浮在半空中。我想要的是当列表被缩短时,它仍然直接出现在专家下拉按钮的上方,中间没有任何空格。
下面是我的 HTML 代码:
<div class="dropdown h-100" [ngClass]="{'statusDropdownContainer': config.src != 'unavailability'}">
<a class="btn btn-white dropdown-toggle mb-2 statusFilterDropdown h-100 w-100 flex-middle" [ngClass]="{'btnDisable': disable, 'srcUnavailability': config.src == 'unavailability' }" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="text-truncate">{{config.src != 'unavailability' ? config.dropdownTitle + ':' : ''}} {{selectedValue ? selectedValue : 'All'}}</span>
</a>
<div class="dropdown-menu w-100 pt-0" aria-labelledby="dropdownMenuButton">
<input type="text" class="w-100 p-2 searchInput" [ngModel]="searchValue" (ngModelChange)="filterDropdown($event)" placeholder="{{config.placeholder}}">
<a *ngFor="let option of filteredList; let i=index" class="dropdown-item pointer text-contain" [ngClass]="{'alternateBackground': i%2 == 0 }" (click)="selectValue(option.name, option.unique_code)">
{{option.name}}
</a>
<div *ngIf="filteredList.length <=0" class="text-center text-muted mt-1">No {{config.user}} found</div>
</div>
</div>
我需要进行哪些 CSS 更改?
Stackblitz - https://stackblitz.com/edit/angular-ivy-nghkhp?file=src/app/app.component.html
编辑:我找到了导致问题的确切问题。Bootstrap 的下拉菜单使用 popperJS 来定位下拉菜单。PopperJS 在滚动事件上计算下拉菜单的位置,因此每当窗口滚动时,都会重新计算下拉菜单的尺寸(使用变换 CSS)。但在我的情况下,由于没有滚动,因此不会计算尺寸,并且下拉菜单的高度与用户在搜索框中搜索内容之前的高度相同。但我想要的是每次列表数据发生变化时重新计算维度。任何的意见都将会有帮助。谢谢。
解决方案
Bootstrap 的下拉菜单使用 popperJS 来定位下拉菜单。PopperJS 在滚动事件上计算下拉菜单的位置,因此每当窗口滚动时,都会重新计算下拉菜单的尺寸(使用变换 CSS)。
一种方法是让主体的高度略高于视口高度,然后以编程方式触发 ngModelChange 上的滚动
您可以添加到 CSS(如果不需要,您也可以隐藏垂直滚动条overflow-y: hidden;
)
body {
min-height: 101vh;
}
您可以在您的方法中添加向下滚动 1px 并向上滚动 1px以达到所需的效果。filterDropdown(e)
ngModelChange
filterDropdown(e) {
console.log("e in filterDropdown -------> ", e);
window.scrollTo(window.scrollX, window.scrollY + 1);
let searchString = e.toLowerCase();
if (!searchString) {
this.filteredList = this.data.slice();
return;
} else {
this.filteredList = this.data.filter(
user => user.name.toLowerCase().indexOf(searchString) > -1
);
}
window.scrollTo(window.scrollX, window.scrollY - 1);
console.log("this.filteredList indropdown -------> ", this.filteredList);
}
推荐阅读
- ffmpeg - ffmpeg 剪切视频并额外输出音频
- c++ - 如何删除文本文件中存储的数据?
- arrays - 表数组中的 VLOOKUP 键是一个公式
- nuxt.js - 使用“nuxt build”时动态创建的类不可用 - tailwindcss nuxtjs
- rasa - Rasa Agent 不支持超过 23 req/sec
- python - Plotly Dash 在仪表板中给我一个“加载布局错误”消息。如何解决?
- python - 有没有办法将 for 循环的条件作为 python 中的输入?我在使用此代码时遇到问题
- java - 如何读取特殊字符?
- python - 在 Pyomo 中实现 MINLP 求解器“apopt”
- flutter - Flutter - 找不到正确的提供者
在此 ChangeLocation 小部件上方