【问题标题】:Creating a bottom border of element(s) on top of a "row" with bottom border在具有底部边框的“行”顶部创建元素的底部边框
【发布时间】:2015-07-28 09:43:36
【问题描述】:

我有不同数量的物品,它们可能适合也可能不适合在容器内的单个“行”中。如果它们不适合,则应创建另一个“行”。

所有项目将包含一个单词(或最多 2 个),因此不超过 1 行数据。每个项目应该有一个 1px 的下边框,每行也应该有一个 1px 的下边框,所以结果应该是这样的:

|-----------------------------------
|                                  |
|  Foo bar    Foo bar      Foo bar |
|--=======-------------------------|
|                                  |
|                                  |
|  Foo bar    Foo bar      Foo bar |
|----------------------------------|

(鼠标悬停在第一个项目上)。

项目的底部边框应该出现在行底部的行的顶部(隐藏的行边框与项目的宽度一样多)。

我有this codepen,但是

  • 我不知道如何为每个“行”的底部边框设置样式
  • 每次我将鼠标放在其中一项上时,这些项都会移动。

我应该用什么来实现我想要的?

注意:如果这样更容易的话,我可以使用 CSS3。

.container {
  border: 1px solid grey;
  width: 300px;
}

.item {
  float: left;
  /*border: 1px solid green;*/
  border: 1px solid transparent;
  padding: 2px 7px 2px 7px;
}

.item:hover {
  border-bottom: 1px solid red;
}
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/>

<div class="container">
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
</div>

【问题讨论】:

  • 所有元素总是只有一行文本吗?如果是,您可能不需要更改标记。
  • @Harry,是的,所有项目都将包含一个单词(或最多 2 个),因此不超过 1 行。
  • @Pete 我也把代码放在这里了,但是渲染器有问题。它没有正确渲染容器的边界线。
  • @alexandernst 只需要这里的代码,因为这是一个参考站点,旨在帮助人们。如果链接断开,那么如果代码不在问题范围内,这将不会有帮助
  • @alexandernst:容器的边框没有出现,因为 CodePen 中包含的引导 CSS 文件未包含在此处(我认为这是一个 clearfix 问题)。我已经在问题中添加了这一点以及 cmets 中提供的说明。

标签: html css linear-gradients


【解决方案1】:

由于内容总是最多一行,您可以将每个项目的height设置为固定高度(例如height: 2em),然后将linear-gradient背景用于相同高度的父容器产生类似行线的效果。正如您在 sn-p 的第二个块中看到的那样,这些行是父级的 background,即使没有内容也会产生它们。这会让人产生一种错觉,即单个项目具有全宽底部边框。

这不需要对您的标记进行任何更改,但请注意,只要项目的内容适合单行,这种方法就可以正常工作。

.container {
  width: 300px;
  font-size: 14px;
  /* following code produces the blue lines */
  background: linear-gradient(to bottom, transparent 1.95em, blue 1.95em);
  background-size: 100% 2em;
  background-origin: border-box;
  background-position: 0px 0px; /* y position is dependant on border-top-width */
}
.item {
  box-sizing: border-box; /* to make padding part of element's height & width */
  float: left;
  height: 2em; /* a fixed height */
  padding: 2px 7px 2px 7px;
  border-bottom: 1px solid transparent; /* needed to avoid jumping */
}
.item:hover {
  border-bottom: 1px solid red; /* red line that is shown on hover */
}

/* just for demo */

.demo{
  margin-top: 10px;
  border: 1px solid grey;
  background-position: 0px 1px;
  height: 8em;
}
.container:hover{
  font-size: 16px;
}
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/>

<div class="container">
  <div class="item">Foo bar long</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
  <div class="item">Foo bar</div>
</div>

<div class="container demo">

</div>

输出截图:

【讨论】:

  • 好的,我又发现了一个错误。第一行顶部有一条蓝线(不应该存在),最后一行底部没有蓝线(应该存在)。
  • @alexandernst:对不起,我看不到这样的东西。最后一行的底部有一行,第一行的顶部没有。可以告诉我浏览器及其版本吗?
  • 当我删除容器的灰色边框时,该错误就会出现。
  • @alexandernst:哦,好吧,那是因为你需要在移除容器的边框时将background-position改为0px 0px
  • 真的!我可以在容器类中设置字体大小。效果很好,感谢您的出色解决方案!
【解决方案2】:

如果您将 html 更改为 agrouped 元素:

<div class="container clearfix">
   <div class="row">
       <div class="item">Foo bar</div>
       <div class="item">Foo bar</div>
       <div class="item">Foo bar</div>
       <div class="item">Foo bar</div>
   </div>
   <div class="row">
       <div class="item">Foo bar</div>
       <div class="item">Foo bar</div>
       <div class="item">Foo bar</div>
       <div class="item">Foo bar</div>
   </div>
   <div class="row">
       <div class="item">Foo bar</div>
       <div class="item">Foo bar</div>
       <div class="item">Foo bar</div>
       <div class="item">Foo bar</div>
   </div>
</div>

你可以造型:

 .row:hover .item {
      border-bottom: 1px solid red;
 }

看看这个小提琴:

https://jsfiddle.net/1LLzr8q7/

【讨论】:

  • 我不能做那个标记,因为我不知道有多少元素可以排成一行。您的代码假定只有 4 个元素适合,但情况可能并非如此。
  • 好的,那么你需要的就不可能了。您需要在 javascript 中计算非常复杂的公式来实现它。如果您不知道需要多少行元素,则无法绘制一行的元素,因为您没有行。如果一行包含 4 个元素,然后一行包含 6 个元素怎么办?
【解决方案3】:

用这个更新你的CSS。

.item {
  float: left;
  border-bottom: 1px solid grey;
  padding: 2px 7px 2px 7px;
}

【讨论】:

  • 好的,这解决了移动项目的问题,但是每一行的底部边框呢?
  • 不是,不是。每个元素的底部边框现在可以正确显示。他们也不动。到目前为止,一切都很好。缺少的是每行的底部边框。意思是,每行元素下应该有一条从一边到另一边的小 1px 线(在本例中,在每 3 个“Foo bar”下)。
  • 当鼠标悬停在任何 div 上时,您想获得整个第一行的边框...?
  • @alexandernst 你不能。你没有行。您有没有分隔符的 divs 子项。如果你有&lt;tr&gt;,你可以,但是你的 html 需要使用 javascript 来知道你悬停在哪一行。
  • 不,我想要一个底部边框一直显示(悬停与否)。 @MarcosPérezGude 我很害怕,但我愿意接受标记更改。
猜你喜欢
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多