Custom Mouse Cursor Effect in Elementor

Custom Mouse Cursor Effect in Elementor

A custom mouse cursor adds a distinctive, modern touch to your website and makes the experience feel more interactive. This tutorial shows how to create a custom cursor effect in Elementor with a little CSS and JavaScript. Copy the code, adjust the size and color, and give your site a unique feel.

Custom Mouse Cursor CSS

				
					<style>
	
	.notCursor {
    cursor: none;
  }
  .notCursor * {
    cursor: none;
  }
  #kursorWrapper {
    position: fixed;
    z-index: 99;
    overflow: hidden;
    pointer-events: none;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    overflow: hidden;
  }
  div[class*='kursor'] {
    position: fixed;
    pointer-events: none;
    transform: translate(-50%, -50%);
    z-index: 10000;
  }
  div[class*='kursor'].kursor--hidden {
    opacity: 0;
    width: 0px;
    height: 0px;
  }
  div[class*='kursor'].kursor--1 {
    left: 0px;
    top: 0px;
    width: 25px;
    height: 25px;
    border-radius: 50%;
    border: 2px solid rgba(var(--k-color), 1);
    transition: all 0.2s ease, top 0.18s ease-out, left 0.18s ease-out;
  }
  div[class*='kursor'].kursor--1 + .kursorChild {
    display: block;
    width: 4px;
    height: 4px;
    background: rgba(var(--k-color), 1);
    border-radius: 50%;
    transition: all 0.2s ease, top 0s ease-out, left 0s ease-out;
  }
  div[class*='kursor'].kursor--1.--hover {
    width: 40px;
    height: 40px;
    border: 2px solid rgba(var(--k-color), 0);
    background: rgba(var(--k-color), 0.1);
  }
  div[class*='kursor'].kursor--1.--hover + .kursorChild {
    background: rgba(var(--k-color), 0.3);
  }
  div[class*='kursor'].kursor--1.kursor--down {
    width: 20px;
    height: 20px;
  }
  div[class*='kursor'].kursor--1.kursor--down + .kursorChild:after {
    width: 40px !important;
    height: 40px !important;
    opacity: 0;
    border: 1px solid;
    border-radius: 50%;
    border-color: rgba(var(--k-color), 1);
    transition: all 0.4s ease;
  }
  div[class*='kursor'].kursor--2 {
    left: 0px;
    top: 0px;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background: rgba(var(--k-color), 1);
    transition: all 0.2s ease, top 0.1s ease-out, left 0.1s ease-out;
  }
  div[class*='kursor'].kursor--2 + .kursorChild {
    display: block;
    width: 4px;
    height: 4px;
    background: rgba(var(--k-color), 1);
    border-radius: 50%;
    transition: all 0.2s ease, top 0.2s ease-out, left 0.2s ease-out;
  }
  div[class*='kursor'].kursor--2.--hover {
    width: 40px;
    height: 40px;
    background: rgba(var(--k-color), 0.1);
  }
  div[class*='kursor'].kursor--2.--hover + .kursorChild {
    background: rgba(var(--k-color), 0.3);
  }
  div[class*='kursor'].kursor--2.kursor--down {
    width: 10px;
    height: 10px;
  }
  div[class*='kursor'].kursor--2.kursor--down + .kursorChild:after {
    width: 40px !important;
    height: 40px !important;
    opacity: 0;
    border: 1px solid;
    border-radius: 50%;
    border-color: rgba(var(--k-color), 1);
    transition: all 0.4s ease;
  }
  div[class*='kursor'].kursor--3 {
    left: 0px;
    top: 0px;
    width: 20px;
    height: 20px;
    border: 1px solid rgba(var(--k-color), 1);
    transition: all 0.2s ease, top 0.05s ease-out, left 0.05s ease-out;
  }
  div[class*='kursor'].kursor--3 + .kursorChild {
    display: block;
    width: 4px;
    height: 4px;
    background: rgba(var(--k-color), 1);
    transition: all 0.2s ease, top 0.2s ease-out, left 0.2s ease-out;
  }
  div[class*='kursor'].kursor--3.--hover {
    width: 40px;
    height: 40px;
    background: rgba(var(--k-color), 0.1);
    border: 1px solid rgba(var(--k-color), 0);
  }
  div[class*='kursor'].kursor--3.--hover + .kursorChild {
    background: rgba(var(--k-color), 0.3);
  }
  div[class*='kursor'].kursor--3.kursor--down {
    width: 5px;
    height: 5px;
    border: 1px solid rgba(var(--k-color), 0);
  }
  div[class*='kursor'].kursor--3.kursor--down + .kursorChild {
    width: 10px;
    height: 10px;
  }
  div[class*='kursor'].kursor--3.kursor--down + .kursorChild:after {
    width: 40px !important;
    height: 40px !important;
    opacity: 0;
    border: 1px solid;
    border-color: rgba(var(--k-color), 1);
    transition: all 0.4s ease;
  }
  div[class*='kursor'].kursor--4 {
    left: 0px;
    top: 0px;
    width: 50px;
    height: 50px;
    border: 1px solid rgba(var(--k-color), 0.3);
    border-radius: 50%;
    transition: all 0.2s ease, top 0.2s ease-out, left 0.2s ease-out;
  }
  div[class*='kursor'].kursor--4 + .kursorChild {
    display: block;
    width: 6px;
    height: 6px;
    background: rgba(var(--k-color), 1);
    border-radius: 50%;
    transition: all 0.2s ease, top 0.03s ease-out, left 0.03s ease-out;
  }
  div[class*='kursor'].kursor--4.--hover {
    width: 30px;
    height: 30px;
    background: rgba(var(--k-color), 0.1);
    border: 3px solid rgba(var(--k-color), 0);
  }
  div[class*='kursor'].kursor--4.--hover + .kursorChild {
    width: 25px;
    height: 25px;
    background: rgba(var(--k-color), 0.1);
  }
  div[class*='kursor'].kursor--4.kursor--down {
    width: 5px;
    height: 5px;
  }
  div[class*='kursor'].kursor--4.kursor--down + .kursorChild {
    width: 10px;
    height: 10px;
  }
  div[class*='kursor'].kursor--4.kursor--down + .kursorChild:after {
    width: 40px !important;
    height: 40px !important;
    opacity: 0;
    border-radius: 50%;
    border: 1px solid;
    border-color: rgba(var(--k-color), 1);
    transition: all 0.4s ease;
  }
  div[class*='kursor'].kursor--5 {
    left: 0px;
    top: 0px;
    width: 10px;
    height: 10px;
    border: 1px solid rgba(var(--k-color), 0.5);
    border-radius: 50%;
    transition: all 0.2s ease, top 0.2s ease-out, left 0.2s ease-out;
  }
  div[class*='kursor'].kursor--5.--hover {
    width: 26px;
    height: 26px;
    background: rgba(var(--k-color), 0.1);
    border: 3px solid rgba(var(--k-color), 0);
  }
  div[class*='kursor'].kursor--5.kursor--down {
    width: 15px;
    height: 15px;
  }
  div[class*='kursorChild'] {
    position: fixed;
    pointer-events: none;
    transform: translate(-50%, -50%);
    display: none;
    overflow: hidden;
  }
  div[class*='kursorChild'].kursorChild[class*='--hidden'] {
    opacity: 0;
    width: 0px;
    height: 0px;
  }
  div[class*='kursorChild'].kursorChild:after {
    content: '';
    pointer-events: none;
    width: 0px;
    height: 0px;
    position: absolute;
    left: 50%;
    top: 50%;
    opacity: 1;
    border: 0px solid rgba(var(--k-color), 0.5);
    transform: translate(-50%, -50%);
  }
  .kursor--absolute {
    position: absolute !important;
    z-index: 2000;
  }
  @media screen and (max-width: 768px) {
    .notCursor * {
      cursor: auto;
    }
    div[class*='kursor'] {
      display: none !important;
    }
    div[class*='kursorChild'] {
      display: none !important;
    }
  }
  @media screen and (max-width: 812px) and (max-height: 430px) and (orientation: landscape) {
    div[class*='kursor'] {
      display: none !important;
    }
    div[class*='kursorChild'] {
      display: none !important;
    }
    .notCursor * {
      cursor: auto;
    }
  }
