【问题标题】:Trying to center a div but nothing can't get anything to work [duplicate]试图使一个 div 居中,但没有任何东西可以工作 [重复]
【发布时间】:2019-03-30 23:46:42
【问题描述】:

我试图将一个简单的 div 居中,但我失败了。我尝试的任何方法都不起作用,包括 Stack Overflow 上的许多示例。这是我的 CSS 的(主要部分):

body {
      min-height: 640px;
      background: #282a36;
      color: #bcc3cd;
      font-size: 12px;
      margin: 0;
      font-family: 'Source Sans Pro', sans-serif;
    }
    #nickbox {
      border: 1px solid white;
      display: inline;
      padding: 5px;
      background-color: #ffffff00;
    }
<div id="welcome">
      <p tabindex="0" class="title">
        Cards Against Oakbank
      </p>
      <p class="subtitle">A Cards Against Humanity clone.</p>
      <div id="nickbox">
        <label for="nickname">Nickname:</label>
        <input type="text" id="nickname" value="" maxlength="20" role="textbox"
            aria-label="Enter your nickname." data-lpignore="true" />
        <input type="button" id="nicknameconfirm" value="Set" />
        <span id="nickbox_error" class="error"></span>
      </div>
    </div>

由于我的想法已经用完了,所以现在没有尝试集中在那里。我应该使用什么?我只希望#nickbox 在每个屏幕上水平居中。我并不真正关心支持旧浏览器,我关心的是不同的分辨率。谢谢。

