如何居中 ngx-bootstrap 模态
How to center an ngx-bootstrap modal
尝试使用 CSS 将此 ngx-boostrap modal 居中,但它不起作用:
.modal.fade.in{
display: flex;
justify-content: center;
align-items: center;
}
但是在开发工具中,我可以像这样添加 CSS:
.modal.dialog{
top: 50%
}
所以至少它是垂直居中的,但这是在开发工具中,html template
中没有.modal.dialog
class
有没有办法使 ngx-bootstrap 模式正确居中?
我想创建一个通用模态组件以在任何地方使用它,方法是提供输入消息并添加 yes/no 对话框并输出用户选择(使用 EventEmitter)
我在下面 Plunker 中找到了一个示例,但无法在单独的自定义组件中重现它。
plunker 例子来自这个网站:https://github.com/valor-software/ngx-bootstrap/issues/2334
更新:
@Wira Xie 回答后,当我使用 Static modal 和这个 CSS:
.modal-sm
{
top: 50%;
left: 50%;
width:30em;
height:18em;
background-color: rgba(0,0,0,0.5);
}
模态显示居中,但只有 Esc key
可以隐藏它,所以当我在模态外部单击时,它仍然可见。
这也是我使用 ngx-bootstrap 的个人项目的片段。
.modal-sm
{
top: 50%;
left: 50%;
width:30em;
height:18em;
margin-top: -9em;
margin-left: -15em;
background-color: #001b00;
/*position:fixed;*/
}
<!--typecript files-->
<script>
//here is the typesciprt file
export class AppComponent
{
//for default ngx-bootstrap modal
public modalRef: BsModalRef;
constructor(private modalService: BsModalService) {}
public openModal(template: TemplateRef<any>) {
this.modalRef = this.modalService.show(template);
}
}
</script>
<!--end of ts file-->
<!--Modal-->
<div class="container">
<div bsModal #smModal="bs-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
<div class="modal-dialog modal-sm">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title pull-left">Small modal</h4>
<button type="button" class="close pull-right" aria-label="Close" (click)="smModal.hide()">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
</div>
</div>
</div>
</div>
<!--enf of modal-->
尝试将此属性添加到您的 CSS:vertical-align: middle
到您的 .modal.dialog
class
.modal.fade {
display: flex !important;
justify-content: center;
align-items: center;
}
.modal-dialog {
vertical-align:middle;
height:18em;
background-color: rgba(0,0,0,0.5);
}
为什么不使用 bootstrap modal-dialog-centered
class:
this.modalRef2 = this.modalService.show(ModalContentComponent,
{
class: 'modal-dialog-centered', initialState
}
);
您需要使用bootstrap class。
Add .modal-dialog-centered
to .modal-dialog
to vertically center the modal.
import { Component, OnInit, TemplateRef } from '@angular/core';
import { BsModalService } from 'ngx-bootstrap/modal';
import { BsModalRef } from 'ngx-bootstrap/modal/bs-modal-ref.service';
@Component({
...
})
export class ModalComponent {
modalRef: BsModalRef;
// Here we add another class to our (.modal.dialog)
// and we need to pass this config when open our modal
config = {
class: 'modal-dialog-centered'
}
constructor(private modalService: BsModalService) { }
openModal(template: TemplateRef<any>) {
// pass the config as second param
this.modalRef = this.modalService.show(template, this.config);
}
}
在 .ts 文件中你有这样的代码(打开模态弹出窗口)...
private showModal(template: TemplateRef<any>): BsModalRef {
return this.modalService.show(
template,
{ class: 'modal-lg modal-dialog-centered',
ignoreBackdropClick: true,
keyboard: false
});
}
您可以看到我已将 modal-dialog-centered 添加到 class。完成此操作后,您还可以在 css 中修改以模式对话框为中心的 class。
根据 documentation,您可以通过将 centered 属性 设置为 true(默认情况下为 false)使模态垂直居中
const modalRef = this.modalService.open(ConfirmationDialogComponent, {
size: dialogSize,
centered: true
});
您必须像这样为 BsModalService.show()
函数传递 modal-dialog-centered
bootstrap class:
const initialState = {
organization: organization,
};
this.modalRef = this.modalService.show(AdminOrganizationCreateComponent, {
class: 'modal-dialog-centered', initialState
});
注意:如果您需要传递初始数据,您可以使用 initalState
对象传递它。
我在模态中添加了 mat-step
,因此它没有以 modal-dialog-centered
bootstrap class 为中心对齐。但是 modal-lg
class 对我有用。示例代码与接受的答案非常相似。仅更改传递给模态的 bootstrap class。
this.modalRef = this.modalService.show(AddDevelopersGroupComponent,{
class: 'modal-lg',
initialState,
});
晚了点,供参考
组件中对话框的样式不起作用的原因是组件样式是孤立的并且仅限于组件内的元素。通过 bsmodalservice 创建的对话框在该组件之外。 (直接在 <body>
下)。
因此,虽然您的样式封装在组件和一些随机标识符中,但对话框本身却没有。最后的css(如mycomponent[_ngcontent_bla_323] .modal
)不适用于服务添加的div.modal。
可能的解决方案是:
- 将此对话框的 css 移动到某个全局 (s)css 文件,而不是组件
的 (s)css
- 不要将 bsModalService 与模板一起使用,而是在组件中使用带有 div 的 bsmodal 指令。这样组件 local (s)css 将适用。
尝试使用 CSS 将此 ngx-boostrap modal 居中,但它不起作用:
.modal.fade.in{
display: flex;
justify-content: center;
align-items: center;
}
但是在开发工具中,我可以像这样添加 CSS:
.modal.dialog{
top: 50%
}
所以至少它是垂直居中的,但这是在开发工具中,html template
中没有.modal.dialog
class
有没有办法使 ngx-bootstrap 模式正确居中?
我想创建一个通用模态组件以在任何地方使用它,方法是提供输入消息并添加 yes/no 对话框并输出用户选择(使用 EventEmitter)
我在下面 Plunker 中找到了一个示例,但无法在单独的自定义组件中重现它。
plunker 例子来自这个网站:https://github.com/valor-software/ngx-bootstrap/issues/2334
更新:
@Wira Xie 回答后,当我使用 Static modal 和这个 CSS:
.modal-sm
{
top: 50%;
left: 50%;
width:30em;
height:18em;
background-color: rgba(0,0,0,0.5);
}
模态显示居中,但只有 Esc key
可以隐藏它,所以当我在模态外部单击时,它仍然可见。
这也是我使用 ngx-bootstrap 的个人项目的片段。
.modal-sm
{
top: 50%;
left: 50%;
width:30em;
height:18em;
margin-top: -9em;
margin-left: -15em;
background-color: #001b00;
/*position:fixed;*/
}
<!--typecript files-->
<script>
//here is the typesciprt file
export class AppComponent
{
//for default ngx-bootstrap modal
public modalRef: BsModalRef;
constructor(private modalService: BsModalService) {}
public openModal(template: TemplateRef<any>) {
this.modalRef = this.modalService.show(template);
}
}
</script>
<!--end of ts file-->
<!--Modal-->
<div class="container">
<div bsModal #smModal="bs-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
<div class="modal-dialog modal-sm">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title pull-left">Small modal</h4>
<button type="button" class="close pull-right" aria-label="Close" (click)="smModal.hide()">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
</div>
</div>
</div>
</div>
<!--enf of modal-->
尝试将此属性添加到您的 CSS:vertical-align: middle
到您的 .modal.dialog
class
.modal.fade {
display: flex !important;
justify-content: center;
align-items: center;
}
.modal-dialog {
vertical-align:middle;
height:18em;
background-color: rgba(0,0,0,0.5);
}
为什么不使用 bootstrap modal-dialog-centered
class:
this.modalRef2 = this.modalService.show(ModalContentComponent,
{
class: 'modal-dialog-centered', initialState
}
);
您需要使用bootstrap class。
Add
.modal-dialog-centered
to.modal-dialog
to vertically center the modal.
import { Component, OnInit, TemplateRef } from '@angular/core';
import { BsModalService } from 'ngx-bootstrap/modal';
import { BsModalRef } from 'ngx-bootstrap/modal/bs-modal-ref.service';
@Component({
...
})
export class ModalComponent {
modalRef: BsModalRef;
// Here we add another class to our (.modal.dialog)
// and we need to pass this config when open our modal
config = {
class: 'modal-dialog-centered'
}
constructor(private modalService: BsModalService) { }
openModal(template: TemplateRef<any>) {
// pass the config as second param
this.modalRef = this.modalService.show(template, this.config);
}
}
在 .ts 文件中你有这样的代码(打开模态弹出窗口)...
private showModal(template: TemplateRef<any>): BsModalRef {
return this.modalService.show(
template,
{ class: 'modal-lg modal-dialog-centered',
ignoreBackdropClick: true,
keyboard: false
});
}
您可以看到我已将 modal-dialog-centered 添加到 class。完成此操作后,您还可以在 css 中修改以模式对话框为中心的 class。
根据 documentation,您可以通过将 centered 属性 设置为 true(默认情况下为 false)使模态垂直居中
const modalRef = this.modalService.open(ConfirmationDialogComponent, {
size: dialogSize,
centered: true
});
您必须像这样为 BsModalService.show()
函数传递 modal-dialog-centered
bootstrap class:
const initialState = {
organization: organization,
};
this.modalRef = this.modalService.show(AdminOrganizationCreateComponent, {
class: 'modal-dialog-centered', initialState
});
注意:如果您需要传递初始数据,您可以使用 initalState
对象传递它。
我在模态中添加了 mat-step
,因此它没有以 modal-dialog-centered
bootstrap class 为中心对齐。但是 modal-lg
class 对我有用。示例代码与接受的答案非常相似。仅更改传递给模态的 bootstrap class。
this.modalRef = this.modalService.show(AddDevelopersGroupComponent,{
class: 'modal-lg',
initialState,
});
晚了点,供参考
组件中对话框的样式不起作用的原因是组件样式是孤立的并且仅限于组件内的元素。通过 bsmodalservice 创建的对话框在该组件之外。 (直接在 <body>
下)。
因此,虽然您的样式封装在组件和一些随机标识符中,但对话框本身却没有。最后的css(如mycomponent[_ngcontent_bla_323] .modal
)不适用于服务添加的div.modal。
可能的解决方案是:
- 将此对话框的 css 移动到某个全局 (s)css 文件,而不是组件 的 (s)css
- 不要将 bsModalService 与模板一起使用,而是在组件中使用带有 div 的 bsmodal 指令。这样组件 local (s)css 将适用。