2010-06-17 4 views
45

Chciałbym nakładki div (lub dowolnego elementu, który będzie działać) na wiersz tabeli (tr), które ma więcej niż jedną kolumnę.Jak nakładać element div (lub dowolny element) na wiersz tabeli (tr)?

Próbowałem kilka metod, które wydają się nie działać. Poniżej zamieściłem mój obecny kod.

Dostaję nakładkę, ale nie bezpośrednio nad rzędem. Próbowałem ustawić wierzch nakładki na $ divBottom.css ("top"), ale to zawsze jest "auto".

Czy jestem na dobrej drodze, czy jest lepszy sposób na zrobienie tego? Korzystanie z jQuery jest w porządku, jak widać.

Jeśli jestem na dobrej drodze, w jaki sposób mogę poprawnie umieścić element div? Czy offsetTop stanowi przesunięcie w elemencie zawierającym, tabeli i muszę wykonać trochę matematyki? Jakieś inne problemy, z którymi bym się z tym spotkał?

$(document).ready(function() { 
 
    $('#lnkDoIt').click(function() { 
 
    var $divBottom = $('#rowBottom'); 
 
    var $divOverlay = $('#divOverlay'); 
 
    var bottomTop = $divBottom.attr('offsetTop'); 
 
    var bottomLeft = $divBottom.attr('offsetLeft'); 
 
    var bottomWidth = $divBottom.css('width'); 
 
    var bottomHeight = $divBottom.css('height'); 
 
    $divOverlay.css('top', bottomTop); 
 
    $divOverlay.css('left', bottomLeft); 
 
    $divOverlay.css('width', bottomWidth); 
 
    $divOverlay.css('height', bottomHeight); 
 

 
    $('#info').text('Top: ' + bottomTop + ' Left: ' + bottomLeft); 
 
    }); 
 
});
#rowBottom { outline:red solid 2px } 
 
#divBottom { margin:1em; font-size:xx-large; position:relative; } 
 
#divOverlay { background-color:Silver; text-align:center; position:absolute; z-index:10000; opacity:0.5; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<html> 
 
    <head> 
 
    <title>Overlay Tests</title> 
 
    </head> 
 
    <body> 
 
    <p align="center"><a id="lnkDoIt" href="#">Do it!</a></p> 
 
    <table width="100%" border="0" cellpadding="10" cellspacing="3" style="position:relative"> 
 
     <tr> 
 
     <td><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p></td> 
 
     </tr> 
 
     <tr id="rowBottom"> 
 
     <td><div id="divBottom"><p align="center">This is the bottom text</p></div></td> 
 
     </tr> 
 
     <tr> 
 
     <td><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p></td> 
 
     </tr> 
 
    </table> 
 
    <div id="divOverlay" style=""><p>This is the overlay div.</p><p id="info"></p></div> 
 
    </body> 
 
</html>

Odpowiedz

30

Musisz zrobić div nakładki mieć absolutną pozycję. Również użyć pozycję() metoda jQuery dla najlepszych i pozostawionych pozycjach rzędu - oto brakujące kawałki:

 
var rowPos = $divBottom.position(); 
bottomTop = rowPos.top; 
bottomLeft = rowPos.left; 

// 
$divOverlay.css({ 
    position: 'absolute', 
    top: bottomTop, 
    left: bottomLeft, 
    width: bottomWidth, 
    height: bottomHeight 
}); 
+0

Jego nadmiernie już podniósł „position: absolute” ze swojego arkusza stylów. Jednak masz rację co do używania "pos()". – Pointy

+1

Wygląda na to, że można to zrobić ... z jedną zmianą: var rowPos = $ divBottom.pos(); powinien być var rowPos = $ divBottom.offset(); .offset() to góra/lewo w dokumencie. – slolife

+5

jquery nie ma funkcji o nazwie "pos". Poprawna składnia to $ divBottom.position(); –

13

Producent:

div style="position:absolute" 

td style="position:relative;display:block" 

i nie trzeba jQuery.

+0

Jak wybrać jeden określony wiersz tabeli spośród setek? – koppor

+1

+1 To znacznie prostsze rozwiązanie, które zadziałało u mnie. Użyłem klasy: 'td {position: relative; Blok wyświetlacza;} .overlay {position: absolute; white-space: nowrap; Z-Index: 1000;} ', a następnie stosuje się klasę, do pierwszej komórki: ' długi blok tekstu B' – Roberto

+0

PS - IE <8 pozycja względna musi również być stosowane do TR. – Roberto

0

Upewnij się również, że właściwość przepełnienia elementów zewnętrznych (w tym przypadku tabeli) nie jest ukryta. Przy ukrytym ustawieniu na przepełnieniu, nie będzie wyświetlana żadna nakładka!

0

Uzyskiwanie wysokości i szerokości obiektu prostego. Najtrudniejsze dla mnie było współrzędne górnego i lewego dla bezwzględnego pozycjonowania.

Jest to jedyny scenariusz, jaki kiedykolwiek pracował niezawodnie dla mnie:

function posY(ctl) 
{ 
    var pos = ctl.offsetHeight; 
    while(ctl != null){ 
     pos += ctl.offsetTop; 

     ctl = ctl.offsetParent; 
    } 

    return pos; 
} 
function posX(ctl) 
{ 
    var pos = 0; 
    while(ctl != null){ 
     pos += ctl.offsetLeft; 

     ctl = ctl.offsetParent; 
    } 

    return pos; 

} 
0

ten powinien zrobić:

var bottomTop = $divBottom.offset().top; 
var bottomLeft = $divBottom.offset().left;