proximity hover micro-interactions (Apple-style) in pure JS
- global script: copy
src/magnetic-hover.jsand import it via<script> - ESM: import the module directly into your app
html:
<buttonclass="btn" data-magnetic>Button</button>js (global):
<scriptsrc="src/magnetic-hover.js"></script><script>const{ initMagneticHover }=window.MagneticHoverBundle;initMagneticHover();</script>js (module):
import{MagneticHover,initMagneticHover}from'./src/magnetic-hover.js';constmh=initMagneticHover({maxMovement: 12,strength: 2});{selectors: ['.nav-link','.spa-link','.btn','[data-magnetic]'],proximityRadius: 80,// pxmaxMovement: 12,// pxstrength: 2,// 0-∞enabled: true}initMagneticHover(options)→ global instance (unique)instance.enable()/instance.disable()instance.configure(opts)instance.findElements()→ rescans the DOMinstance.destroy()
- respects
prefers-reduced-motion→ effect auto-disabled - disable via
.no-magneticclass,[data-magnetic="false"]attribute, orlocalStorageif you implement your own toggle
examples/basic.htmlexamples/custom-selectors.htmlexamples/reduced-motion.html
MIT