2013-05-10 11 views
7

Ich habe eine div (parentDivStyle) mit der Position absolute, die meine Eltern Div ist. Dann habe ich 5 Kinder (childDivStyle) Div innerhalb der Elternteil Div mit Position relative. Ich habe die overflow auf das Elternteil div versteckt. Daher sind einige der untergeordneten divs nicht sichtbar. Ich möchte die divs bekommen, die von jquery nicht sichtbar sind. Gibt es irgendeinen Weg?Get nicht sichtbaren inneren div

Ich habe es gegooglet und die meisten der Ergebnisse, die auf "sichtbare" Eigenschaft bezogen, Das ist nicht was ich will. Und ich bevorzuge auch kein Plugin. Irgendwelche Hilfe bitte.

CSS

.parentDivStyle { 
    overflow:hidden; 
    width:300px; 
    height:50px; 
    position:absolute; 
    background:#ccc; 
    float:left; 
} 
.childDivStyle { 
    width:100px; 
    height:50px; 
    position:relative; 
    float:left; 
    background:red; 
    border: 1px solid black; 
} 

HTML

<div class="parentDivStyle"> 
<div class="childDivStyle">1</div> 
<div class="childDivStyle">2</div> 
<div class="childDivStyle">3</div> 
<div class="childDivStyle">4</div> 
<div class="childDivStyle">5</div> 
</div> 

JSFIDDLE

+0

Warum Sie eine Höhe auf dem übergeordneten Set verfügen, zusammen mit Überlauf: versteckt, wenn man die Kinder sichtbar sein? Es ist nicht wirklich klar, was du hier machst. –

+0

@ ralph.m, ich baue einen Slider. Ich muss die nicht sichtbaren divs kennen. – arjuncc

+0

Möchten Sie alle '.childDivStyle' anzeigen, die nicht sichtbar sind oder nur einzeln angezeigt werden (denken Sie an ein Sprite-Bild)? –

Antwort

1

Mit this answer über das Abrufen von Koordinaten von Elementen können Sie herausfinden, wo Elemente in Bezug aufeinander stehen. Sobald Sie die Koordinaten des sichtbaren Bereichs kennen, können Sie leicht herausfinden, welche Kindelemente sichtbar sind.

Dies wird Ihnen sagen, ob die Elemente sichtbar sind, und wenn nicht, welche Richtung sie in Bezug auf den Container sind.

displayCoords = function(element) { 
    var rect = element.getBoundingClientRect(); 
    console.log(rect.top, rect.right, rect.bottom, rect.left); 

    var childElements = element.children; 
    for(i = 0; i < childElements.length; i++) 
    { 
     childRect = childElements[i].getBoundingClientRect(); 
     console.log(childRect.top, childRect.right, childRect.bottom, childRect.left); 
     if(childRect.top >= rect.bottom) 
      console.log("not visible -- off the bottom of element"); 
     else if(childRect.left >= rect.right) 
      console.log("not visible -- off the right of element"); 
     else if(childRect.bottom <= rect.top) 
      console.log("not visible -- off the top of element"); 
     else if(childRect.right <= rect.left) 
      console.log("not visible -- off the left of element"); 
    } 

} 

ich gegabelt Ihre JSFiddle here

3

Sie die Position des Kindes divs verwenden können, und die Höhe des Mutter wie folgt aus:

$('#parent .childDivStyle').each(function(index,div){ 
    if($(div).position().top > $('#parent').height()) alert($(div).html()) 
}); 

Die Arbeits Geige: http://jsfiddle.net/3suDz/3/

Hoffe, es hilft.

+0

Schöne Antwort, aber ich muss berücksichtigen, auch wenn es rechts oder links ausgerichtet ist .. bin hinzufügen +1 – arjuncc

+0

Dies ist nicht dumm, da es darauf ankommt die genaue Geometrie des Layouts Wenn Sie beispielsweise den schwarzen Rahmen mit 0px festlegen, erhalten Sie andere Ergebnisse. Die Idee ist jedoch gut, aber die Implementierung erfordert Präzision. –

+0

