【问题标题】:Bootstrap Modal Window Moves Navigation Bar on CloseBootstrap 模态窗口在关闭时移动导航栏
【发布时间】:2019-10-20 05:05:58
【问题描述】:

每当我打开和关闭Bootstrap modal window 时,我的Bootstrap navbar 就会移到一边。如何防止这种情况发生,或者在modal 关闭后是否可以将navbar 重置为正确的尺寸?

我创建了一个 try-it 编辑器 来举例说明问题 here。只需打开和关闭Modal,然后查看navbar 的右侧。

如果您不喜欢 try-it 编辑器,下面是 html 示例:

function openModal() {
        $("#modalPop").modal("show");
    }
.tableOne {
        padding: 2px; 
        border: 0px; 
        border-spacing: 0px; 
        border-collapse: collapse; 
        width: 100%; 
        height: 35px; 
        background-color: #0099cc; 
        color: white; 
        font-weight: bold; 
        font-size: 40px; 
        text-indent: 20px;
      }
      .tableTwo {
      	padding: 2px;
        border: 0px;
        border-spacing: 0px;
        border-collapse: collapse;
        text-align: right;
        width: 100%;
      }
      .tdOne {
      	text-indent: 8px; 
        width: 130px;
      }
      .tdTwo {
        text-indent: 20px;
        padding-bottom: 8px;
        text-align: right;
        color:white; 
        font-weight:bold; 
        font-style: normal; 
        font-size:35%;
      }
      .textOne {
      	color: white; 
        font-size: 28px; 
        font-weight: normal;
      }
      .linkOne {
      	color:white; 
        text-decoration: none; 
        font-size:12px;
      }
<head>
  <title>Side Issue Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js" type="text/javascript"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" type="text/javascript"></script>
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
</head>
<body style="padding-top: 200px;">

<nav class="navbar fixed-top navbar-expand navbar-dark" style="background-color: #ff5733; padding:0;">
		
		  <div class="collapse navbar-collapse flex-column">
            <div style="width:100%;">
                <table class="tableOne">
                    <tr>
                        <td class="tdOne"><span class="textOne"><img src="https://purrli.com/Pix/Logo_white_small.png"></span></td>		
                        <td><span class="textOne"> Side Issue Example</span></td>
                        <td>
                            <table class="tableTwo">
                                <tr>
                                    <td class="tdTwo"><a href="#" class="linkOne">Sign Out</a> &nbsp;</td>
                                </tr>
                            </table>
                        </td>
                    </tr>
                </table>

            </div>

		  	<ul class="navbar-nav mr-auto">
		          <li class="nav-item dropdown">
		            <a class="nav-link dropdown-toggle" href="#" id="firstDrop" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span style="color:white;">First</span></a>
		            <div class="dropdown-menu" aria-labelledby="firstDrop">
		              <a class="dropdown-item" href="/One">One</a>
		              <a class="dropdown-item" href="/Two">Two</a>
		            </div>
		          </li>
		          <li class="nav-item dropdown">
		            <a class="nav-link dropdown-toggle" href="#" id="secondDrop" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span style="color:white;">Second</span></a>
		            <div class="dropdown-menu" aria-labelledby="secondDrop">
		              <a class="dropdown-item" href="/One">One</a>
		              <a class="dropdown-item" href="/Two">Two</a>
		            </div>
		          </li>
		          <li class="nav-item">
		            <a class="nav-link" href="/Other"><span style="color:white;">Link</span></a>
		          </li>
		        </ul>    
		  </div>
	
</nav>

<center>
Here is some page content.
<br/><br/>
<a href="#" onclick="javascript:openModal()">Open Modal!</a>
</center>

<div id="modalPop" class="modal fade" role="dialog">
  <div class="modal-dialog modal-lg" style="overflow-y: initial;">			
    <div class="modal-content">
      <div class="modal-header">
      	<h4 class="modal-title"><span>MODAL</span></h4>
        <button type="button" class="close" data-dismiss="modal">&times;</button>								        
      </div>
      <div class="modal-body" style="max-height: calc(100vh - 200px); overflow-y: auto;">
            This is a modal window.
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
      </div>
    </div>				
  </div>
</div>

