当水平居中时,li会被切断

时间:2015-11-08 04:56:30

标签: html css flexbox

我正在尝试使用li's布局flexbox。我将它们设置为列,每列中有3 li's。问题在于我希望ul居中。

我使用ul使align-content: center居中。当我这样做,并且有更多li's而不是页面可以显示(溢出)时,开头的li's会被切断。 (左侧的那些被切断,但右侧的那些显示正常。)

我没有特定数量的li's,可能介于4到50之间。所以我因此无法删除align-content: center,因为当我有少量时li's,(比如说4),结果不是我想要的。

如果ul没有被切断,我怎样才能居中?

JSFiddle

html, body {
    margin: 0;
    height: 100%;
}
div {
    align-items: center;
    justify-content: center;
    height: 100%;
    display: flex;
    overflow: auto;
    background-color:aqua;
}
ul {
    margin-top: auto;
    margin-bottom: auto;
    flex-direction: column;
    width: 100%;
    height: 70%;
    padding: 0;
    display: inline-flex;
    flex-wrap: wrap;
    align-content: center;
}
li {
    flex-basis: calc(100% / 3 - 2px);
    /* Subtract the border */
    color: firebrick;
    border: 1px solid firebrick;
    background-color: greenYellow;
    list-style-type: none;
    width: 200px;
}
<div>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
        <li>9</li>
        <li>10</li>
        <li>11</li>
        <li>12</li>
        <li>13</li>
        <li>14</li>
        <li>15</li>
        <li>16</li>
        <li>17</li>
        <li>18</li>
        <li>19</li>
        <li>20</li>
    </ul>
</div>

4 个答案:

答案 0 :(得分:3)

  

如何在没有被切断的情况下将ul居中?

这是一个非常好的问题,在找到实现这种行为的方法时遇到了一些麻烦。

我不相信您会找到纯粹的CSS解决方案,但我们可以使用javascript一点来做。

基本上我已经创建了一个附加到window resize事件的脚本,它将执行以下操作:

  1. 检查我们的包装元素中有多少项:#wrapper
  2. 将元素数除以3(因为每列中有3个元素)以发现显示项目需要多少列
  3. 使用以下公式为包装元素指定宽度:列数*每个项目的宽度(在我们的例子中为200px
  4. 这样做我们在父元素中强制溢出,滚动条将具有正常行为,显示每个元素。

    完整代码可在jsfiddle中找到。

    检查以下示例:

    function onResize() {
    
      var wrapper = document.querySelector('#wrapper');
    
      var items = wrapper.querySelectorAll('li');
    
      var columns = Math.ceil(items.length / 3);
    
      var width = 200 * columns;
    
      wrapper.style.width = width > window.innerWidth ? width + 'px' : '100%';
    
    }
    
    onResize();
    
    window.addEventListener('resize', onResize);
    html,
    body {
      height: 100%;
      text-align: center;
    }
    *,
    *:before,
    *:after {
      box-sizing: border-box;
      padding: 0;
      margin: 0;
    }
    #wrapper {
      height: 100%;
      display: inline-flex;
      align-items: center;
      justify-content: center;
      background-color: aqua;
    }
    ul {
      height: 75%;
      list-style: none;
      display: flex;
      align-content: center;
      flex-direction: column;
      flex-wrap: wrap;
    }
    li {
      flex-basis: calc(100% / 3 - 2px);
      color: firebrick;
      border: 1px solid firebrick;
      background-color: greenYellow;
      width: 200px;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    <div id="wrapper">
      <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
        <li>9</li>
      </ul>
    </div>

答案 1 :(得分:0)

删除align-content并使用ptrace()

答案 2 :(得分:0)

有一个safe关键字可以居中显示在屏幕上。当前仅在Firefox上受支持:

ul {
  align-content: safe center;
}

答案 3 :(得分:0)

我最终做的是给父元素一个覆盖所有内容的集合 min-width