【问题标题】:Mark last visible child in overflown div using CSS or JS使用 CSS 或 JS 在溢出的 div 中标记最后一个可见子项
【发布时间】:2017-01-09 03:08:35
【问题描述】:

我有一个带有inline-block div 的酒吧。其中一些超出了视口,因为我为容器设置了:white-space:nowrap; overflow: hidden;。我正在寻找选择最后一个可见孩子的方法。可见我的意思是 div 被放置(最好完全)在它的容器区域中。

据我所知,CSS 和 jQuery 中都没有这样的选择器。最接近的是 jQuery 的:visible,但它表示所有 div 都是可见的,因为它们占用了页面布局中的空间。

我看到的唯一方法是枚举加载时的 div 和每次调整大小,以便通过将 div 的宽度、填充和边距相加来计算 div 是否仍在容器中。

你有更好的想法吗?

#container {
  white-space:nowrap;
  overflow: hidden;
}

.element {
  display: inline-block;
  vertical-align:top;
}
<div id="container">
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
</div>

在当前的、无响应版本的 sn-p 堆栈溢出中,我们可以看到 4 个完整的 div 和 5 个的一小部分。我想选择第 5 个(或者最好是第 4 个 div,因为下一个不完全可见)。

【问题讨论】:

  • @PatrickMlr 我看过那个链接,但使用了display:none。我们正在努力解决这里的溢出问题
  • 您可以尝试使用 jQuery 获取容器的 width 和每个元素的 offset。如果偏移量大于宽度,你就做你的事。
  • @PatrickMlr 是的,这是我当前想法的另一个实现。我问这个问题是为了找到一个更好的
  • 如果元素可以有不同的宽度,没有比遍历元素并计算宽度更好的方法(对于一般解决方案)。是否动态添加新元素?元素的宽度可以改变吗?如果没有,你可以在开始时缓存宽度,然后至少调整大小循环会更有效。

标签: javascript jquery css jquery-selectors


【解决方案1】:

您可以使用媒体查询。当然,这可能会变得非常麻烦,具体取决于您拥有的子元素的数量,但它确实节省了使用 onresize 事件侦听器的开销。

对于下面的代码片段,我假设父元素在屏幕的整个宽度上运行。

*{box-sizing:border-box;margin:0;padding:0;}
#container{
  font-size:0;
  overflow:hidden;
  white-space:nowrap;
}
.element{
  display:inline-block;
  opacity:.5;
  padding:5px;
  vertical-align:top;
  width:150px;
}
img{
  width:100%;
}
@media (max-width:299px){
  .element:first-child{opacity:1;}
}
@media (min-width:300px) and (max-width:449px){
  .element:nth-child(2){opacity:1;}
}
@media (min-width:450px) and (max-width:599px){
  .element:nth-child(3){opacity:1;}
}
@media (min-width:600px) and (max-width:749px){
  .element:nth-child(4){opacity:1;}
}
@media (min-width:750px) and (max-width:899px){
  .element:nth-child(5){opacity:1;}
}
@media (min-width:900px) and (max-width:1049px){
  .element:nth-child(6){opacity:1;}
}
@media (min-width:1050px) and (max-width:1199px){
  .element:nth-child(7){opacity:1;}
}
@media (min-width:1200px){
  .element:nth-child(8){opacity:1;}
}
<div id="container">
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
  <div class="element">
    <img src="http://placehold.it/150x150" alt=""/>
  </div>
</div>

【讨论】:

  • 这个答案也只适用于相同大小的元素,但它是媒体查询使用的一个很好的例子。
  • 我认为您无法知道每个子元素的内容以及它们的宽度?
【解决方案2】:

我做了一些JQ代码,希望对你有帮助

如果所有元素都具有相同的宽度,则此方法有效。如果它们的宽度不同,则代码需要进行一些小改动

看这里> JSFIDDLE

JQ 代码:

var vwidth = $(window).width() // get window width
var ewidth = $(".element").width() // get element width
var total = vwidth / ewidth // calculate how many elements fit inside the window width
var integer = parseInt(total)// get the integer from the result above

$(".element").eq( integer - 1 ).addClass("lastvisible")// -1 because eq starts from  0

不同宽度元素的解决方案:

JQ:

var vwidth = $(window).width(); // get screen width
  $(".element").each(function(){

  var eleft = $(this).offset().left // each element's distance from left of the screen 
  var ewidth = $(this).width()// each element's width
  var total = eleft + ewidth 
  if (total < vwidth) {  // if sum between distance from left of screen + element width is smaller than the window screen
        that = $(this); // all elements that are visible inside the screen
  }
  });

that.addClass("lastvisible") //only the last element visible inside the screen

在这里看小提琴> JsFiddle

【讨论】:

  • 此解决方案仅在所有元素具有相同大小时才有效,请参阅:jsfiddle.net/z59yosLc
  • 这就是我在我的回答中所写的......这也是使用您提供的代码对您的问题的回答。所以按照 SO 标准,这是一个正确的答案
  • @user1100671 用另一种解决方案编辑了我的答案......适用于不同的宽度
【解决方案3】:

这是我让它发挥作用的方法,但我欢迎任何更好的方法。

一切都由 jQuery 计算:

var cwidth = parseInt($('#container').width()); // get container width
var lastElement = $('#container .element:first'); // assume that first element is visible
$("#container .element:not(:first)").each(function(){
    //get right offset for every div
    var rightOffset = $(this).offset().left 
        + parseInt($(this).width())
        + parseInt($(this).css('padding-left'))
        + parseInt($(this).css('margin-left'));
    //if the right offset is bigger than container width then stop enumerating - previous one was the last fully visible
    if (rightOffset > cwidth){
        return false; 
    }
    //offset was lower than container with so this is our new fully visible element
    lastElement = $(this);
});

lastElement.addClass("lastvisible")

优点:

  • 适用于不同的元素大小
  • 在调整窗口大小时添加相同的重新计算,您就有了一种有效的响应方式

缺点:

  • 多次 jQuery 重新计算对浏览器来说非常麻烦
  • 我认为丑陋的代码

https://jsfiddle.net/6k5xujtc/1/

【讨论】:

  • 有很多可能的改进。而且,就像所有涉及 jQuery 的事情一样,有人已经写了一个插件:github.com/customd/jquery-visible。如果你想要效率,你可以做得更好,但这不太可能值得花时间。
  • @thirtydot 它不适用于溢出:i.imgur.com/ke9DO1q.png
猜你喜欢
  • 2014-08-18
  • 1970-01-01
  • 2011-07-13
  • 2019-03-28
  • 2014-04-26
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多