【问题讨论】:

    标签: html bootstrap-4 bootstrap-modal navbar


    【解决方案1】:

    当您打开模式并关闭它时,它会将导航类 padding-right 设置为 16px,只需设置为 padding:0px !important 或 padding-right:0px !important 以便引导程序不会覆盖此样式

    【讨论】:

    • 你能在我链接的 try-it 编辑器中完成这项工作吗?当我将顶部更改为&lt;nav class="navbar fixed-top navbar-expand navbar-dark" style="background-color: #ff5733; padding:0; padding-right:0px !important;"&gt; 时,似乎没有什么不同。不管是不是!important,Bootstrap 似乎都会完全覆盖填充。
    【解决方案2】:

    由于某种原因,当模态隐藏时,.navbar 获取新的填充值,导致导航栏移动。

    解决此问题的一种方法是在模式关闭时添加hidden.bs.modal 事件侦听器并设置默认填充以使其不会移动:

    <script>
    function openModal() {
        $("#modalPop").modal("show");
    }
    
        $(function() { //we have to wait for the DOM to be ready otherwise it won't work
            $('#modalPop').on('hidden.bs.modal', function (e) { //listen to the modal closed event
                $('nav.navbar').attr('style', 'background-color: #ff5733;padding:0;'); //set the default background-color and padding to prevent the shifting phenomenon 
            })
    
    
        });     
    

    下面的例子:

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <title>Side Issue Example</title>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js" type="text/javascript"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" type="text/javascript"></script>
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
    
      <script>
      	function openModal() {
            $("#modalPop").modal("show");
        }
    		
    		$(function() {
    			$('#modalPop').on('hidden.bs.modal', function (e) {
    				$('nav.navbar').attr('style', 'background-color: #ff5733;padding:0;');
    			})
    		});		
       </script>
       
       <style>
          .tableOne {
            padding: 2px; 
            border: 0px; 
            border-spacing: 0px; 
            border-collapse: collapse; 
            width: 100%; 
            height: 35px; 
            background-color: #0099cc; 
            color: white; 
            font-weight: bold; 
            font-size: 40px; 
            text-indent: 20px;
          }
          .tableTwo {
          	padding: 2px;
            border: 0px;
            border-spacing: 0px;
            border-collapse: collapse;
            text-align: right;
            width: 100%;
          }
          .tdOne {
          	text-indent: 8px; 
            width: 130px;
          }
          .tdTwo {
            text-indent: 20px;
            padding-bottom: 8px;
            text-align: right;
            color:white; 
            font-weight:bold; 
            font-style: normal; 
            font-size:35%;
          }
          .textOne {
          	color: white; 
            font-size: 28px; 
            font-weight: normal;
          }
          .linkOne {
          	color:white; 
            text-decoration: none; 
            font-size:12px;
          }
          
       </style>
    </head>
    <body style="padding-top: 200px;">
    
    <nav class="navbar fixed-top navbar-expand navbar-dark" style="background-color: #ff5733; padding:0;">
    		
    		  <div class="collapse navbar-collapse flex-column">
                <div style="width:100%;">
                    <table class="tableOne">
                        <tr>
                            <td class="tdOne"><span class="textOne"><img src="https://purrli.com/Pix/Logo_white_small.png"></span></td>		
                            <td><span class="textOne"> Side Issue Example</span></td>
                            <td>
                                <table class="tableTwo">
                                    <tr>
                                        <td class="tdTwo"><a href="#" class="linkOne">Sign Out</a> &nbsp;</td>
                                    </tr>
                                </table>
                            </td>
                        </tr>
                    </table>
    
                </div>
    
    		  	<ul class="navbar-nav mr-auto">
    		          <li class="nav-item dropdown">
    		            <a class="nav-link dropdown-toggle" href="#" id="firstDrop" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span style="color:white;">First</span></a>
    		            <div class="dropdown-menu" aria-labelledby="firstDrop">
    		              <a class="dropdown-item" href="/One">One</a>
    		              <a class="dropdown-item" href="/Two">Two</a>
    		            </div>
    		          </li>
    		          <li class="nav-item dropdown">
    		            <a class="nav-link dropdown-toggle" href="#" id="secondDrop" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span style="color:white;">Second</span></a>
    		            <div class="dropdown-menu" aria-labelledby="secondDrop">
    		              <a class="dropdown-item" href="/One">One</a>
    		              <a class="dropdown-item" href="/Two">Two</a>
    		            </div>
    		          </li>
    		          <li class="nav-item">
    		            <a class="nav-link" href="/Other"><span style="color:white;">Link</span></a>
    		          </li>
    		        </ul>    
    		  </div>
    	
    </nav>
    
    <center>
    Here is some page content.
    <br/><br/>
    <a href="#" onclick="javascript:openModal()">Open Modal!</a>
    </center>
    
    <div id="modalPop" class="modal fade" role="dialog">
      <div class="modal-dialog modal-lg" style="overflow-y: initial;">			
        <div class="modal-content">
          <div class="modal-header">
          	<h4 class="modal-title"><span>MODAL</span></h4>
            <button type="button" class="close" data-dismiss="modal">&times;</button>								        
          </div>
          <div class="modal-body" style="max-height: calc(100vh - 200px); overflow-y: auto;">
                This is a modal window.
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
          </div>
        </div>				
      </div>
    </div>
    
    </body>
    </html>

    【讨论】:

    • 谢谢,这几乎正是我刚刚开始工作的内容。我在我的 js 中添加了以下内容:function fixIt() {$('.navbar').css('padding', 0);}; 然后像你说的那样添加了一个监听 hidden.bs.modal 的调用,它调用了该方法:$(function(){$( "#modalPop" ).on('hidden.bs.modal', function(){fixIt(); });}); 并且有效!我必须做的唯一其他更改是,因为在真实版本中我动态地制作模态,所以我必须在创建新模态的任何地方添加它。
    • 不客气!如果您必须支持多个模态,我建议您为每个模态添加一个特定的类(例如:fixShift),然后在hidden.bs.modal 事件监听器之后更改选择器以匹配该类$('.fixShift'),这样您不必为所有模式创建相同的事件侦听器。
    【解决方案3】:

    这对我有用,只是应用一个sticke prop,不是固定的

    header {
        position: sticky;
        top: 0;
    }
    

    【讨论】:

      【解决方案4】:

      覆盖css中用JS添加的样式:

      body.modal-open {
          padding-right: 0px !important;
      }
      
      .navbar {
          padding-right: 16px !important;
      }
      

      默认情况下,当打开 modal 时,Bootstrap 隐藏滚动条。添加此padding-right 以修复删除时向右移动的问题。如果您自定义滚动条,您将更改此默认行为,则此引导修复程序将通过向左移动一点来转换。

      对于从未在 css 规则中见过 !important 的人来说,这个覆盖很重要。

      【讨论】:

      • Bootstrap 似乎完全覆盖了填充,不管它是否 !important,不幸的是。因此,我在上面的另一个答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多