【问题讨论】:

    标签: html css


    【解决方案1】:

    当我定位某些东西时,总是使用 flexbox https://css-tricks.com/snippets/css/a-guide-to-flexbox/

    实时工作示例:https://jsfiddle.net/ty6zcsw9/

    html:用 id nickbox 包围 div,用 nickbox-container 包围 div

    <div class='nickbox-container'>
      <div id="nickbox">
        <label for="nickname">Nickname:</label>
        <input type="text" id="nickname" value="" maxlength="20" role="textbox" aria-label="Enter your nickname."
          data-lpignore="true" />
        <input type="button" id="nicknameconfirm" value="Set" />
        <span id="nickbox_error" class="error"></span>
      </div>
    </div>  
    

    css:将以下内容添加到您的 css 中

    .nickbox-container{
        display: flex;
        justify-content: center;
    }
    

    【讨论】:

    • 我同意这个解决方案,但它有点破坏了 OP 的设计。虽然我也更喜欢使用 flexbox 来使 DIV 居中
    • 为什么要添加不必要的div?即使使用 flexbox,也有不需要更改 HTML 的解决方案。添加 HTML 元素以匹配设计应始终作为最后的解决方案来处理
    • @MichaëlVanderheyden 你能举个例子使用 flexbox 而不添加额外的 div
    • @AkshayMilmile 当然,看看我在这个主题中作为回应投票赞成的那个:stackoverflow.com/a/53005186/7041074
    • 好吧,您的论点是有效的,但是从问题中的示例来看,所有元素都是块元素并且 align-items 的默认值是拉伸,#welcome 上的弹性框将不起作用。如果将一些内联元素添加到#welcome 父级,它只会产生潜在的不良影响。所以在这样一个小例子中添加一个简单的 div 确实没有那么戏剧化,但没有必要。将相同的逻辑应用于更大的项目会导致一大堆不必要的元素,使 DOM 树变得比它必须的复杂得多。
    【解决方案2】:

    问题与下面这行代码有关:

    #nickbox {
      ...
      display: inline; \
      ...
    }
    

    “内联”元素的行为类似于文本。 Stack Overflow 上关于“居中”DIV 的大多数解决方案都使用“块”显示。所以这些解决方案对你不起作用。

    但是还有希望!因为文本元素很容易以'text-align: center' 行居中。将此行添加到正文中,它应该可以解决您的问题。

    这应该可以解决您的问题。请参阅以下 JS Fiddle:

    http://jsfiddle.net/jcolicchio/kNB3c/

    body {
      min-height: 640px;
      background: #282a36;
      color: #bcc3cd;
      font-size: 12px;
      margin: 0;
      font-family: 'Source Sans Pro', sans-serif;
      text-align:center;
    }
    

    【讨论】:

      【解决方案3】:

      你可以试试这个

      body {
        min-height: 640px;
        background: #282a36;
        color: #bcc3cd;
        font-size: 12px;
        margin: 0;
        font-family: 'Source Sans Pro', sans-serif;
      }
      
      #nickbox {
        border: 1px solid white;
        display: inline;
        padding: 5px;
        background-color: #ffffff00;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
      }
      <div id="welcome">
        <p tabindex="0" class="title">
          Cards Against Oakbank
        </p>
        <p class="subtitle">A Cards Against Humanity clone.</p>
        <div id="nickbox">
          <label for="nickname">Nickname:</label>
          <input type="text" id="nickname" value="" maxlength="20" role="textbox"
              aria-label="Enter your nickname." data-lpignore="true" />
          <input type="button" id="nicknameconfirm" value="Set" />
          <span id="nickbox_error" class="error"></span>
        </div>
      </div>

      【讨论】:

      • 虽然这个解决方案可以,但是使用绝对定位来使元素居中有点矫枉过正。此外,如果没有 position: relative on #welcome,元素将绝对定位在页面上,而不是容器上,这可能不是想要的效果。最后,#nickbox 以页面为中心,但问题只是将其水平居中
      【解决方案4】:

      对于布局,最好使用 FlexBox。它更多,嗯....灵活:)。它非常易于使用和理解。

      例如,在父 #welcome 上使用 display:flex。与flex-direction:column 一起,子元素不会停留在一行上,而是在另一行下方。然后在您想要的元素上使用align-self:center 将其置于父容器内。

      阅读更多关于FlexBox

      body {
        min-height: 640px;
        background: #282a36;
        color: #bcc3cd;
        font-size: 12px;
        margin: 0;
        font-family: 'Source Sans Pro', sans-serif;
      }
      #nickbox {
        border: 1px solid white;
        display: inline;
        padding: 5px;
        background-color: #ffffff00;
        align-self:center;
      }
      #welcome {
        display:flex;
        flex-direction:column;
      }
      <div id="welcome">
        <p tabindex="0" class="title">
          Cards Against Oakbank
        </p>
        <p class="subtitle">A Cards Against Humanity clone.</p>
        <div id="nickbox">
          <label for="nickname">Nickname:</label>
          <input type="text" id="nickname" value="" maxlength="20" role="textbox"
              aria-label="Enter your nickname." data-lpignore="true" />
          <input type="button" id="nicknameconfirm" value="Set" />
          <span id="nickbox_error" class="error"></span>
        </div>
      </div>

      OBS 使用 flexbox 来水平对齐项目,您可以在父级上使用 justify-content 或在所需子级上使用 justify-self。要使它们垂直对齐,请使用align 而不是justify。在上面的例子中,我使用align 来对齐horizo​​ntaly,因为flex-direction:column 改变了元素的默认方向。这就是为什么 alignjustfy 样式被颠倒了

      【讨论】:

        【解决方案5】:

        嗨,你能检查一下这个https://jsfiddle.net/fnq9v4s5/1/,你可以垂直调整给.nickcontainer适当的垂直高度

        <div id="welcome">
          <p tabindex="0" class="title">
            Cards Against Oakbank
          </p>
          <p class="subtitle">A Cards Against Humanity clone.</p>
          <div class="nickcontainer">
        
          <div id="nickbox">
          <p class="filed">
            <label for="nickname">Nickname:</label>
            <input type="text" id="nickname" value="" maxlength="20" role="textbox"
                aria-label="Enter your nickname." data-lpignore="true" />
            <input type="button" id="nicknameconfirm" value="Set" />
            <span id="nickbox_error" class="error"></span>
            </p>
          </div>
           </div>
        </div>
        

        css

           body {
              background: #282a36;
              color: #bcc3cd;
              font-size: 12px;
              margin: 0;
              font-family: 'Source Sans Pro', sans-serif;
            }
            #nickbox {
              padding: 5px;
              background-color: #ffffff00;
              display: table-cell;
              vertical-align: middle;
            }
            .nickcontainer{    
             display: table;
             height: 82vh;}
        
             p.filed{
              border:solid 1px #fff;
              display:block;
               padding:5px;
               }
        

        【讨论】:

          【解决方案6】:

          有很多方法可以解决您的小问题。

          1. 最简单的方法是将#nickboxdisplay:inline 更改为display:block 并设置text-align:center。 div 中的所有元素都会自动流向中心。
          2. 您也可以设置width#nickbox 并设置margin:0 auto
          3. 或者,将#nickbox 设置为display: flex justify-content: center

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-03-05
            • 1970-01-01
            • 2015-04-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-08
            • 1970-01-01
            相关资源
            最近更新 更多