ChatGPT解决这个技术问题 Extra ChatGPT

Bootstrap 模态出现在背景下

我直接从 Bootstrap 示例中使用了我的模态代码,并且只包含了 bootstrap.js(而不是 bootstrap-modal.js)。但是,我的模态出现在灰色渐变(背景)下方并且不可编辑。

这是它的样子:

https://i.stack.imgur.com/qSypO.png

请参阅 this fiddle,了解重现此问题的 一种 方法。该代码的基本结构如下:

<body>
    <p>Lorem ipsum dolor sit amet.</p>    

    <div class="my-module">
        This container contains the modal code.
        <div class="modal fade">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-body">Modal</div>
                </div>
            </div>
        </div>
    </div>
</body>
body {
    padding-top: 50px;
}

.my-module {
    position: fixed;
    top: 0;
    left: 0;
}

任何想法为什么会这样或我能做些什么来解决这个问题?

如果其他人在一段时间内搜索打开的标签等,试图弄清楚为什么会发生这种情况,对我来说,是 Feedly chrome 扩展破坏了我的模态。禁用扩展使行为恢复正常。
在可能的情况下,问题出在 iOS 上,并且由应用于模态容器的 overflow-x: hidden 引起。
在 3 个版本中创建了 3 个示例。 3.3.1 工作正常,其他的则不行。 Version 3.3.1 jsfiddle Version 3.3.5 jsfiddle Version 3.3.6 jsfoddle
与 Bootstrap 团队创建了一个 bug report 似乎这不是一个真正的错误,即使它在 3.3.1 中运行良好。您可以在我发布的链接中阅读有关它的更多信息。
与面临此问题的任何人相关的博文weblog.west-wind.com/posts/2016/Sep/14/…

M
Muhd

如果模态容器具有固定或相对位置,或者位于具有固定或相对位置的元素内,则会发生此行为。

确保模态容器及其所有父元素都以解决问题的默认方式定位。

这里有几种方法可以做到这一点:

最简单的方法是移动模态 div,使其位于任何具有特殊定位的元素之外。一个好地方可能就在结束正文标记 之前。或者,您可以从 modal 及其祖先中删除 position: CSS 属性,直到问题消失。但是,这可能会改变页面的外观和功能。


接得好。仅供参考,不仅仅是“固定”,父母的位置“相对”也会导致这个问题
@Muhd您如何确保它及其所有父元素都以默认方式定位?
更喜欢使用选项一:“只需移动模态 div,使其位于任何具有特殊定位的元素之外”。谢谢
我不明白这个答案。 Bootstrap 示例显示了一个模态 div,其中包含沿“modal”、“modal-fade”等行的多个类。在 .modal 内部,它设置 position:fixed,在“modal-body”内部,它设置 position:relative。那么,当 .modal 设置 position:fixed 时,移动模态容器会如何改变呢?
我还是有这个问题。我在 </body> 之前添加了它,并且 body 没有任何 position 样式属性。还有什么想法吗?
i
imtk

问题与父容器的定位有关。在显示之前,您可以轻松地将模态从这些容器中“移出”。如果您show使用 js 编写模态框,请执行以下操作:

$('#myModal').appendTo("body").modal('show');

或者,如果您使用按钮启动模式,请删除 .modal('show'); 并执行以下操作:

$('#myModal').appendTo("body") 

这将保留所有正常功能,允许您使用按钮显示模式。


使用该通用事件处理程序使 @leandrotk 解决方案适用于您可以在页面中拥有的所有模式$('.modal-dialog').parent().on('show.bs.modal', function(e){ $(e.relatedTarget.attributes['data-target'].value).appendTo('body'); })
当您确实无法修复 CSS 定位时,这非常有用。谢谢 :)
从leadrotk 的答案,只需将#myModal 更改为.modal 看起来像这样:$('.modal').appendTo("body")。这将适用于所有模态,因为它们具有默认类模态。
@EugenevanderMerwe - 它不再从正文中的父元素继承任何 CSS。
仍然与 bootstrap5 相关,谢谢!
J
Jan van der Burgt

我尝试了上面提供的所有选项,但没有使用这些选项。

起作用的是:将 .modal-backdrop 的 z-index 设置为 -1。

.modal-backdrop {
  z-index: -1;
}

