先放兩張效果圖。


前兩天在微信公眾號JavaScript里看到一篇文章 --- 《利用CSS變量實現令人震驚的懸浮效果》,覺得好好看好好玩,就自己動手寫了一下。
頁面DOM。
1 <div class="button"><span>Hover me I'm awesome</span></div>
鼠標懸停動效,顧名思義,跟鼠標是有很大關系的。首先,我們得 知道鼠標的位置。
1 document.querySelector('.button').onmousemove = (e) => { 2 const x = e.pageX - e.target.offsetLeft; 3 const y = e.pageY - e.target.offsetTop; 4 e.target.style.setProperty('--x', `${ x }px`); 5 e.target.style.setProperty('--y', `${ y }px`); 6 }
1、監聽元素的鼠標移動事件;
2、計算鼠標相對元素的位置;
3、將鼠標位置存入css變量中(--x,--y)。
利用css實現動效
1 .button{ 2 position: relative; 3 appearance: none; 4 background: #fe1251; 5 padding: 1em 2em; 6 border: none; 7 color: white; 8 font-size: 1.2em; 9 cursor: pointer; 10 outline: none; 11 overflow: hidden; 12 border-radius: 100px; 13 transition: all .15s ease,transform .2s ease-in-out; 14 } 15 .button >span{ 16 position: relative; 17 pointer-events: none; 18 /*文字禁止選中*/ 19 -webkit-user-select: none; 20 } 21 .button::before { 22 --size: 0; 23 content: ' '; 24 position: absolute; 25 left: var(--x); 26 top: var(--y); 27 width: var(--size); 28 height: var(--size); 29 background: radial-gradient(circle closest-side, #402bf2, transparent); 30 transform: translate(-50%, -50%); 31 transition: width .2s ease, height .2s ease; 32 } 33 .button:hover::before { 34 --size: 400px; 35 } 36 .button:hover{ 37 box-shadow: 0 5px 45px rgba(0,0,0,.4); 38 transform: scale(1.03); 39 }
好啦,圖一炫酷的動畫效果出現啦~~~
圖二是用 css3 transform 的3D效果實現的。主要css代碼是
transform: rotateX(var(--y)) rotateY(var(--x)) translateZ(var(--z));
需注意的是使用 translateZ 或其它css 3D效果,需要為3D元素的父容器設置perspective屬性,用來指定視距。
css3 3D transform變換 可以看看https://www.zhangxinxu.com/wordpress/2012/09/css3-3d-transform-perspective-animate-transition/