Ich würde empfehlen, eine Kombination aus [outerWidth (true)] (http://api.jquery.com/outerWidth/) und [outerHeight (true)] (http://api.jquery.com/outerHeight/) zu verwenden Das Padding, der Rahmen und die Ränder werden ebenfalls in die Dimensionsberechnungen einbezogen. – Zhihao

-1

Sie können jQuery verwenden ist() Funktion, etwa so:

$(element).is(":visible") 

Also in Ihrem Fall würden Sie so etwas tun:

var elems = $(".childDivStyle"); 
for(var i = 0; i < elems.length; i++) 
{ 
    if(!($(elems[i]).is(":visible"))) 
    { 
     // The element is hidden 
    } 
} 
+3

Das funktioniert nicht so wie Sie könnte erwartet werden, da alle '.childDivStyle'-Elemente sichtbar sind, was sich davon unterscheidet, dass sie wegen der Überlaufeigenschaftseinstellung ausgeblendet sind. Siehe http://jsfiddle.net/audetwebdesign/3suDz/5/ –

1

unten Code Versuchen

$('div.parentDivStyle div').each(function(index, element){ 
      alert(this.offsetTop + $(this).height() > $('div.parentDivStyle').height()); 
     }); 

Wenn die untergeordnete div-Datei ausgeblendet ist, wird sie als wahr oder falsch zurückgegeben.

überprüfen Auf der Geige http://jsfiddle.net/3suDz/4/

+0

Das scheint gut zu funktionieren. Ich habe den HTML-Code optimiert, zum Beispiel den Rand auf 0px gesetzt, die Breite von '.parentDivStyle' variiert und der Wahr/Falsch-Wert war korrekt. Das sieht ziemlich robust aus. Bitte erklären Sie 'this.offsetTop', danke. –

+1

wird der Abstand des aktuellen untergeordneten Elements relativ zum Anfang des übergeordneten Knotens zurückgegeben. http://help.dottoro.com/ljnvukbb.php – vijay

1

Hier ist eine Geige, die die relative Natur des Kindes divs berücksichtigt.Es kondensiert werden kann, aber ich ließ es in Langform, so dass die Logik

http://jsfiddle.net/arpTx/18/

$("#p").children().each(
     function(idx, el) { 
      var pos = $(el).position(); 

      console.log("child " + $(el).text() + " is visible: " + isVisible(pos.left, pos.top)); 
    }); 

function isVisible(x, y) { 
    var pos = $("#p").position(); 
    var left = pos.left; 
    var right = left + $("#p").width(); 
    var top = pos.top; 
    var bottom = top + $("#p").height();  

    x += left; 
    y += top; 
    return (x >= left && x < right) && (y >= top && y < bottom); } 
1

Wie über diese als Lösung

CSS

.parentDivStyle { 
    overflow:hidden; 
    width:300px; 
    height:50px; 
    position:absolute; 
    background:#ccc; 
    float:left; 
} 
.childDivStyle { 
    width:100px; 
    height:50px; 
    position:relative; 
    float:left; 
    background:red; 
    border: 1px solid black; 
} 

HTML offensichtlich ist

<div id="parent" class="parentDivStyle"> 
    <div class="childDivStyle">1</div> 
    <div class="childDivStyle">2</div> 
    <div class="childDivStyle">3</div> 
    <div class="childDivStyle">4</div> 
    <div class="childDivStyle">5</div> 
</div> 

Javascript

function getNotVisible(parentId, childClassName) { 
    var parent = document.getElementById(parentId), 
     children, 
     elements; 

    if (parent) { 
     children = parent.getElementsByClassName(childClassName); 
     if (children) { 
      elements = []; 
      Array.prototype.forEach.call(children, function (child) { 
       var pBounds = parent.getBoundingClientRect(), 
        cBounds = child.getBoundingClientRect(); 

       if (cBounds.right < pBounds.left || cBounds.left > pBounds.right || cBounds.bottom < pBounds.top || cBounds.top > pBounds.bottom) { 
        elements.push(child); 
       } 
      }); 
     } 
    } 

    return elements; 
} 

console.log(getNotVisible("parent", "childDivStyle")); 

Auf jsfiddle

BTW, wenn Sie ein jQuery-Objekt aus dieser wollen dann die folgende

var $hiddens = $(getNotVisible("parent", "childDivStyle")); 

Auch, wenn Sie ein Array zurückgegeben werden soll, anstatt undefiniert, dh still scheitern, wenn das Elternelement nicht oder keine Kinder gefunden wurden.

Dann

elements = []; 

löschen und

var parent = document.getElementById(parentId), 
    children, 
    elements = []; 

Und natürlich ändern, um dies alles hängt von Ihnen die korrekte Schreibweise Ihrer CSS Einstellung, da keine Kontrollen für visibility oder overflow gemacht werden, usw.

Wenn Sie CSS-Prüfungen hinzufügen möchten, um Ihre CSS-Arbeit zu überprüfen, können Sie window.getComputedStyle verwenden und den wichtigen Wert überprüfen s.

Verwandte Themen