2009-06-15 21 views
7

Mam następujący fragment kodu HTML:Lewy przesunięcie elementu liniowego przy użyciu jQuery

<div><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor 
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud 
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in 
reprehenderit in voluptate velit <strong id="s">esse cillum dolore eu fugiat nulla pariatur. 
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</strong></p></div> 

Szerokość DIV jest ustawiona na 600px za pomocą CSS. Teraz chcę znaleźć offset(). Po lewej stronie elementu <strong>. Więc zrobiłem:

alert($("#s").offset().left); 

Jednak nie wydaje się, aby wytworzyć odpowiednią wartość, jak można wyraźnie zobaczyć silny element widać półmetku szerokość 600px, ale wartość przesunięcia mogę to tylko 8 pikseli.

Jak znaleźć offset(). Lewa wartość wbudowanego silnego elementu?

Odpowiedz

24

Oto co się dzieje:

Diagram

Ponieważ element inline obejmuje wiele linii jQuery daje lewy-większość położenie tego elementu, nie przesunięcie początku element.

Aby obejść ten problem, spróbuj tej wtyczki:

jQuery.fn.inlineOffset = function() { 
    var el = $('<i/>').css('display','inline').insertBefore(this[0]); 
    var pos = el.offset(); 
    el.remove(); 
    return pos; 
}; 

Wtyczka utworzy tymczasowy element i wstawić go tuż przed elementu docelowego - będzie następnie powrócić przesunięcie tego elementu czasowego.

Przykład użycia:

alert(jQuery('strong').inlineOffset().left); 
+0

Optymalizacja (podrzędna): 1. var pos = el.offset(); 2. el.remove(); 3: powrót pos; Zamiast dwukrotnie wywoływać funkcję offset() i tworzyć nowy obiekt do zwrócenia. – PatrikAkerstrand

+0

Dzięki Machine, po prostu go zmieniono :) – James

+0

Najlepsza odpowiedź, jaką kiedykolwiek widziałem. Dobra robota, J-P! –

0

Powodem są coraz wynik 8PX dlatego chociaż element rozpoczyna się w połowie drogi przez kontenera, ponieważ istnieje linia złamać jego lewa krawędź jest 8 pikseli w od strona.

Mam jedno z tych odczuć, że prawdopodobnie jest o wiele lepszy sposób na zrobienie tego niż to, ale pierwszą rzeczą, o której mógłbym pomyśleć, aby obejść ten problem, jest wstawienie kolejnego elementu tuż przed <strong> i sprawdzenie jego położenia:

$("<span><span>").insertBefore($('#s')).offset(); 
Powiązane problemy