1. 程式人生 > >穿墻效果及註釋

穿墻效果及註釋

linear AR style body title asi 定義 sna parse

穿墻效果附加註釋,附加鼠標進入方向算法

技術分享圖片

<!doctype html>
<html>

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
    * {
        margin: 0;
        padding: 0;
        list-style: none;
    }

    ul {
        overflow: hidden;
        width: 630px;
        margin: 100px auto;
    }

    ul li {
        
float: left; position: relative; width: 200px; height: 200px; background: #ccc; margin: 5px; overflow: hidden; } ul li span { position: absolute; width: 100%; height: 100%; background: rgba(255, 0, 0, 0.3); left: -200px; top:
0; } </style> <script> function getStyle(obj, sName) { // 獲取元素對象的css屬性值兼容ie和其他瀏覽器 return (obj.currentStyle || getComputedStyle(obj, false))[sName]; } function move(obj, json, options) { // obj 為元素對象、json為設定最後結果對象、options為設置對象 // 給options設定默認值
options = options || {}; // 設定持續時間 options.duration = options.duration || 700; // 設定運動方式 options.easing = options.easing || ‘ease-out‘; // 定義空對象 var start = {}; // 定義差值對象 var dis = {}; // 遍歷設定設定最後結果對象 for (var name in json) { // 將設定最後結果對象中的屬性值與初始值取差值 start[name] = parseFloat(getStyle(obj, name) ); dis[name] = json[name] - start[name]; } // 下方每30毫秒執行一次運動,這裏獲取運動總次數 var count = Math.floor(options.duration / 30); // 設定運動初始次數 var n = 0; // 清空間歇調用,如果以前定義過則清除動畫次數 clearInterval(obj.timer); // 用obj.timer來代替動畫次數 obj.timer = setInterval(function() { n++; for (var name in json) { switch (options.easing) { case ‘linear‘: var cur = start[name] + dis[name] * n / count; break; case ‘ease-in‘: var a = n / count; var cur = start[name] + dis[name] * Math.pow(a, 3); break; // 次數默認使用ease-out case ‘ease-out‘: var a = 1 - n / count; // cur為每次運動後的元素的落腳位置 var cur = start[name] + dis[name] * (1 - Math.pow(a, 3)); break; } if (name == ‘opacity‘) { obj.style.opacity = cur; obj.style.filter = ‘alpha(opacity:‘ + cur * 100 + ‘)‘; } else { obj.style[name] = cur + ‘px‘; } } // 如果運動完成,則清除運動(obj.timer) if (n == count) { // 清除動畫次數 clearInterval(obj.timer); // 回調函數 options.complete && options.complete(); } }, 30); } function a2d(n) { // n 為弧度 ;弧度轉化為角度 return n * 180 / Math.PI; } function hoverDir(ev, obj) { // 領邊長度 var a = ev.clientX - obj.offsetLeft - obj.offsetWidth / 2; // 對邊長度 var b = obj.offsetTop + obj.offsetHeight / 2 - ev.clientY; // 通過角度來獲得鼠標進入的方向;0為左側、 1為下 、2為右、 3為上 // Math.atan2(b, a)為獲取弧度公式 // a2d(n)為獲取角度公式 return Math.round((a2d(Math.atan2(b, a)) + 180) / 90) % 4; } function through(obj) { var oS = obj.children[0]; //這個是li裏面的span // 鼠標進入的時候 obj.onmouseenter = function(ev) { // 如果不知道ev是啥 就打印出來看看 console.log(ev) // 兼容ie瀏覽器 var oEvent = ev || event; // obj為li,將oEvent和 li 作為參數,dir為返回值代表著鼠標的進入方向 var dir = hoverDir(oEvent, obj); switch (dir) { case 0: //左,oS為li中的 span oS.style.left = ‘-200px‘; oS.style.top = 0; break; case 1: // oS.style.left = 0; oS.style.top = ‘200px‘; break; case 2: // oS.style.left = ‘200px‘; oS.style.top = 0; break; case 3: // oS.style.left = 0; oS.style.top = ‘-200px‘; break; } //oS是li裏面的span,設置運動 // move(obj, json, options) obj = oS 、 json = { left: 0, top: 0 }、options取默認值,並且沒有回調函數 move(oS, { left: 0, top: 0 }); }; // 鼠標離開時 obj.onmouseleave = function(ev) { var oEvent = ev || event; var dir = hoverDir(oEvent, obj); switch (dir) { case 0: // move(obj, json, options) obj = oS 、 json = { left: -200, top: 0 }、options取默認值,並且沒有回調函數 move(oS, { left: -200, top: 0 }); break; case 1: move(oS, { left: 0, top: 200 }); break; case 2: move(oS, { left: 200, top: 0 }); break; case 3: move(oS, { left: 0, top: -200 }); break; } }; } window.onload = function() { var aLi = document.getElementsByTagName(‘li‘); for (var i = 0; i < aLi.length; i++) { through(aLi[i]); } }; </script> </head> <body> <ul> <li><span></span></li> <li><span></span></li> <li><span></span></li> <li><span></span></li> <li><span></span></li> <li><span></span></li> </ul> </body> </html>

穿墻效果及註釋