穿墙效果及注释

穿墙效果附加注释,附加鼠标进入方向算法

<!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>

原文地址:https://www.cnblogs.com/hss-blog/p/9040431.html

时间: 2024-11-16 20:58:02

穿墙效果及注释的相关文章

穿墙效果

1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>无标题文档</title> 6 <style> 7 <style> 8 *{ 9 margin: 0; 10 padding: 0; 11 list-style: none; 12 } 13 #ul1{ 14 width: 880px; 15 margi

JS实现穿墙效果(判断鼠标划入划出的方向)

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>判断鼠标移入移出方向</title> <style type="text/css"> * { margin: 0; padding: 0; } .outer { width: 400px; height: 400px; bor

Visual Studio 代码格式化插件(等号自动对齐、注释自动对齐等)

1.下载地址 插件:Code alignment  下载地址 2.介绍 Based on principles borrowed from mathematics and other disciplines, code alignment gives extra meaning to your code by lining up similar data in columns. This is something we do naturally when working with tables

html、css和js注释的规范用法

成为专业的前端工程师!!! html注释: <!--注释内容--> css注释: //注释内容 单行注释(不推荐使用,因为有的浏览器可能不兼容,没有效果)/*注释内容*/ 多行注释(推荐使用) JavaScript: //注释内容 单行注释/*注释内容*/ 多行注释 总结: //注释内容 (在css或javascript中插入单行注释)/*注释内容*/ (在css或javascript中插入多行注释) 接下来是对注释在这几种代码中使用的位置,如何写注释进行总结一下.(根据个人的习惯可能不一样)

【iOS开发-45】Tom猫案例:动画、imageNamed与imageWithContentOfFile对内存影响、图片文件夹放哪儿以及文档注释

今天tom猫案例效果: (1)最傻最笨的办法: --所有的点击都是按钮,只不过有6个有图标的按钮,有些头部.左右脚.肚子.尾巴那块也是一个按钮,只不过没背景没文字没边框的按钮用户按不到而已. --这里的帧动画核心是UIImageView对象的一个属性animationImages,这个属性里面是以数组形式存放的图片.当然还有个重要的方法startAnimating用来播放前面那个属性里面的图片,就形成动画.再当然一下,还有设置时间和播放次数的属性. 注意点: --我们一般把图片放在Images.

页面的注释

在网页中,除了以上这些基本标签外,还包含一种不显示在页面中的元素,那就是代码的注释文字.适当的注释可以帮助用户更好地了解网页中各个模块的划分,也有助于以后对代码的检查和修改.给代码加注释,是一种很好的编程习惯.在HTML5文档中,注释分为三类:在文件开始标签<html></html>中的注释.在CSS层叠样式表中的注释和在JavaScirpt中的注释,JavaScirpt中的注释有两种形式.下面将对这三类注释的具体语法进行介绍在文件开始标签<html></html

安全之路 —— 利用远程线程注入的方法(使用DLL)实现穿墙与隐藏进程

简介 大多数后门或病毒要想初步实现隐藏进程,即不被像任务管理器这样典型的RING3级进程管理器找到过于明显的不明进程,其中比较著名的方法就是通过远程线程注入的方法注入将恶意进程的DLL文件注入系统认可的正常进程,你会发现任务管理器以及找不到独立出现的恶意进程项了.反向连接型后门采用这种技术,注入防火墙认可的进程(例如大部分系统进程,像explorer.exe就很常见)还能够获得一定的穿墙效果. 进程注入虽然已经是将近10年前的技术了,但是今天出现的很多新型黑客技术大多数还是基于这类老技术演变而来

PYTHON学习0003:用户交互和注释----2019-6-4

Python注释多行的方法有以下三种:1.使用ctrl+/实现多行注释:首先先选中要注释的段落,然后按下ctrl+/,即可实现多行代码的注释.再一次按下ctrl+/就可以取消注释2.在每一行的开头使用shift+#键:跟注释单行一样在每一行前面输入shift+#3.输入''' '''或者""" """,将要注释的代码插在中间:可以输入''' '''或者""" """,将要注释的代码插在中

XSS代码合集(含测试效果详细版)-HTML4与更早版本的向量1

HTML4与更早版本的向量 通过<FRAMESET>和onload执行JavaScript 这个经典的向量表明,有几个标记不需要“src”属性来触发onload事件,例如<IFRAME>.<BODY>和<FRAMESET>. <frameset onload=alert(1)> 适用浏览器与版本 测试效果 通过<TABLE>和后台执行JavaScript Opera 8-10.5+和Internet Explorer 6支持javas