这非常有效,是迄今为止最简单的解决方案。我用过z-index: 0;
也可以确认只有这个选项有效!谢谢!
谢谢!这是BS3的错误吗?
如果您使用具有许多不同 z 索引的主题,这将不起作用。例如,将背景设置为 -1 会导致它出现在页面上其他元素(如面板)的之后。但是将其设置为 3 使其高于模式弹出窗口之外的所有内容。
在用尽了上面评分较高的答案中的建议后,我发现这也是最快的方法。在我的例子中,将带有 modal-dialog 类的 div 设置为 1060 的 z-index 会将其弹出到覆盖层的前面。如果您使用导航栏,您将希望将模式移动到覆盖层上方,而不是相反,否则您的导航栏可能会弹出覆盖层顶部......混乱问题......
m
madi

另外,请确保 BootStrap css 和 js 的版本相同。不同的版本也可以让modal出现在背景下:

例如:

坏的:

<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>

好的:

<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>

只是遇到了同样的问题,相同版本的样式表解决方案似乎对每个人都有帮助!谢谢
Malcor 没问题,我花了很多时间才发现这个错误。正如我们所见,那是在 14 年,现在是 16 年,错误仍然存在。实际上这不是一个错误,但在引导程序中,作者应该将其添加到他们的文档或其他东西中。
同样的交易,我们改用生成我们的 SASS 并完全忘记了 js 文件本身。这需要是最佳答案。因为我们的模态总是默认包含在正文关闭标记之前...
谢谢!我从 3.3.5 升级到 3.3.7 并且它工作正常。
我也是这个问题,版本不一样
C
CPHPython

我也遇到了这个问题,在我发现我实际上不需要背景之前,没有一个解决方案对我有用。您可以使用以下代码轻松删除背景。

<div class="modal fade" id="createModal" data-backdrop="false">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h4>Create Project</h4>
            </div>
            <div class="modal-body">Not yet made</div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
            </div>
        </div>
    </div>
</div>

注意data-backdrop 属性需要设置为 falseother optionsstatictrue)。


杰出的!我还需要 require bootstrap - 不知道为什么我的所有其他 Bootstrap 功能都可以正常工作,但我需要 require 才能使模态工作。
完美的 !!!挣扎了一天……你又救了我一天。再次感谢.. +1 和欢呼
仔细阅读所有解决方案后,我发现这是目前版本的 bootstrap 和 jQuery 中最明智的一个。谢谢你。
谢谢!这个问题的浏览量超过 140k,我不明白为什么 bootstrap 不能解决这个问题。哦,好吧,干杯。
一个很好的解决方案!强烈的背景有利于用户体验
A
Andrew Dyster

我通过在打开模式窗口后为模式窗口提供高 z-index 值来使其工作。例如:

$("#myModal").modal("show");
$("#myModal").css("z-index", "1500");

它有效吗(那个人说有效),为什么你投反对票?正如我所期待的那样,它似乎会。
是的,谁能解释一下为什么这是一个不好的答案?只是它有点hacky吗?
我不明白反对票。是的,它很老套,但其他解决方案对我不起作用,所以我想我会把这个贡献给那些不介意使用“老套”解决方案来让该死的东西正常工作的人。
这与我将模式置于全屏元素上的特定问题相关。 +1
这是一个糟糕的答案,因为它是一个 hack,并且没有尝试表明这一点。其他答案说,“如果没有其他办法,你可以......”。现实情况是,该模式在网络上得到了非常广泛的应用,如果实施得当,它应该可以工作。老生常谈的答案并不能帮助人们弄清楚如何以正确的方式做事。
K
Krishnendu

@Muhd 提供的解决方案是最好的方法。但是,如果您遇到无法更改页面结构的情况,请使用以下技巧:

<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" data-backdrop="false" style="background-color: rgba(0, 0, 0, 0.5);">
<div class="modal-dialog" role="document">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal"
                aria-label="Close">
                <span aria-hidden="true">&times;</span>
            </button>
            <h4 class="modal-title" id="myModalLabel">Modal title</h4>
        </div>
        <div class="modal-body">...</div>
        <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
            <button type="button" class="btn btn-primary">Save changes</button>
        </div>
    </div>
</div>

这里的技巧是 data-backdrop="false" style="background-color: rgba(0, 0, 0, 0.5);",通过删除默认背景并通过设置对话框本身的背景颜色和一些 alpha 创建一个虚拟背景。

更新 1:正如@Gustyn 指出的那样,单击背景不会按预期关闭对话框。因此,要实现这一点,您必须添加一些 java 脚本代码。这是一些如何实现这一目标的示例。

$('.modal').click(function(event){
    $(event.target).modal('hide');
});

