【问题标题】:How to display 3 li elements with same width in row如何在行中显示具有相同宽度的 3 个 li 元素
【发布时间】:2020-08-10 11:44:49
【问题描述】:

我正在尝试弄清楚如何连续显示 3 个 li 元素,但它们的长度必须相同。

li 元素将被动态添加,因为这是一个 React 应用程序,当您点击设置警报按钮时,会弹出表单,您可以设置新的警报。设置警报后,还有另一个组件将所有警报列为li元素。

我的网站包括:

.container ,其中包含其他所有内容。

.container{
 width: 60%;
 margin: 0 auto;
 margin-top:5em;
 height: 100vh;
 text-align: center;
}

.clock - div,这是.container的第一个孩子

.clock{
 background-color: black;
 color: white;
 border-radius: .5em;
 margin: 0 auto;
 padding: 2em 3em;
 -webkit-box-shadow: 0px 0px 50px 2px rgba(0,0,0,0.75);
 -moz-box-shadow: 0px 0px 50px 2px rgba(0,0,0,0.75);
 box-shadow: 0px 0px 50px 2px rgba(0,0,0,0.75);
}

设置闹钟按钮 - 此按钮位于.clock div 下方。

.btn-setAlarm{
  width: 100%;
  margin-top: 1em;
  padding: 1em;
  border-radius: .3em;
  border:0;
  font-size: 1.2em;
  outline: none;
}

.btn-setAlarm:hover{
  cursor: pointer;
}

最后是 ul 元素,我希望所有 li 元素具有相同的宽度,内联显示,但一行最多 3 个。

ul{
  padding-left:0;
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  width: 100%;
}

li{
  background-color: white;
  border-radius: .3em;
  width: 30%;
}

我的想法是:

  1. display: flex for ul 元素将使所有 li 元素显示在一行中
  2. li 元素过多时,flex-wrap:wrap 会将li 元素分到下一行
  3. width: 30% 设置为li 将确保一行中的最大li 元素为3。

但我最终得到了这个,我无法弄清楚如何做到这一点,如果没有必要,我不想使用浮点数。

编辑:HTML 结构

<div className="container">
      {checkTime()}

      <div className="clock">
        <div className="time">
          <div className="column">
            <p>{time.currentDay}</p>
            <span>DAY</span>
          </div>

          <p className="dot">:</p>

          <div className="column">
            <p>{time.currentHour}</p>
            <span>HOURS</span>
          </div>

          <p className="dot">:</p>

          <div className="column">
            <p>{time.currentMinute}</p>
            <span>MINUTES</span>
          </div>

          <p className="dot">:</p>

          <div className="column">
            <p>{time.currentSecond}</p>
            <span>SECONDS</span>
          </div>
        </div>
      </div>

      <Alarm getInfo={getAlarm} />

      <ListAlarms alarms={time.alarms} removeAlarm={removeAlarm} />
    </div>

我还使用 React Spring 过渡来为这些 Li 元素设置动画,我注意到对于这个动画,React spring 正在创建 并且在这个 div 里面是 li 元素放置。所以我在这个 div 类中添加了 .div-li ,使其更具可格式化性。

【问题讨论】:

    标签: html css flexbox


    【解决方案1】:

    ulposition设置为relative,将justify-content设置为space-around,这将使它们获得定义的宽度并在它们之间留出空间,您也可以将justify-content设置为space-between如果你想。为flex-shrinkflex-growflex-basis 添加flex 也是个好主意

    ul{
        position: relative;/* added */
        padding-left:0;
        list-style: none;
        display: flex;
        justify-content: space-around;/* added */
        flex-wrap: wrap;
        width: 100%;
    }
    
    li{
      background-color: white;
      border-radius: .3em;
      width: 30%;
      flex: 0 0 0;/* added */
    }
    

    【讨论】:

    • 复制粘贴,完全不行。。我觉得李比以前瘦了。我想我可以看到问题所在。为了显示这些 li,我使用了 React 弹簧转换。并且每个被渲染的 LI 都被另一个 div 覆盖。所以也许这就是问题
    • 我们可以看看你的html结构吗
    • 编辑完成。我觉得我有问题
    【解决方案2】:

    如果您将 flex-shrink: 0 添加到您的 li 规则中,这将防止它们变得小于定义的宽度。

    编辑问题后的编辑/添加/发布生成的 HTML 代码:

    由于lis 不是ul直接 子代,但有由 React 生成的 div.li-div 包装了 lis,您需要应用 @987654327 @ 设置(可能还有其他设置)为div.li-div 而不是li,这是代码中实际的弹性项目。所以这将是这样的规则:

    div.li-div {
      background-color: white;
      border-radius: .3em;
      width: 30%;
    }
    

    如果这还不够,还要添加 flex-shrink: 0 以避免它们变得更小,成为弹性项目。

    【讨论】:

    • 我已经添加了它并没有做任何改变。
    • li 元素是ul直接 子元素吗? (您应该发布您生成的 HTML 代码)。 ul 元素真的和按钮上方一样宽吗?
    • 现在我注意到问题是,我正在使用 React sping 转换来为这些 li 设置动画。并且在制作动画时,这些 Li 被 div 覆盖,这是由 react spring transitions 创建的。
    • 因此您可以将 li 规则的 CSS 选择器更改为 ul &gt; * { ... },即处理 ul 的直接子代(即那些由 React 生成的 divs) - 或者实际上div.div-li { ...} ,在看到您的问题的补充后
    猜你喜欢
    • 2019-08-18
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多