使用CSS或JS

时间:2016-09-01 09:40:53

标签: javascript jquery css css3 jquery-selectors

我有一个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;
&#13;
&#13;

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

3 个答案:

答案 0 :(得分:1)

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

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

&#13;
&#13;
*{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;
&#13;
&#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")

的优点:

  • 为不同的元素大小工作
  • 在窗口调整大小上添加相同的重新计算,并且您有一个有效的响应方式

缺点:

  • 对浏览器非常讨厌的多个jQuery重新计算
  • 在我看来丑陋的代码

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