这有效,只是单击背景不会按预期关闭对话框。
Krishnendu 你是我的英雄。我带着厄运和忧郁开始工作。在我最后一次演讲的前 3 天突然面对这个问题至少可以说是令人伤脑筋。你我的朋友应该得到 100000 票,唉,只能给你一个 :) 祝你有一个美好幸福的一天。
当我尝试这个时,它不会覆盖页面的完整背景 - 只是在其中声明模态的 div 元素。
这是 IMO 的最佳解决方案。不明白为什么 Bootstrap 一开始就没有以这种方式实现它。
a
anon123

我发现的适用于所有我的案例的最简单的解决方案是答案in a similar post

这里是:

.modal {
  background: rgba(0, 0, 0, 0.5); 
}
.modal-backdrop {
  display: none;
}

基本上不使用原始背景。相反,您使用模态作为背景。结果是它的外观和行为与原来的完全一样。它避免了 z-indexes 的所有问题(对我来说,将 z-index 更改为 0 解决了这个问题,但是我的导航菜单在模态和背景之间产生了一个新问题)并且很简单。

感谢@Jevin O. Sewaruth 发布原始答案。


这真的应该是一个公认的答案!
一个很好的解决方案,但我认为它有一个替代方案。数据背景=“假”
C
Cam Tullos

这将涵盖所有模式,而不会弄乱任何动画或预期的行为..

$(document).on('show.bs.modal', '.modal', function () {
  $(this).appendTo('body');
});

全球解决方案。但是最好找到问题所在。
你能解释一下它会如何变得混乱吗?它所做的只是将模态框从它当前在 DOM 中的位置移动到 body 标记的末尾。它不会创建任何不存在的东西,只是移动它并自动为其提供顶部 z-index。
我认为最好的解决方案。无需编辑任何 CSS 并更改模态外观
这对我来说非常有效,因为由于 ng-repeat 的限制,我无法更改我的模型。它适用于由于特定原因(例如我的)而无法更改页面结构的任何人
#1 被低估的答案
C
Community

一个但晚了,但这是一个通用的解决方案 -

    var checkeventcount = 1,prevTarget;
    $('.modal').on('show.bs.modal', function (e) {
        if(typeof prevTarget == 'undefined' || (checkeventcount==1 && e.target!=prevTarget))
        {  
          prevTarget = e.target;
          checkeventcount++;
          e.preventDefault();
          $(e.target).appendTo('body').modal('show');
        }
        else if(e.target==prevTarget && checkeventcount==2)
        {
          checkeventcount--;
        }
     });

访问此链接 - Bootstrap 3 - modal disappearing below backdrop when using a fixed sidebar 了解详细信息。


对于我正在创建的无法控制其他人主题的父元素的 Wordpress 插件来说,这是一个完美的解决方案。
S
Samuel Bergeron

解决此问题的另一种方法是从 bootstrap.css 中的 .modal-backdrop 中删除 z-index。这将导致背景与您身体的其他部分处于同一水平(它仍然会褪色)并且您的模态位于顶部。

.modal-backdrop 看起来像这样

.modal-backdrop {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background-color: #000000;
}

W
Wahyu Primadi

只需添加两行 CSS:

.modal-backdrop{z-index: 1050;}
.modal{z-index: 1060;}

.modal-backdrop 应该有 1050 值以将其设置在导航栏上。


很好,但是如果模态框的容器有 position: fixed 这将不起作用。
A
AmintaCode

我只是设置:

#myModal {
    z-index: 1500;
}

它有效....

对于原始问题:

.my-module {
    z-index: 1500;
}

我的问题也是z-index。
S
Sliq

在您的模态中使用它:

data-backdrop="false" 

R
Richard Nalezynski

当在 CSS 中使用渐变之类的东西来处理背景甚至手风琴标题时,经常会遇到这个问题。

不幸的是,修改或覆盖核心 Bootstrap CSS 是不可取的,并且可能导致不必要的副作用。侵入性最小的方法是添加 data-backdrop="false",但您可能会注意到淡入淡出效果不再按预期工作。

在遵循 Bootstrap 的最新版本之后,版本 3.3.5 似乎解决了这个问题,没有不必要的副作用。

下载:https://github.com/twbs/bootstrap/releases/download/v3.3.5/bootstrap-3.3.5-dist.zip

请务必包含 3.3.5 中的 CSS 文件和 JavaScript 文件。


D
DanielBarbarian

我有一个更轻更好的解决方案..

它可以通过一些额外的 CSS 样式轻松解决..

