zoukankan      html  css  js  c++  java
  • 九宫格(纯原生)

     

     

     

     

     

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>九宫格</title>
    <style>
    *{
                margin:0;
                padding:0;
            }
            #ulId{
                600px;
                height:600px;
                border:1px solid black;
                position:relative;
                margin:100px auto;
                list-style:none;
            }
            #ulId li{
                200px;
                height:200px;
                position:absolute;
                border:1px solid black;
                box-sizing:border-box;
                background:url(img/1.jpg);
                background-size:600px 600px;
            }
            #ulId li:nth-child(1){
                left:0px;
                top:0px;
                background-position:0px 0px;
            }
            #ulId li:nth-child(2){
                left:200px;
                top:0px;
                background-position:-200px 0px;
            }
            #ulId li:nth-child(3){
                left:400px;
                top:0px;
                background-position:-400px 0px;
            }
            #ulId li:nth-child(4){
                left:0px;
                top:200px;
                background-position:0px -200px;
            }
            #ulId li:nth-child(5){
                left:200px;
                top:200px;
                background-position:-200px -200px;
            }
            #ulId li:nth-child(6){
                left:400px;
                top:200px;
                background-position:-400px -200px;
            }
            #ulId li:nth-child(7){
                left:0px;
                top:400px;
                background-position:0px -400px;
            }
            #ulId li:nth-child(8){
                left:200px;
                top:400px;
                background-position:-200px -400px;
            }
            #ulId li:nth-child(9){
                left:400px;
                top:400px;
                background-position:-400px -400px;
            }
    </style>
    </head>
    <body>
    <ul id="ulId">
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    </ul>
    </body>
    </html>
    <script>
    function $(id){
            return document.getElementById(id);
        }
        var currIndex=-1;//表示当前按下的li的下标
        var targetIndex=-1;//表示目标li的下标

            //一、让每个li能够实现拖拽功能
            //1.获取所有li
            var lis=$("ulId").children;
            //2.循环给每个li绑定onmousedown事件
            for(var i=0;i<lis.length;i++){
                //给每个li设置自定义属性
                lis[i].setAttribute("index",i)
                lis[i].onmousedown=function(event){
                    var evt=event || window.event;
                    //3.偏移 记录鼠标按下时距离事件源的位置
                    var offsetX=evt.offsetX;
                    var offsetY=evt.offsetY;
                    currIndex=this.getAttribute("index");
                    this.style.zIndex=1;
                    //4.给ul添加onmousemove事件,鼠标在ul里面移动
                    $("ulId").onmousemove=function(event){
                    var evt=event || window.event;
                    //5、计算li距离ul的left和top ...的X(Y)针对的是事件的属性,...left(top)针对的是dom元素的属性
                    //鼠标距离ul的位置
                    var mouseX=evt.pageX-$("ulId").offsetLeft;
                    var mouseY=evt.pageY-$("ulId").offsetTop;
                    //li距离ul的位置
                    var left1=mouseX-offsetX;
                    var top1=mouseY-offsetY;
                    //给外观赋值
                    lis[currIndex].style.left=left1+"px";
                    lis[currIndex].style.top=top1+"px";

                    //计算目标li的位置
                    var colsIndex=parseInt(mouseX/200); //列下标
                    var rowsIndex=parseInt(mouseY/200); //行下标
                    targetIndex=rowsIndex*3+colsIndex;//目标li的下标
                    }
                }
                //6.给ul添加onmouseup事件
                $("ulId").onmouseup=function(){
                    $("ulId").onmousemove=null;
                    lis[currIndex].style.zIndex=0;
                    changeLi(currIndex,targetIndex);
                    currIndex=-1;
                    targetIndex=-1;
                }
            }

        
        function changeLi(sourIndex,tagIndex){
            //二、交换两个li
            if(sourIndex==-1 || tagIndex==-1){
                return;
            }
            var lis=$("ulId").children;
            if(sourIndex!=tagIndex){
                
                var temp=getStyle(lis[sourIndex],"backgroundPosition");
                lis[sourIndex].style.backgroundPosition=getStyle(lis[tagIndex],"backgroundPosition");
                lis[tagIndex].style.backgroundPosition=temp;
            }
            
            //三、归位
            var colsIndex=sourIndex%3;
            var rowsIndex=parseInt(sourIndex/3);
            lis[sourIndex].style.left=colsIndex*200+"px";
            lis[sourIndex].style.top=rowsIndex*200+"px";
        }

    //获取dom对象的样式属性
    //参数:
    // dom对象
    // 样式属性名

    //返回值:样式属性值

    function getStyle(domObj,attr) {
    if(domObj.currentStyle){//如果能够获取到currentStyle
    return domObj.currentStyle[attr];
    }else{
    return window.getComputedStyle(domObj)[attr];
    }
    }

    </script>

     

  • 相关阅读:
    57.纯 CSS 创作一双黑暗中的眼睛
    b1.关于em和px的关系
    56.纯 CSS 描述程序员的生活
    55.1拓展之边框border-width属性。
    55.纯 CSS 创作一个太阳、地球、月亮的运转模型
    54.纯 CSS 创作一副国际象棋
    53.纯 CSS 创作一个文本淡入淡出的 loader 动画
    52.纯 CSS 创作一个小球绕着圆环盘旋的动画
    ps
    05
  • 原文地址:https://www.cnblogs.com/manban/p/11452948.html
Copyright © 2011-2022 走看看