didi
didi

Reputation: 287

Make element follows cursor position even while scrolling

I would like an element to follow the cursor position with its center. The code works as long as there is no scrolling. Once the page gets scrolled, the element "jumps away" on mouse move. Can anybody help me?

https://jsfiddle.net/L7qshr4z/3/

 $(document).bind('mousemove', function(e){
   $("div").css({
     top: e.pageY - $("div").height()/2, // just minus by half the height
     left:  e.pageX - $("div").width()/2 // just minus by half the width
   });
 });

Upvotes: 1

Views: 130

Answers (1)

Rory McCrossan
Rory McCrossan

Reputation: 337570

Instead of pageX and pageY, which are calculated based on the top/left of the document, use clientX and clientY, which are calculated on the top/left of the browser chrome.

In addition, note that updating the DOM within event handlers which fire very rapidly, such as scroll and mousemove, can lead to slow performance and stuttering in the UI. As such you need to take care to make sure the code is as performant as possible. In this case you can cache the div holding the cursor outside of the event handler so that you are not accessing the DOM every time the event fires. Similarly, you can also cache the cursor width and height, assuming it's not dynamically updated.

Finally, use on() instead of bind() as the latter has been deprecated for a long time, and will be removed from the latest versions of jQuery.

let $cursor = $('.cursor');
let cHeight = $cursor.height() / 2;
let cWidth = $cursor.width() / 2;

$(document).on('mousemove', function(e) {
  $cursor.css({
    top: e.clientY - cHeight,
    left: e.clientX - cWidth
  });
});
body {
  cursor: none;
}

p {
  width: 500px;
  line-height: 1.5em;
}

div {
  position: fixed;
  top: 50px;
  left: 50px;
  padding: 5px;
  background: #eae2e2;
  pointer-events: none;
  mix-blend-mode: difference;
  z-index: 999999 !important;
  font-size: 2.0em;
  color: #141313;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata
  sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
  Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos
  et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla
  facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut
  laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie
  consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue
  nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud
  exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo
  duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed
  diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore
  dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur.</p>

<div class="cursor">cursor</div>

With all that said, it should also be noted that it's possible to set a custom cursor using CSS alone, if that meets your needs: https://css-tricks.com/using-css-cursors/#using-a-custom-cursor-to-enhance-an-element

Upvotes: 1

Related Questions