</style>
				
			

Custom Mouse Cursor JS

				
					<script src="https://unpkg.com/kursor" data-rocket-defer defer></script>
<script>
new kursor({
type: 1,
color: '#000000',
removeDefaultCursor: false,
})
</script>
				
			

How it works

A small element follows the mouse position using JavaScript, replacing or trailing the default pointer. CSS controls its shape, size, blend mode, and how it reacts on hover over links and buttons. Because it tracks pointer coordinates directly, the movement stays fluid.

Tips and customization

  • Change the cursor size and color to match your theme.
  • Add a grow effect when hovering over links.
  • Use mix blend mode for a striking inverted look.

FAQ

Does it work on mobile?
Custom cursors are a desktop feature, since touch devices have no pointer. It simply does nothing on mobile.

Does it need a plugin?
No. A short script and some CSS are enough.

Leave a Reply

Your email address will not be published. Required fields are marked *

Latest tutorials

Elementor vs Bricks compared — performance, ease of use, design flexibility, ecosystem, and pricing —...
Build a smooth 3D flip card in Elementor with pure CSS — no plugin, no...
Add a glowing, moving gradient border to any Elementor container or button using pure CSS...
Freelancer Mojibur
freelancer mojibur

Start a Project!

Interested in working together? Send a quick message or schedule a meeting. Ask questions, discuss details, and decide if we are a good fit.

Website Project Inquiry

This form helps me get a general idea. We’ll schedule a meeting soon to discuss everything in more detail!

Freelancer Mojibur

Contact person

For quick communication email at: freelancermojibur@gmail.com