隐藏类 .modal-backdrop (从 Bootstrap.js 自动生成) .modal-backdrop { display:none;可见性:隐藏; position:relative } 将 .modal 的背景设置为半透明的黑色背景图像。 .modal { background:url("http://bin.smwcentral.net/u/11361/BlackTransparentBackground.png") // 来自谷歌图像的半透明图像 z-index:1100; }

如果您有需要模态框位于元素内而不靠近 </body> 标记的要求,这将最有效。


您可以在此处查看修改... stackoverflow.com/posts/42887253/revisions
t
the Tin Man

我通过将 data-backdrop="false" 添加到 div 解决了我的问题:

<div class="modal fade" id="exampleModalCenter" data-backdrop="false" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">

.....

t
talsibony

嗨,我遇到了同样的问题,然后我意识到当您使用 bootsrap 3.1 时,与旧版本的 bootsrap (2.3.2) 不同,模态的 html 结构发生了变化!

你必须用 modal-dialog 和 modal-content 包裹你的模态页眉正文和页脚

<div class="modal hide fade">

  <div class="modal-dialog">
    <div class="modal-content">

    **here goes the modal header body and footer**

    </div>
  </div>

 </div>

+1 确保您使用的是兼容版本的 bootstrap.css 和 bootstrap.js,并且您的标记与您正在使用的版本相匹配。
是的,这就是我的结论,如果有人遇到这个问题,我就写在这里。
耶稣基督,这个答案被深深地埋葬了。 Bootstrap 4 的情况相同。
J
Javed Iqbal

上面建议的解决方案都不适合我,但这种技术解决了这个问题:

$('#myModal').on('shown.bs.modal', function() {
   //To relate the z-index make sure backdrop and modal are siblings
   $(this).before($('.modal-backdrop'));
   //Now set z-index of modal greater than backdrop
   $(this).css("z-index", parseInt($('.modal-backdrop').css('z-index')) + 1);
}); 

我更喜欢这种方式,因为我使用其他方法丢失了 CSS 格式。
C
Chris Rosete

我遇到了这个问题,最简单的解决方法是在模态对话框 div 上添加大于 1040 的 z-index:

<div class="modal-dialog" style="z-index: 1100;">

我相信 bootstrap 创建一个 div modal-backdrop 淡入淡出,在我的例子中,z-index 为 1040,所以如果你把 modal-dialog 放在上面,它不应该再变灰了。


A
A Mohudum Kamil

将 z-index .modal 设置为最高值

例如,.sidebarwrapper 的 z-index 为 1100,因此将 .modal 的 z-index 设置为 1101

.modal {
    z-index: 1101;
}

C
Ckevyn Ovalle

在我的情况下解决它,在我的样式表中添加它:

.modal-backdrop{ z-index:0; }

使用 google 调试器,可以检查元素 BACKDROP 并修改属性。祝你好运。


q
quent

最简单的解决方案是将模态对话框移到任何容器之外,并在 <body> 元素下声明它:

<body>    
    <div>
        ...
    <div>
    
    
    <div class="modal">
        ... modal dialog here
    </div>
</body>

我已经尝试过这个解决方案,它对我有用。

来源:https://weblog.west-wind.com/posts/2016/sep/14/bootstrap-modal-dialog-showing-under-modal-background


M
Mohsin

在您的导航栏中 navbar-fixed-top 需要 z-index = 1041 并且如果您使用 bootstarp-combined.min.css 也需要更改 .navbar-fixed-top, .navbar-fixed-bottom z-index to 1041


D
Dapeng114

这对我有用:

sass: 
  .modal-backdrop
    display: none
  #yourModal.modal.fade.in
    background: rgba(0, 0, 0, 0.5)

M
Matthew Gallegos

您还可以从 .modal-backdrop 中删除 z-index。生成的 css 看起来像这样。

.modal-backdrop {
}
  .modal-backdrop.in {
    opacity: .35;
    filter: alpha(opacity=35); }

d
durron597

我删除了模态背景。

.modal-backdrop {
    display:none;
}

这不是更好的解决方案,但对我有用。


S
Suresh Karia

我发现的是:

在 bootstrap 3.3.0 中是不对的,但是在 bootstrap 3.3.5 中是对的。让我们看看代码。 3.3.0:

this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
    .prependTo(this.$element)

3.3.5

  this.$backdrop = $(document.createElement('div'))
        .addClass('modal-backdrop ' + animate)
        .appendTo(this.$body)

H
H. Pauwelyn

将此添加到您的页面。它对我有用。

<script type="text/javascript">
    $('.modal').parent().on('show.bs.modal', function (e) { $(e.relatedTarget.attributes['data-target'].value).appendTo('body'); })
</script>

R
RaymondLe

我通过将下面的样式添加到 DIV 标签来解决这个问题

style="background-color: rgba(0, 0, 0, 0.5);"

并添加自定义 css

.modal-backdrop {position: relative;}