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:
<button class="btn" data-magnetic>Button</button>js (global):
<script src="src/magnetic-hover.js"></script>
<script>
const { initMagneticHover } = window.MagneticHoverBundle;
initMagneticHover();
</script>js (module):
import { MagneticHover, initMagneticHover } from './src/magnetic-hover.js';
const mh = initMagneticHover({ maxMovement: 12, strength: 2 });{
selectors: ['.nav-link', '.spa-link', '.btn', '[data-magnetic]'],
proximityRadius: 80, // px
maxMovement: 12, // px
strength: 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