2011-05-31 77 views
7

我已经看到了几种解决方案,它们确定了在滚动页面时某个元素在视口中可见的时间,但我还没有看到任何这样的操作,这些元素包含在滚动容器div中,如本例中所示。HTML如何判断哪些元素可见?

当他们通过滚动div滚动到视图中时,我将如何检测这些项目?而相比之下,如果他们掉在视线之外,我会如何发现他们。在任何情况下,溢流元件都不会在一开始就隐藏起来。

HTML

<div id="mainContainer" class="main"> 
     <div id="scrollContainer"class="scroller"> 
      <div id="picturesContainer"class="holder"> 
       <div id="pictureContainer1" class="picture position1"> 
       pictureContainer1</div> 

       <div id="pictureContainer2" class="picture position2"> 
       pictureContainer2</div> 
       <div id="pictureContainer3" class="picture position3"> 
       pictureContainer3</div> 
       <div id="pictureContainer4" class="picture position4"> 
       pictureContainer4</div> 
       <div id="pictureContainer5" class="picture position5"> 
       pictureContainer5</div> 
       <div id="pictureContainer6" class="picture position6"> 
       pictureContainer6</div> 
       <div id="pictureContainer7" class="picture position7"> 
       pictureContainer7</div> 
       <div id="pictureContainer8" class="picture position8"> 
       pictureContainer8</div> 
       <div id="pictureContainer9" class="picture position9"> 
       pictureContainer9</div> 
      </div> 

     </div> 
    </div> 

CSS

.main{ 
     position:absolute; 
     top:0px; 
     left:0px; 
     height: 200px; 
     width:200px; 
     background-color: grey; 
     border: 1px solid black; 
    } 

    .scroller{ 
     position:absolute; 
     top:0px; 
     left:0px; 
     height: 250px; 
     width:250px; 
     background-color: lightblue; 
     border: 1px solid black; 
     overflow: scroll; 
    } 

    .picture{ 
     position:absolute; 
     height: 200px; 
     width: 200px; 
     background-color: lightyellow; 
     border: 1px solid black; 
    } 

    .position1{ 
     top:0px; 
     left:0px; 
    } 

    .position2{ 
     top:0px; 
     left:200px; 
    } 

    .position3{ 
     top:0px; 
     left:400px; 
    } 

    .position4{ 
     top:200px; 
     left:0px; 
    } 

    .position5{ 
     top:200px; 
     left:200px; 
    } 

    .position6{ 
     top:200px; 
     left:400px; 
    } 

    .position7{ 
     top:400px; 
     left:0px; 
    } 

    .position8{ 
     top:400px; 
     left:200px; 
    } 

    .position9{ 
     top:400px; 
     left:400px; 
    } 

    .holder{ 
     position:absolute; 
     top:0px; 
     left:0px; 
     width:600px; 
     height:600px; 
     background-color:lightgreen; 
    } 

回答

2

在页面上首先包含jQuery库。

function getObjDims(obj){ 
    if (!obj) return false; 
    var off = $(obj).offset(); 
    var t = { 
     top:off.top, 
     left:off.left, 
     width:$(obj).width(), 
     height:$(obj).height() 
    }; 
    return {x1:t.left, y1:t.top, x2:t.left+t.width,y2:t.top+t.height} 
}; 
function testInside(pic,box){ 
    var d=getObjDims(pic); 
    return (box.x1<=d.x1 && box.y1<=d.y1 && box.x2>=d.x2 && box.y2>=d.y2)?1:-1; 
}; 
$(document).ready(function(){ 
    var inside={}; 
    var port=$('#scrollContainer'); 
    var box=getObjDims(port); 
    $(window).resize(function(){ 
     box=getObjDims(port); 
    }); 
    $(port).scroll(function(){  
     var str=[]; 
     $('.picture').each(function(i){ 
      var oldState = inside[this.id]!=undefined?inside[this.id]:0;    
      var newState = testInside(this,box); 
      inside[this.id]=newState; 
      if (oldState!=newState) 
       switch (newState){ 
        case 1:str.push(this.id);break;// go IN 
        case -1: break;// go OUT 
       } 
     }); 
     $('#picStatus').text(str.join(', ')); 
    }); 
}); 

添加在HTML的输出结果:

<div style='margin-top:280px;'>Pictures in window (numbers):</div> 
<div id='picStatus'></div> 

它是基于对象的COORDS代码,女巫重新计算滚动事件。有一些事情要知道。 IE和似乎是,Opera考虑了滚动条本身的宽度和高度,这要求窗帘代码调整。我只是提出了解决方案,并没有花太多时间来调试。

然而,也许会有用以下(从jQuery的API大约偏移):

注:jQuery的不支持获取 偏移坐标隐藏 元素或占边框, 利润,或填充设置在身体 元素上。

+0

一旦一个对象完全可见,这似乎就工作了。这是继续为我 - 谢谢伊戈尔。如果有人想看到它的工作,我已经把代码[在这里](http://jsfiddle.net/PSjBN/54/)。我会进一步研究这篇文章的更新。 – T9b 2011-06-03 08:58:19

1

http://www.quirksmode.org/mobile/viewports.html讨论问题围绕视口,确定它们的尺寸,并且计算元件界定相对于视口的坐标框架。那篇博文的第2部分随后进入移动浏览器的隐式视口。他没有给出准确回答你的问题的代码,但它绝对相关,值得一读。

+0

嗨,这是非常有趣的,但它又主要是指视口,而不是封闭的元素。 – T9b 2011-06-01 13:08:09

+1

@ T9b,是不是计算可见性(假设没有浮动元素遮挡)是递归检查一个元素是否在每个祖先的可见部分内的计算溢出不是“显示”或一个计算出的“剪辑”区域,并且没有祖先的计算显示为“无”或除“可见”之外的计算可见性?你仍然遇到祖先的问题,他们的背景与他们后代的前景是一样的,但除非你试图解决像可信任路径这样的难题,否则你可能会忽略它。 – 2011-06-01 15:04:51

+0

是的,你是对的。这是递归检查一个元素是否与包括当前滚动位置和边界元素大小在内的许多事情相关的可见性。我知道这很困难,我忽略了页面中可能存在其他元素的事实,但实际上是询问是否有人(咳嗽)已准备好的解决方案。否则我就像他们说的那样滚动我自己的... – T9b 2011-06-01 15:13:32

相关问题