• 原生javascript封装的函数


    1.javascript 加载的函数

    window.onload = function(){}

    2.封装的id函数

        function $(id) {
            return document.getElementById(id);
        }
        
        //调用 $("id")

    3.封装的数组id

        function $arr(array) {
            return document.getElementsByTagName(array);
        }
        
        //调用 $arr("数组")

    4.自定义平均值函数

        function avg(array) {
            var sum = 0;
            var len = array.length;
            for (var i = 0; i < len; i++) {
                sum += array[i];
            }
            return sum / len;
        }

    5.全选取消

        function all(flag) {
            for (var i = 0; i < inputs.length; i++) {
                inputs[i].checked = flag;
            }
        }

    6.封装的类函数

    //【主流浏览器(谷歌,火狐,IE9以上的包括IE9)都支持document.getElementsByClassName()函数,IE678不支持】
    
        function getClass(classname, id) {
    //                主流浏览器带id
            if (document.getElementsByClassName) {
                if (id) {
                    var eleId = document.getElementById(id);
                    return eleId.getElementsByClassName(classname);
                }
    //                不带id
                else {
                    return document.getElementsByClassName(classname);
                }
            }
    
    //                IE678浏览器 带id
            if (id) {
                var eleId = document.getElementById(id);
                var dom = eleId.getElementsByTagName("*");
            }
    //                不带id
            else {
                var dom = document.getElementsByTagName("*");
            }
            var arr = [];
            for (var i = 0; i < arr.length; i++) {
                var txtarr = dom[i].className.split(" ");
                for (var j = 0; j < txtarr.length; j++) {
                    if (txtarr.className == classname) {
                        arr.push(dom[j]);
                    }
                }
            }
        }

    7.显示函数

        function show(obj) {
            obj.style.display = "block";
        }
        
        //调用  show(id)

    8.隐藏函数

        function hide(obj) {
            obj.style.display = "none";
        }

    9.封装的id和类函数

        function getClass(classname, id) {
    //                主流浏览器带id
            if (document.getElementsByClassName) {
                if (id) {
                    var eleId = document.getElementById(id);
                    return eleId.getElementsByClassName(classname);
                }
    //                不带id
                else {
                    return document.getElementsByClassName(classname);
                }
            }
    
    //                IE678浏览器 带id
            if (id) {
                var eleId = document.getElementById(id);
                var dom = eleId.getElementsByTagName("*");
            }
    //                不带id
            else {
                var dom = document.getElementsByTagName("*");
            }
            var arr = [];
            for (var i = 0; i < arr.length; i++) {
                var txtarr = dom[i].className.split(" ");
                for (var j = 0; j < txtarr.length; j++) {
                    if (txtarr.className == classname) {
                        arr.push(dom[j]);
                    }
                }
            }
        }
    
        function $(str) {
            var s = str.charAt(0);
            var ss = str.substr(1);
            switch (s) {
                case "#":
                    return document.getElementById(ss);
                    break;
                case ".":
                    return getClass(ss);
                    break;
                default :
                    return document.getElementsByTagName(str);
            }
        }

    10.封装的scollTop函数

        function scroll() {
    //        支持IE9+ 和其他主流浏览器
            if (window.pageYOffset != null) {
                return {
                    left: window.pageXOffset,
                    top: window.pageYOffset
                }
            }
    //       声明了DTD
    //        检测是不是怪异模式的浏览器,就是没有声明<!DOCTYPE html>
            else if (document.compatMode == "CSS1Compat") {
                return {
    //               document.documentElement就是document.html的意思 ,但是没有documen.html写法,谷歌不支持这个
                    left: document.documentElement.scrollLeft,
                    top: document.documentElement.scrollTop
                }
            }
    //        剩下的肯定就是怪异模式的
            return {
                left: document.body.scrollLeft,
                top: document.body.scrollTop
            }
        }
    
        //    调用
        window.onscroll = function () {
    //        scroll().top 就是仿json的写法
            console.log(scorll().top);
        }

    11.封装的可视区域大小的函数

         function client() {
            if (window.innerWidth != null)  // ie9 +  最新浏览器
            {
                return {
                     window.innerWidth,
                    height: window.innerHeight
                }
            }
            else if (document.compatMode === "CSS1Compat")  // 标准浏览器
            {
                return {
                     document.documentElement.clientWidth,
                    height: document.documentElement.clientHeight
                }
            }
            return {   // 怪异浏览器
                 document.body.clientWidth,
                height: document.body.clientHeight
    
            }
        }

    12.阻止冒泡

    //事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发。这一过程被称为事件冒泡;这个事件从原始元素开始一直冒泡到DOM树的最上层。
    顺序
    IE 6.0: 
    div -> body -> html -> document
    其他浏览器: 
    div -> body -> html -> document -> window
    
    不是所有的事件都能冒泡。以下事件不冒泡:blur、focus、load、unload
    
    //阻止冒泡
    e ? e.stopPropagation() : window.event.cancelBubble = true;

    13.匀速动画

        function animate(obj, target) {
            clearInterval(obj.timer);  // 先清除定时器
            var speed = obj.offsetLeft < target ? 15 : -15;  // 用来判断 应该 +  还是 -
            obj.timer = setInterval(function () {
                var result = target - obj.offsetLeft; // 因为他们的差值不会超过5
                obj.style.left = obj.offsetLeft + speed + "px";
                if (Math.abs(result) <= 15)  // 如果差值不小于 5 说明到位置了
                {
                    clearInterval(obj.timer);
                    obj.style.left = target + "px";  // 有5像素差距   我们直接跳转目标位置
                }
            }, 10)
        }

    14.缓动动画

        function slowanimate(obj, target) {
            clearInterval(obj.timer);
    //        定义步长
            obj.timer = setInterval(function () {
                var step = (target - obj.offsetLeft) / 10;
                step = step > 0 ? Math.ceil(step) : Math.floor(step);
                obj.style.left = obj.offsetLeft + step + "px";
                if (target == obj.offsetLeft) {
                    clearInterval(obj.timer);
                }
            }, 30);
        }

    15.封装的获得CSS样式的函数

        function getStyle(obj, attr) {
    //        IE浏览器 所有IE
            if (obj.currentStyle) {
                return obj.currentStyle[attr];
            }
            else {
    //            w3c 浏览器
                return window.getComputedStyle(obj, null)[attr];
            }
        }
    
        //调用  getStyle(demo,"width")  注意:属性必须写引号

    16.封装运动框架的单个属性

        function slowanimate(obj, attr, target) {
    //                动画原理 盒子本身的样式 + 步长
            clearInterval(obj.timer);
            obj.timer = setInterval(function () {
                var current = parseInt(getStyle(obj, attr));
                var step = (target - current) / 10;
                step = step > 0 ? Math.ceil(step) : Math.floor(step);
                obj.style[attr] = current + step + "px";
                if (current == target) {
                    clearInterval(obj.timer);
                }
            }, 30);
        }

    17.封装运动框架的多个属性

        function slowanimate(obj, json) {
            clearInterval(obj.timer);
            obj.timer = setInterval(function () {
                for (var attr in json) {
                    var current = parseInt(getStyle(obj, attr));
                    var step = (json[attr] - current) / 10;
                    step = step > 0 ? Math.ceil(step) : Math.floor(step);
                    obj.style[attr] = current + step + "px";
                }
            }, 30);
        }

    18.封装运动框架的多个属性 带回调函数、透明度、层级

        function animate(obj, json, fn) {
            clearInterval(obj.timer);
            obj.timer = setInterval(function () {
                var flag = true;
                for (var attr in json) {
                    var current = 0;
                    if (attr == "opacity") {
                        current = Math.round(parseInt(getStyle(obj, attr) * 100)) || 0;
                    }
                    else {
                        current = parseInt(getStyle(obj, attr));
                    }
    
                    var step = (json[attr] - current) / 10;
                    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    //                判断透明度
                    if (attr == "opacity") {
    //                    主流浏览器
                        if ("opacity" in json) {
                            obj.style.opacity = (current + step) / 100;
                        }
    //                    IE浏览器
                        else {
                            obj.style.filter = "alpha(opacity = " + (current + step) * 10 + ")";
                        }
                    }
                    else if (attr == "zIndex") {
                        obj.style.zIndex = json[attr];
                    }
                    else {
                        obj.style[attr] = current + step + "px";
                    }
                    if (current != json[attr]) {
                        flag = false;
                    }
                }
                if (flag) {
                    clearInterval(obj.timer);
                    if (fn) {
                        fn();
                    }
                }
            }, 30);
        }
        
        
        //调用animate(box,{200,left:400,height:800,opacity:30,zIndex:3}, function () {}); 

    19.js原生手机滑动手势

        //返回角度
        function GetSlideAngle(dx, dy) {
            return Math.atan2(dy, dx) * 180 / Math.PI;
        }
    
        //根据起点和终点返回方向 1:向上,2:向下,3:向左,4:向右,0:未滑动
        function GetSlideDirection(startX, startY, endX, endY) {
            var dy = startY - endY;
            var dx = endX - startX;
            varresult = 0;
    
            //如果滑动距离太短
            if (Math.abs(dx) < 2 && Math.abs(dy) < 2) {
                return result;
            }
    
            var angle = GetSlideAngle(dx, dy);
            if (angle >= -45 && angle < 45) {
                result = 4;
            } else if (angle >= 45 && angle < 135) {
                result = 1;
            } else if (angle >= -135 && angle < -45) {
                result = 2;
            }
            else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {
                result = 3;
            }
    
            return result;

    20.检测字符长度(包含中英文)

       //如果直接用str.length  会把中文也按照一个字符来计算,可是一个中文应该占两个字符,所以封装这个函数
       
       function getStringLength(str) {
            // 存储字符的总长度
            var len = 0;
            // 存储每一个编码
            var c = 0;
            for (var i = 0; i < str.length; i++) {
                c = txt.charCodeAt(i);
                if (c >= 0 && c <= 127) {
                    len++;
                }
                else {
                    len += 2;
                }
            }
            // 返回字符长度
            return len;
        }

    21.自制滚动条

        //首先计算滚动条的高度
        // 动态计算滚动条的告诉  滚动条高度/容器的高度 = 容器的高度 / 内容的高度
        bar.style.height = box.offsetHeight * box.offsetHeight / content.offsetHeight + "px";
        //obj 滚动条  target 内容盒子
        function startScroll(obj, target) {
            obj.onmousedown = function (event) {
                var event = event || window.event;
                var y = event.clientY - this.offsetTop;
                var that = this;
                document.onmousemove = function (event) {
                    var event = event || window.event;
                    // 滚动条的的top
                    var barTop = event.clientY - y;
                    // 内容盒子的高度 = (大盒子高度-内容盒子的高度)/(滚动盒子的高度 - 滚动条的高度)* 滚动条的top值
                    var contentTop = (target.offsetHeight - target.parentNode.offsetHeight) / (target.parentNode.offsetHeight - that.offsetHeight) * barTop;
                    if (barTop <= 0) {
                        barTop = 0;
                    } else if (barTop >= target.parentNode.offsetHeight - that.offsetHeight) {
                        barTop = target.parentNode.offsetHeight - that.offsetHeight + "px";
                    } else {
                        target.style.top = -contentTop + "px";
                    }
                    that.style.top = barTop + "px";
                    window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();   // 防止拖动滑块的时候,选中文字
                }
            }
            document.onmouseup = function () {
                document.onmousemove = null;
            }
        }

    22.阶乘(递归算法)

        function factorial(i) {
            if (i > 1) {
                return factorial(i - 1) * i;
            } else {
                return 1;
            }
        }
    //调用  factorial(5)  5!

    23.倒计时

      function showTime(obj) {
            var box = document.querySelector(obj);
            var ms = new Date("2018/2/11").getTime()- new Date().getTime();
            var day = parseInt(ms/1000/3600/24);
            var hour = Math.floor(ms/1000/3600%24);
            var minute = parseInt(ms/1000/60%60);
            var second = parseInt(ms/1000%60);
            hour >= 10 ? hour : hour = "0" + hour;
            minute >= 10 ? minute : minute = "0" + minute;
            second >= 10 ? second : second = "0" + second;
            box.innerHTML = "距离放假还有"+day+"天"+hour+"小时"+minute+"分"+second+"秒";
        }

    24.针对数组的升序降序排列

     //针对数组sort()方法的排序
     var arr = [4, 12, 36, 76, 21, 9, 19, 42];
     //升序    
    	 //第一种   
       function asc(a,b){       
          return a-b;  
       }   
    	 //调用    console.log(arr.sort(asc));     
     	//第二种   
        var res =arr.sort(function (a,b){
      	  return a-b;    
        })    
        
    //降序   
        //第一种   
        function desc(a,b){       
        	return b-a;
        }    
        console.log(arr.sort(desc)); 
        //第二种    
        var res = arr.sort(function(a,b)){  
        	return b-a;
        }   
        
     //如果为 sortfunction 参数提供了一个函数,那么该函数必须返回下列值之一: 
    	负值,如果所传递的第一个参数比第二个参数小。 
    		负值:就不换位置
    	零,如果两个参数相等。 
    	正值,如果第一个参数比第二个参数大。
    		正值:就换位置

    25.针对数组的累加求和

    arr.reduce(function(total,current,index,arr){
      return total+current;
    })

    26.正则验证身份证

    //身份证号验证正则
    function validateIdCard(idCard){
    	//15位和18位身份证号码的正则表达式
    	var regIdCard=/^(^[1-9]d{7}((0d)|(1[0-2]))(([0|1|2]d)|3[0-1])d{3}$)|(^[1-9]d{5}[1-9]d{3}((0d)|(1[0-2]))(([0|1|2]d)|3[0-1])((d{4})|d{3}[Xx])$)$/;
    
    	//如果通过该验证,说明身份证格式正确,但准确性还需计算
    	if(regIdCard.test(idCard)){
    	   if(idCard.length==18){
    		   var idCardWi=new Array( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ); //将前17位加权因子保存在数组里
    
    		   var idCardY=new Array( 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ); //这是除以11后,可能产生的11位余数、验证码,也保存成数组
    
    		   var idCardWiSum=0; //用来保存前17位各自乖以加权因子后的总和
    		   for(var i=0;i<17;i++){
               		idCardWiSum+=idCard.substring(i,i+1)*idCardWi[i];
               }
    
    		  var idCardMod=idCardWiSum%11;//计算出校验码所在数组的位置
    
    		  var idCardLast=idCard.substring(17);//得到最后一位身份证号码
    
    
    		  //如果等于2,则说明校验码是10,身份证号码最后一位应该是X
    		   if(idCardMod==2){
    			   if(idCardLast=="X"||idCardLast=="x"){
    				   return true;
    			   }else{
    				   return false;
    			   }
    		   }else{
    			   //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
    			   if(idCardLast==idCardY[idCardMod]){
    				   return true;
    			   }else{
    				   return false;
    			   }
    		   }
    	   }
    	}else{
    	   return false;
    	}
    }

    26.验证京东密码

    // 验证密码
        function testPwd(obj){
            // 一种组合
            // 纯数字组合
            var numReg = /^d{6,20}$/;
            // 纯字母组合
            var letterReg = /^[a-zA-Z]{6,20}$/;
            // 纯英文字符组合
            var charReg = /^[`~!|@#$%^&*()_-+/=、<>'",?;]{6,20}$/;
            // 纯中文字符组合
            var zhCharReg = /^[?,。《》]{3,10}$/;
            // 纯汉字组合
            var wordReg = /^[u4e00-u9fa5]{6,20}$/;
    
            // 两种组合
            // 数字和字母两种组合
            var twoReg = /^[0-9a-zA-Z]{6,20}$/;
            // 数字和英文字符组合
            var nlReg = /^[d`~!|@#$%^&*()_-+/=、<>'",?;]{6,20}$/;
            // 数字和中文字符组合
            var nzReg = /^[d?,。《》]{6,20}$/;
            // 数字和中文汉字组合
            var nwReg = /^[du4e00-u9fa5]{6,20}$/;
            // 字母和纯英文字符组合
            var lcReg = /^[a-zA-Z`~!|@#$%^&*()_-+/=、<>'",?;]{6,20}$/;
            // 字母和中文字符组合
            var lzReg = /^[a-zA-Z?,。《》]{6,20}$/;
            // 字母和中文汉字
            var lwReg = /^[a-zA-Zu4e00-u9fa5]{6,20}$/;
            // 英文字符和中文字符组合
            var czReg = /^[?,。《》`~!|@#$%^&*()_-+/=、<>'",?;]{6,20}$/;
            // 英文字符和中文汉字
            var cwReg = /^[u4e00-u9fa5\`~!|@#$%^&*()_-+/=、<>'",?;]{6,20}$/;
            // 中文字符和中文汉字
            var zwReg = /^[u4e00-u9fa5^[?,。《》]{6,20}$/;
    
            if (numReg.test(obj) == true || letterReg.test(obj) == true || charReg.test(obj) == true || zhCharReg.test(obj) || wordReg.test(obj)) {
                alert("有被盗风险,建议使用字母、数字和符号两种及以上组合");
            } else if (twoReg.test(obj) == true || nlReg.test(obj) == true || nzReg.test(obj) == true || nwReg.test(obj) == true || lcReg.test(obj) == true || lzReg.test(obj) == true || lwReg.test(obj) == true || czReg.test(obj) == true || cwReg.test(obj) == true || zwReg.test(obj) == true) {
                alert("安全强度适中,可以使用三种以上的组合来提高安全强度");
            } else if (obj.length >= 6) {
                alert("你的密码安全");
            } else {
                alert("请核对输入");
            }
        }

    27.利用正则替换路径问题

    /*
        * 需求:给图片的src地址前面增加为assets
        *
        * 1. 将需要匹配的内容原封不动的写入正则表达式
        * 2. 将改变的内容替换为.*?
        * 3. 将.*?添加(),目的是为了能够将src中的内容单独匹配一次作为匹配结果
        * 4.通过replace将内容替换
        *   content.replace(reg,'<img src="assets/$1" alt="">')
        * */
    <body>
    	<ul>
       	    <li class="images"><a href="1.html"><img class="a" src="images/1.jpg" alt="134534"></a></li>
        	<li><a href="2.html"><img src="images/2.jpg" alt="asdfas2"></a></li>
       		<li><a href="3.htlm"><img src="images/3.jpg" class="b" alt="3asdf"></a></li>
        	<li><a href="4.html"><img src="images/4.jpg" alt="45asdf4"></a></li>
       	    <li><a href="5.html"><img src="images/5.jpg" alt="zxcv5" title="abc"></a></li>
    	</ul>
    </body>
    
    <script>
    	//1。获取ul对象
        var ul = document.querySelector('ul');
        // 2.获取ul的文本内容,此时就是获取出来ul里所有的内容
        var content = ul.innerHTML;
        // 3.写正则表达式,先把需要改变的地址原封不动拿过来
        // <img src="images/3.jpg" class="b" alt="3asdf">把不一样地方用(.*?)替换,如下
        // .匹配的是非空字符*匹配任意数量?拒绝贪婪,匹配任意数量的非空字符,如果不加?,就会匹配到最后
        var reg = /<img(.*?)src="(.*?)"(.*?)>/g;
        var result = content.replace(reg,'<img$1src="assets/$2"$3>')
        console.log(result);
    </script>

    28.去除数组中的重复值,打印出不重复的元素

        function unique(arr) {
            // 定义一个空数组,用来存放不重复的值
            var newArr = [];
            // 遍历原数组
            for (var i = 0; i < arr.length; i++) {
                // 如果新数组里查找原数组 ,因为查找不到indexOf的值为-1,如果查找不到就把原数组的值放到新数组中
                if (newArr.indexOf(arr[i]) == -1) {
                    newArr.push(arr[i]);
                }
            }
            return newArr;
        }

    29.获取url地址的后缀名

        var str = "https://www.baidu.com/index.php?tn=78040160_40_pg";
        两种方法:任选其一
        // 数组拆分
    	function getURLtype(str){
            var arr = str.split(".");
            var arr1 = arr[arr.length - 1].split("?");
            console.log(arr1[0]);
        }
    	//输出php
    	
        // lastIndexOf
        function getURLtype(str) {
            var index = str.lastIndexOf(".");
            var index2 = str.indexOf("?");
            console.log(str.slice(index, index2));
        }
        //输出.php

    30.字符串转换为对象

        function strToObj(str) {
            // 定义一个空对象
            var obj = {};
            // 切割字符串为数组
            var arr = str.split("; ");
            // 遍历数组
            arr.forEach(function (value, key) {
                // 获取第一个等号出现的位置
                var index = arr[key].indexOf("=");
                // 以等号切割
                var res = arr[key].split(/[=]/);
                obj[res[0]] = arr[key].slice(index + 1);
            })
            console.log(obj);
        }

    31.查找字符串的每个字符在字符串出现的次数,从小到大输出

        function strCount(str) {
            var obj = {};
            for (var i = 0; i < str.length; i++) {
                if (obj[str[i]]) {
                    //obj[str[i]] 是对象的一种形式,也就是obj[str[0]] 就是obj['a']=obj.a,在str中查找obj.a  obj.b 等等,如果找到 就+1,找不到就是1
                    obj[str[i]]++;
                } else {
                    obj[str[i]] = 1;
                }
            }
            // 获取object.keys   ["1", "2", "a", "b", "d", "e"]
            var num = Object.keys(obj).sort(function (a,b) {
    //        obj[a]  obj.1 就是次数
                return obj[a]-obj[b];
            });
    
    		var newObj = {};
       		for (var item in num) {
           		 newObj[num[item]] = obj[num[item]];
      	    }
      	    return newObj;
        }

    32.全选,取消全选,反选

        // 全选
        function allSelect(obj, input) {
            obj.onclick = function () {
                input.forEach(function (value, key) {
                    input[key].checked = true;
                })
            }
        }
    
        // 取消全选
        function cancelSelect(obj, input) {
            obj.onclick = function () {
                input.forEach(function (value, key) {
                    input[key].checked = false;
                })
            }
        }
    
        // 反选
        function reverseSelect(obj, input) {
            obj.onclick = function () {
                input.forEach(function (value, key) {
                    if (input[key].checked){
                        input[key].checked = false;
                    } else {
                        input[key].checked = true;
                    }
                })
            }
        }

    33.添加类名、删除类名(移除类名)

        // 添加类名
        function addClass(obj, className) {
            // 获取对象的类名,并且去掉两边空格 以防class = "     box      "的情况
            var oldClass = obj.className.trim();
            // 把获取到的对象的类名以空格的形式拆分为数组,指定的形式可以是正则表达式,/s+/ s是匹配到空格,+最少匹配一个,以防页面中有多个空格
            var classArr = oldClass.split(/s+/);
            // 在拆分后的数组中查找要传进来的类名,通过索引值,如果索引值为-1,就查找不到
            if (classArr.indexOf(className) == -1) {
                // 找不到需要添加的类型的话,就把这个类名添加到数组中
                classArr.push(className);
                // 然后把添加类名的对象的类名的数组形式转换为字符串,此时obj.className中的className 不是形参,而是类名
                obj.className = classArr.join(' ');
            }
        }
    
        // 移除类名
        function removeClass(obj, className) {
            var oldClass = obj.className.trim();
            var classArr = oldClass.split(/s+/);
            // 在拆分后的数组如果找到了需要移除的类名,那么就移除这个类名
            if (classArr.indexOf(className) != -1) {
                classArr.splice(classArr.indexOf(className), 1);
                obj.className = classArr.join(' ');
            }
        }

    34.放大镜效果

        /*
        * 功能:实现电商网站放大镜效果
        * @param Object box: 放大镜最大盒子的容器
        * @param Object small: 放小图片的小盒子
        * @param Object smallImg: 小盒子的图片
        * @param Object shadow: 鼠标遮罩的阴影层
        * @param Object big: 装放大图片的盒子
        * @param Object bigImg: 放大的图片
        * */
        function magnifier(box, small, smallImg, shadow, big, bigImg) {
            // 鼠标移入小盒子,显示阴影放大镜盒子
            small.onmouseenter = function () {
                shadow.style.display = "block";
                big.style.display = "block";
    
                // 设置阴影盒子的宽高阴影盒子的宽高,不是随便给的
                // 阴影盒子的宽高/small盒子的宽高 应该等于 big盒子的宽高(不能包含边框 ,所以用clientWidth  因为offsetWidth包含宽高)/ bigImg的宽高,他们是等比例关系 也就是x/450 = 540/800
                shadow.style.width = small.offsetWidth * big.clientWidth / bigImg.offsetWidth + "px";
                shadow.style.height = small.offsetWidth * big.clientWidth / bigImg.offsetWidth + "px";
    
                // 移动阴影,因为只有在进入small盒子是,才可以移动,所以在这里出发移动事件
                small.onmousemove = function (ent) {
                    var e = ent || window.event;
                    /*
                    * 让鼠标一直保持在阴影盒子的中间,所以鼠标的起始位置就是阴影盒子的宽高的一半
                    * 阴影的left/top值= 鼠标距离页面的距离 - 小盒子距离页面的距离 - 阴影盒子自身(宽高)的一半
                    * */
                    // 此时没有small盒子的offsetLeft  是因为offsetLeft属性是距离有定位的祖辈盒子的距离,因为small的父级盒子box相对定位,所以small.offsetLeft 永远都为0,因为box和small盒子一样大,所以用box.offsetLeft
    
                    // 为了不让阴影盒子超出边界,需要判断一下,
                    var left = e.pageX - box.offsetLeft - shadow.offsetWidth / 2;
                    if (left < 0) {
                        left = 0;
                    } else if (left > box.offsetWidth - shadow.offsetWidth) {
                        left = box.offsetWidth - shadow.offsetWidth;
                    }
    
                    var top = e.pageY - box.offsetTop - shadow.offsetHeight / 2;
                    if (top < 0) {
                        top = 0;
                    } else if (top > box.offsetWidth - shadow.offsetWidth) {
                        top = box.offsetWidth - shadow.offsetWidth;
                    }
    
                    shadow.style.left = left + "px";
                    shadow.style.top = top + "px";
    
                    // 上面都是计算出阴影的移动,下面计算出放大镜的右侧盒子移动的部分
                    /*
                    * 放大镜应该是等比例缩放的,small盒子的宽高450,放大镜图片的是800
                    * 右侧盒子和左侧盒子的比例就是800/450,假如 左侧鼠标的坐标位置是(100,100),如果他们是二倍关系,那么右侧盒子图片的坐标就是应该(100*2,100*2)
                    * 所以右侧盒子图片的left,top值就应该是(左侧left*800/450,左侧top*800/450)
                    * 由于右侧是盒子里面包含一个特别大的图片,图片的内容也超出右侧盒子的距离,可以用big.scrollTop(Left) 来设置坐标
                    * */
                    big.scrollTop = top * bigImg.offsetHeight / smallImg.offsetWidth;
                    big.scrollLeft = left * bigImg.offsetHeight / smallImg.offsetWidth;
                }
            }
            // 鼠标离开小盒子,继续隐藏
            small.onmouseleave = function () {
                shadow.style.display = "none";
                big.style.display = "none";
            }
        };

    35.添加移除绑定事件

    /*
    * 添加绑定事件
    * @param Object obj:绑定的事件对象
    * @param String eventName:绑定的事件名称
    * @param function callback:绑定事件执行的函数
    * */
    function addEvent(obj, eventName, callback) {
        if (obj.addEventListener) {
            obj.addEventListener(eventName, callback, false);
        } else {
            obj.attachEvent('on' + eventName, callback);
        }
    }
    
    /*
    * 移除绑定事件
    * @param Object obj:移除绑定的事件对象
    * @param String eventName:移除绑定的事件名称
    * @param function callback:移除绑定事件执行的函数
    * */
    function removeEvent(obj, eventName, callback) {
        if (obj.removeEventListener) {
            obj.removeEventListener(eventName, callback, false);
        } else {
            obj.detachEvent('on' + eventName, callback);
        }
    }

    36.获取样式

        /*
        * 获取样式
        * @param Object obj获取样式的对象
        * @param Object attr:获取的css样式名称
        * return 获取样式的值
        * */
        function getStyle(obj, attr) {
            return document.defaultView ? document.defaultView.getComputedStyle(obj, null)[attr] : obj.currentStyle[attr];
        }
        // 调用,需要给attr加引号
        console.log(getStyle(box, 'backgroundColor'));
        主流浏览器获取的颜色都转换成rgb值,IE8获取的是style样式里面写的属性值,写什么就是什么

    37.阻止默认行为

    e ?e.preventDefault() : window.event.returnValue = false;e ?e.preventDefault() : window.event.returnValue = false;

    38.移动端视口

    function getFontSize() {
        // 定义html的字体大小
        var htmlFontSize = 16;
        // 以iphone6为准 设置窗口宽度
        var cw = 375;
        // 获取新窗口的可视宽度
        var newCw = document.documentElement.clientWidth || document.body.clientWidth;
        // 获取新窗口的字体大小
        var newHtmlFontSize = newCw * htmlFontSize / cw;
        document.documentElement.style.fontSize = newHtmlFontSize + 'px';
    }
  • 相关阅读:
    我的一些JAVA基础见解
    我的三天前端世界
    「SAP技术」 SAP MM MPN物料的采购初探
    被 GANs 虐千百遍后,我总结出来的 10 条训练经验
    解析|人脸识别最全知识图谱—清华大学出品
    AI反欺诈:千亿的蓝海,烫手的山芋|甲子光年
    从《华为的冬天》到AI的冬天 | 甲子光年
    「杂谈」苏州要想成为一线城市,还需要放几个大招
    「杂谈」最有可能成为第五个一线城市,苏州 or 杭州?
    「杂谈」我眼里的2019年度新一线城市排名
  • 原文地址:https://www.cnblogs.com/luxiaoyao/p/7107089.html
Copyright © 2020-2023  润新知