【问题标题】:Expanding child (in small parent element) element on hover (depending on elements quantity)悬停时扩展子元素(在小父元素中)(取决于元素数量)
【发布时间】:2017-10-26 19:58:45
【问题描述】:

我有一个表格,其中有带有数字的小元素(大约 20 像素)(使用了多少次)。悬停时显示子元素(绝对位置),其中包含使用它的位置。所以有链接,它甚至可能是几百像素的宽度。 HTML 看起来像这样:

.el-used {
  position: relative;
  margin-left: 4px;
  padding: 1px 6px;
  text-decoration: none;
  background: #fff;
  border-radius: 12px;
  border: 1px solid #d7d6d5;
  font-size: 0.938em;
}

.el-used:hover {
  background: #ff6840;
  color: #fff;
}

.el-used .list {
  position: absolute;
  top: 0;
  left: 0.9em;
  display: none;
  width: 20em;
  padding: 15px;
  z-index: 10;
  border: inherit;
  border-radius: 3px;
  color: #666;
  background: #fff;
}

.el-used:hover .list {
  display: inline-block;
}

.el-used .list a {
  margin-right: 15px;
  white-space: nowrap;
}
<div><span class="el-used">1<span class="list">Wszystkie</span></span>
</div>
<div><span class="el-used">1<span class="list"><a href="/1">O firmie</a></span></span>
</div>
<div><span class="el-used">6<span class="list"><a href="/">O firmie</a> <a href="/4">Oferta</a> <a href="/5">Podstrona 1</a> <a href="/6">Podstrona 2</a> <a href="/8">Podstrona 4</a> <a href="/2">Mapa strony</a></span></span>
</div>

问题是我必须设置 width:20em; 如果我不希望每个链接元素都在单独的行中。因为我假设 .list 元素正试图适应父级(.el-used),所以它的宽度很小并且文本被换行。 我只想设置(而不是那个宽度),例如max-width:20em 如果只有一个元素它会缩小,当有更多元素时它会增长(最多这 20em)。

一些建议如何解决?

【问题讨论】:

  • 我不清楚你想要实现什么。能否提供一张图片?
  • 是的,我希望它尽可能宽(例如 max-width:20em):imgur.com/a/eEaSv 但这个 imgur.com/a/CzMDj 仅与一个链接需要空间一样宽(所以我需要删除宽度:20em)。

标签: jquery css


【解决方案1】:

请注意,我对您的 HTML 做了相当多的重构:

  • 列表的东西应该被标记为这样,因此&lt;ul&gt;
  • 嵌套元素时要小心:a div should not reside within a span
  • 注意元素的默认display-property:spans 是inline,而divs 是block;理解这一点将使您能够充分利用 CSS 的强大功能:内联跟随文本流,而块导致中断并且可以有填充/边距

编辑

由于您提到希望将标记保存在表格中,因此我编辑了原始答案以解决此问题。基本上,将列表项设置为white-space: nowrap; 可以防止它们在内部换行。

我还添加了一个类.wide,它手动指定包含多个元素的框的宽度。您必须手动设置此宽度;至少我想不出没有固定宽度的解决方案。下面是两个例子:(6).wide 并且列表项展开,(12) 没有.wide,因此它们在彼此下方对齐。

td {
  border: 1px solid black;
}

.wrapper {
  position: relative;
}

.el-used {
  display: inline-block;
  margin-left: 4px;
  padding: 1px 6px;
  text-decoration: none;
  background: #fff;
  border-radius: 12px;
  border: 1px solid #d7d6d5;
  font-size: 0.938em;
}

.el-used:hover {
  background: #ff6840;
  color: #fff;
}

.el-used .list {
  position: absolute;
  top: 0;
  left: 0.9em;
  display: none;
  padding: 15px;
  border: inherit;
  max-width: 20em;
  border-radius: 3px;
  color: #666;
  background: #fff;
  z-index: 10;
  list-style-type: none;
}

.el-used .list.wide {
  width: 15em;
}

.el-used:hover .list {
  display: block;
}

.el-used .list li {
  display: inline-block;
  white-space: nowrap;
}
<table>
  <tbody>
    <tr>
      <td>First</td>
      <td>Second
        <div class="wrapper">
          <div class="el-used">1
            <ul class="list">
              <li>Wszystkie</li>
            </ul>
          </div>
        </div>
      </td>
      <td>Third</td>
      <td>Fourth</td>
    </tr>
    <tr>
      <td>First</td>
      <td>Second
        <div class="wrapper">
          <div class="el-used">1
            <ul class="list">
              <li><a href="/1">O firmie</a></li>
            </ul>
          </div>
        </div>
      </td>
      <td>Third</td>
      <td>Fourth</td>
    </tr>
    <tr>
      <td>First</td>
      <td>Second
        <div class="wrapper">
          <div class="el-used">
            6
            <ul class="list wide">
              <li><a href="/">O firmie</a></li>
              <li><a href="/4">Oferta</a></li>
              <li><a href="/5">Podstrona 1</a></li>
              <li><a href="/6">Podstrona 2</a></li>
              <li><a href="/8">Podstrona 4</a></li>
              <li><a href="/2">Mapa strony</a></li>
            </ul>
          </div>
        </div>
      </td>
      <td>Third</td>
      <td>Fourth</td>
    </tr>
    <tr>
      <td>First</td>
      <td>Second
        <div class="wrapper">
          <div class="el-used">
            12
            <ul class="list">
              <li><a href="/">O firmie</a></li>
              <li><a href="/4">Oferta</a></li>
              <li><a href="/5">Podstrona 1</a></li>
              <li><a href="/6">Podstrona 2</a></li>
              <li><a href="/8">Podstrona 4</a></li>
              <li><a href="/2">Mapa strony</a></li>
              <li><a href="/">O firmie</a></li>
              <li><a href="/4">Oferta</a></li>
              <li><a href="/5">Podstrona 1</a></li>
              <li><a href="/6">Podstrona 2</a></li>
              <li><a href="/8">Podstrona 4</a></li>
              <li><a href="/2">Mapa strony</a></li>
            </ul>
          </div>
        </div>
      </td>
      <td>Third</td>
      <td>Fourth</td>
    </tr>
  </tbody>
</table>

【讨论】:

  • 谢谢它好多了,但最后我需要把它放在桌子上,所以它会缩小到那个尺寸:jsfiddle.net/483yrp3x
  • @roiwew 很酷,您找到了适合您的解决方案!但是,您应该只将“表”用于实际的表格数据。将它们用于布局目的迟早会让您头疼。
  • 不幸的是我没有找到解决方案,因为根据表 ceil 缩小 .list 不是我需要的。我需要它比天花板更宽。您可以查看我之前发布的 jsfiddle 链接。
  • 对不起,我误解了您的评论。会看的!
  • @roiwew,如果可以的话,您可以使用 Javascript 来计算容器中的元素,并根据结果添加您的类。这应该不会对您的用户体验产生不利影响,因为默认情况下容器是隐藏的。
猜你喜欢
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 2015-04-16
  • 2011-07-01
  • 2013-07-12
  • 2013-12-07
相关资源
最近更新 更多