Uzyskaj dolną i prawą pozycję elementu

82

Próbuję uzyskać pozycję elementu w oknie w następujący sposób:

var link = $(element);

var offset = link.offset();
var top = offset.top;
var left = offset.left;
var bottom = $(window).height() - link.height();
bottom = offset.top - bottom;
var right = $(window).width() - link.width();
right = offset.left - right;

Jednak dół i prawo mają -przed sobą ... Dlaczego tak jest? ponieważ liczby są poprawne, po prostu NIE powinny być minusami.

Cameron
źródło

Odpowiedzi:

95

Zamiast

var bottom = $(window).height() - link.height();
bottom = offset.top - bottom;

Dlaczego nie robisz

var bottom = $(window).height() - top - link.height();

Edycja: Twoim błędem jest to, że robisz

bottom = offset.top - bottom;

zamiast

bottom = bottom - offset.top; // or bottom -= offset.top;
Mordhak
źródło
36
var link = $ (element);
var offset = link.offset ();

var top = offset.top;
var left = offset.left;

var bottom = top + link.outerHeight ();
var right = left + link.outerWidth ();
Damian
źródło
7
// Returns bottom offset value + or - from viewport top
function offsetBottom(el, i) { i = i || 0; return $(el)[i].getBoundingClientRect().bottom }

// Returns right offset value
function offsetRight(el, i) { i = i || 0; return $(el)[i].getBoundingClientRect().right }

var bottom = offsetBottom('#logo');
var right = offsetRight('#logo');

Pozwoli to znaleźć odległość od górnej i lewej strony rzutni do dokładnej krawędzi elementu i nic poza tym. Powiedzmy, że Twoje logo miało 350 pikseli i miał lewy margines 50 pikseli, a zmienna „prawo” będzie miała wartość 400, ponieważ jest to rzeczywista odległość w pikselach, jaką zajęło dotarcie do krawędzi elementu, bez względu na to, czy masz większe wypełnienie lub margines po prawej stronie.

Jeśli właściwość CSS określająca rozmiar pudełka jest ustawiona na border-box, będzie nadal działać tak, jakby była ustawiona jako domyślne pole zawartości.

Kerry Johnson
źródło
1
Najlepsza odpowiedź dla mnie!
geoyws
3

Można użyć .position () dla tego

var link = $(element);
var position = link.position(); //cache the position
var right = $(window).width() - position.left - link.width();
var bottom = $(window).height() - position.top - link.height();
Starx
źródło
4
W doc jQuery nie ma odniesienia do atrybutu „right” w obiekcie wynikowym dla position (). Doc tutaj
Mordhak
4
Tak, ale powinno być przesunięte zamiast pozycji, przesunięcie jest w górę / w lewo w zależności od dokumentu, pozycja odnosi się do rodzica.
Mordhak
@Mordhak, tak, ale jak widać używam windows.width()i podobnych do dalszych obliczeń.
Starx
1
uważaj na pozycję. Nie liczy marginesu, jeśli jest obecny
Andrea_86
1

Myślę

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

<div>Testing</div>
<div id="result" style="margin:1em 4em; background:rgb(200,200,255); height:500px"></div>
<div style="background:rgb(200,255,200); height:3000px; width:5000px;"></div>

<script>
(function(){
    var link=$("#result");

    var top = link.offset().top; // position from $(document).offset().top
    var bottom = top + link.height(); // position from $(document).offset().top

    var left = link.offset().left; // position from $(document).offset().left
    var right = left + link.width(); // position from $(document).offset().left

    var bottomFromBottom = $(document).height() - bottom;
    // distance from document's bottom
    var rightFromRight = $(document).width() - right;
    // distance from document's right

    var str="";
    str+="top: "+top+"<br>";
    str+="bottom: "+bottom+"<br>";
    str+="left: "+left+"<br>";
    str+="right: "+right+"<br>";
    str+="bottomFromBottom: "+bottomFromBottom+"<br>";
    str+="rightFromRight: "+rightFromRight+"<br>";
    link.html(str);
})();
</script>

Rezultatem są

top: 44
bottom: 544
left: 72
right: 1277
bottomFromBottom: 3068
rightFromRight: 3731

w mojej przeglądarce Chrome.

Gdy dokument jest przewijalny, $(window).height()zwraca wysokość okna przeglądarki, a nie szerokość dokumentu, którego niektóre części są ukryte w przewijaniu. Zobacz http://api.jquery.com/height/ .

kipid
źródło
1

Oto funkcja jquery, która zwraca obiekt dowolnej klasy lub identyfikatora na stronie

var elementPosition = function(idClass) {
            var element = $(idClass);
            var offset = element.offset();

            return {
                'top': offset.top,
                'right': offset.left + element.outerWidth(),
                'bottom': offset.top + element.outerHeight(),
                'left': offset.left,
            };
        };


        console.log(elementPosition('#my-class-or-id'));
purencool
źródło
0

Odpowiedź Vanilla Javascript

var c = document.getElementById("myElement").getBoundingClientRect();
var bot = c.bottom;
var rgt = c.right;

Aby było jasne, element może być wszystkim, pod warunkiem, że przypisałeś mu identyfikator <img> <div> <p>itp.

na przykład

<img
    id='myElement'
    src='/img/logout.png'
    className='logoutImg img-button'
    alt='Logout'
/>
Nelles
źródło