我有一个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>
&#13;
在片段溢出的当前非响应版本中,我们可以看到4个完整的div和第5个小部分。我想选择第5个(或者最好选择第4个div,因为下一个不完全可见)。
答案 0 :(得分: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;}
}
&#13;
<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>
&#13;
答案 1 :(得分:0)
我已经完成了一些JQ代码,希望有所帮助
如果所有元素具有相同的宽度,则此方法有效。如果它们具有不同的宽度,则代码需要一些小的改动
见这里&gt; JSFIDDLE
JQ CODE:
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
在这里看小提琴&gt;的 JsFiddle 强>
答案 2 :(得分:0)
这是我的工作方式,但我会欢迎任何更好的方式。
一切都是由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")