代码之家  ›  专栏  ›  技术社区  ›  Ricky

基于子弹性项的容器宽度[重复]

  •  2
  • Ricky  · 技术社区  · 7 年前

    我的问题是,我希望边栏的宽度在关闭时为100px宽,在打开时为列的宽度。如果在打开状态下使用固定宽度,则会发生以下情况:

    enter image description here

    HTML:

    <nav class="sidebar">
        <ul>
            <li>
                1
            </li>
            <li>
                2
            </li>
            <li>
                3
            </li>
            <li>
                4
            </li>
            <li>
                5
            </li>       
            <li>
                ...
            </li>       
        </ul>
    </nav>
    

    .sidebar {
        background: #ccc;
        width: 100px;
    
        ul {
            list-style-type: none;
            height: 100vh;
    
            display: flex;
            flex-wrap: wrap;
            flex-direction: column;
            align-content: flex-start;
    
            li {
                background: #000;
                height: 80px;
                width: 80px;
            }
        }
    
        &:hover
        {
            //width: !?!?!?!
        }
    }
    

    我怎样才能做到这一点?如何打开侧边栏并显示所有列?

    侧边栏的高度可能因屏幕大小而异。我用原始设置更新了代码。

    我测试了这两种解决方案,尽管@itay gal是一个聪明的CSS唯一选项,但它缺乏动画能力。因为我已经在使用JS,所以我最终使用了@pablo darde解决方案。

    我在@pablo darde's中做了一个小改动,这样它就可以使用一个可变高度的边栏:

    const sidebar = document.querySelector('.sidebar');
    const ul = sidebar.querySelector('ul');
    const li = ul.querySelector('li');
    
    const showRemainder = () => {
        const ulHeight = ul.clientHeight;
        const liHeight = li.clientHeight;
        const width = ul.clientWidth * Math.ceil(ul.children.length / (ulHeight / liHeight));
        sidebar.style.maxWidth = `${width}px`;
    }
    
    4 回复  |  直到 7 年前
        1
  •  2
  •   Pablo Darde    7 年前

    我真的试图只使用CSS和您的代码进行编码,但没有成功。我用一些JavaScript代码达到了预期的结果。请告诉我你能不能买些更优雅的。

    pointer-events: none; 你的财产 li 元素。这在这里非常重要。如果你想用 href 在里面 s、 我认为需要进行一些重构。

    const sidebar = document.querySelector('.sidebar');
    const ul = sidebar.querySelector('ul');
    
    const showRemainder = () => {
      const width = ul.clientWidth * Math.ceil(ul.children.length / 5);
      sidebar.style.maxWidth = `${width}px`;
    }
    
    const hideRemainder = () => {
    	sidebar.style.maxWidth = '80px';
    }
    
    sidebar.addEventListener('mouseover', showRemainder);
    
    sidebar.addEventListener('mouseout', hideRemainder);
    .sidebar {
      background: #ccc;
      max-width: 80px;
      width: auto;
      height: 400px;
      overflow: hidden;
      transition: all 0.5s ease;
    }
    
    .sidebar ul {
      list-style-type: none;
      height: 400px;
      display: flex;
      padding: 0;
      margin: 0;
      flex-flow: column wrap;
      align-content: flex-start;
    }
    
    .sidebar ul li {
      display: flex;
      pointer-events: none;
      justify-content: center;
      align-items: center;
      background: #000;
      height: 80px;
      width: 80px;
      color: #fff;
      box-sizing: border-box;
      border: 1px solid #fff;
    }
    <nav class="sidebar">
        <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>
        </ul>
    </nav>
        2
  •  1
  •   Itay Gal    7 年前

    我的建议是使用一点javascript来计算元素并设置所需的宽度,但如果您真的不能,这可能会有所帮助:

    首先我设置侧栏的高度,然后设置 ul 包扎 li 它在正确的地方。

    添加 overflow: hidden 将隐藏除第一列以外的所有内容。

    在悬停时,我将溢出设置为可见,这样您就可以看到剩余的部分 S

    因为我们不能为溢出的部分添加背景,所以我通过添加一个 div .

    这几乎可以奏效。但是,当最后一列未满时,您将在最后一列中看到没有背景的空白。

    after 选择器到最后一个元素,具有整个元素的高度 保险商实验室 并添加了一个 container 具有 溢出:隐藏

    可能遗漏了什么?

    我们不能给它设置动画,因为 overflow

    .sidebar {
      list-style-type: none;
      overflow: hidden;
      width: 100px;
      transition: all 1s;
      height: 400px;
      display: flex;
    }
    
    .sidebar ul {
      list-style-type: none;
      margin: 0px;
      padding: 0px;
      display: flex;
      flex-wrap: wrap;
      flex-direction: column;
      align-content: flex-start;
    }
    
    .sidebar li {
      background-color: #ccc;
      padding: 10px;
    }
    
    .sidebar li div {
      background-color: red;
      height: 80px;
      width: 80px;
      display: flex;
      justify-content: center;
      align-items: center;
      font-size: 32px;
      font-weight: bold;
      position: relative;
    }
    
    .sidebar:hover {
      overflow: visible;
    }
    
    .sidebar li:last-child div:after{
      height: 400px;
      background-color: #ccc;
      content:"     htr   ";
      position: absolute;
      display: none;
      z-index: -1;
      top: 0px;
      width: 100px;
    }
    
    .sidebar:hover li:last-child div:after{
      display: inline-block;
    }
    .container{
     height: 400px;
     overflow-y: hidden;
    }
    <div class="container">
    <nav class="sidebar">
      <ul>
        <li>
          <div>1</div>
        </li>
        <li>
          <div>2</div>
        </li>
        <li>
          <div>3</div>
        </li>
        <li>
          <div>4</div>
        </li>
        <li>
          <div>5</div>
        </li>
        <li>
          <div>6</div>
        </li>
        <li>
          <div>7</div>
        </li>
        <li>
          <div>8</div>
        </li>
        <li>
          <div>9</div>
        </li>
        <li>
          <div>10</div>
        </li>
        <li>
          <div>11</div>
        </li>
        <li>
          <div>12</div>
        </li>
        <li>
          <div>13</div>
        </li>
         <li>
          <div>14</div>
        </li>
      </ul>
    </nav>
    </div>
        3
  •  0
  •   QuattroDog    7 年前

    这可以通过一点Javascript轻松完成。您将获得列表项的数量,然后进行少量计算以确定所需的列数,并将该宽度样式应用于侧栏。

        4
  •  -1
  •   MichaelvE    7 年前

    这段代码并不漂亮,但它可能会给你一些可以使用的东西。我在侧边栏上隐藏了一个溢出。将其设置为第一列的宽度。然后在侧边栏上悬停,将宽度更改为两列的大小。

    .sidebar {
      background: #ccc;
      width: 100px;
      overflow:hidden;
      -webkit-transition: width 1s;
      transition: width 1s;    
    }
    
    ul {
      margin-left: -20px;
      list-style-type: none;
      height: 500px;
      display: flex;
      flex-wrap: wrap;
      flex-direction: column;
      align-content: flex-start;
      justify-content: center;
    }
    
    li {
      background-color: #000;
      height: 80px;
      width: 80px;
      color: white;
      text-align: center;
    }
    
    .sidebar:hover {
      width: 200px;
    }
    <nav class="sidebar">
      <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>    
        
      </ul>
    </nav>