JS 九宫格算法 用原生js实现

九宫格算法核心:css

  1. 利用控件索引index计算出控件所在的行数和列数;
  2. 利用控件计算出left距离;
  3. 利用控件计算出top距离;
  4. 写特效时须要用到定位

公式:html

  • 行 row=parseInt(i/cols);
  • 列 col=parseInt(i%cols);

i是当前的盒子,cols是总列数,算法

代码示例:布局

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>九宫格</title>
        <style> *{ padding: 0; margin: 0;
           } #top{ margin-top:30px; margin-bottom: 20px; margin-left:20px;
           } #bottom{ position: relative;
           } #bottom .content{ width: 220px; height: 360px; background-color: skyblue; margin: 0 0 15px 15px; padding: 5px;
           } .content img{ width: 220px; height: 308px;
           } #bottom .content p:last-child{ font-size: 15px; color: red;
           }
        </style>
    </head>
    <body>
        <div id="top">
           <button>排成三列</button>
           <button>排成四列</button>
           <button>排成五列</button>
        </div>
        <div id="bottom">
           <div class="content">
              <img src="./images/dianying.jpg">
              <p>是一部很是成功的导演处女做</p>
              <p>几乎全面启用新演员的作法</p>
           </div>
           <div class="content">
              <img src="./images/dianying.jpg">
              <p>是一部很是成功的导演处女做</p>
              <p>几乎全面启用新演员的作法</p>
           </div>
           <div class="content">
              <img src="./images/dianying.jpg">
              <p>是一部很是成功的导演处女做</p>
              <p>几乎全面启用新演员的作法</p>
           </div>
           <div class="content">
              <img src="./images/dianying.jpg">
              <p>是一部很是成功的导演处女做</p>
              <p>几乎全面启用新演员的作法</p>
           </div>
           <div class="content">
              <img src="./images/dianying.jpg">
              <p>是一部很是成功的导演处女做</p>
              <p>几乎全面启用新演员的作法</p>
           </div>
           <div class="content">
              <img src="./images/dianying.jpg">
              <p>是一部很是成功的导演处女做</p>
              <p>几乎全面启用新演员的作法</p>
           </div>
           <div class="content">
              <img src="./images/dianying.jpg">
              <p>是一部很是成功的导演处女做</p>
              <p>几乎全面启用新演员的作法</p>
           </div>
           <div class="content">
              <img src="./images/dianying.jpg">
              <p>是一部很是成功的导演处女做</p>
              <p>几乎全面启用新演员的作法</p>
           </div>
           <div class="content">
              <img src="./images/dianying.jpg">
              <p>是一部很是成功的导演处女做</p>
              <p>几乎全面启用新演员的作法</p>
           </div>
           <div class="content">
              <img src="./images/dianying.jpg">
              <p>是一部很是成功的导演处女做</p>
              <p>几乎全面启用新演员的作法</p>
           </div>
           <div class="content">
              <img src="./images/dianying.jpg">
              <p>是一部很是成功的导演处女做</p>
              <p>几乎全面启用新演员的作法</p>
           </div>
           <div class="content">
              <img src="./images/dianying.jpg">
              <p>是一部很是成功的导演处女做</p>
              <p>几乎全面启用新演员的作法</p>
           </div>
           <div class="content">
              <img src="./images/dianying.jpg">
              <p>是一部很是成功的导演处女做</p>
              <p>几乎全面启用新演员的作法</p>
           </div>
           <div class="content">
              <img src="./images/dianying.jpg">
              <p>是一部很是成功的导演处女做</p>
              <p>几乎全面启用新演员的作法</p>
           </div>
           <div class="content">
              <img src="./images/dianying.jpg">
              <p>是一部很是成功的导演处女做</p>
              <p>几乎全面启用新演员的作法</p>
           </div>
        </div>
        <script> window.onload=function(){ var top=document.getElementById("top"); var btns=top.getElementsByTagName("button"); var content=document.getElementById("bottom"); // console.log(content.children);
                //console.log(btns);
                //定义变量标识盒子的宽度和高度
                 var cssW=220; var cssH=360; var marginXY=15; //监听按钮点击事件
 btns[0].onclick=function(){ getContent(3); } btns[1].onclick=function(){ getContent(4) } btns[2].onclick=function(){ getContent(5); } function getContent(cols){ var cols; //遍历
                   for(var i=0;i<content.children.length;i++){ var currentCont=content.children[i]; //console.log(currentCont);
                       //盒子所在的行
                       var row=parseInt(i/cols);
                       //盒子所在的列
                       var col=parseInt(i%cols); //console.log("盒子在第" +row+ "行,""在第" +col+ "列");
 currentCont.style.position="absolute"; currentCont.style.left=col*(cssW+marginXY)+"px"; currentCont.style.top=row*(cssH+marginXY)+"px"; } } } </script>
    </body>
</html>

 

九宫格(用原生js实现)

一、本文的九宫格是用原生的js实现的;this

二、实现的九宫格效果是:可交换1-9的任意方格,且将方格拖拽至大盒子外松开后可自动回到拖拽以前的位置。spa

三、代码以下:code

html代码:orm

<ul id="box">
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
    <li>7</li>
    <li>8</li>
    <li>9</li>
</ul>

css代码:htm

body,div,p,h1,h2,h3,h4,h5,h6,ol,ul,li,dl,dt,dd,th,tr,td,hr,caption,table,form,img,input,legend,fieldset{ margin:0; padding:0;
} html { overflow: hidden;
} ul { list-style: none;
} #box { position: relative; margin: 20px auto; width: 640px; height: 640px; border: 1px solid #eee;
} #box li { position: absolute; width: 200px; height: 200px; line-height: 200px; text-align: center; font-size: 40px; font-weight: bold; background: #eee;
} #box .active { z-index: 1; color: #fff; background: blue;
}

js代码:blog

window.onload = function () { var oBox = document.getElementById('box'); var aLi  = oBox.children; for(var i = 0; i < aLi.length; i++) { // 布局
        aLi[i].style.left = 210 * (i % 3) + 10 + 'px'; aLi[i].style.top = 210 * Math.floor(i / 3) + 10 + 'px'; // 添加拖拽功能
        aLi[i].index = i; aLi[i].onmousedown = function (ev) {         var e = ev || window.event;         var iX = e.clientX - this.offsetLeft;         var iY = e.clientY - this.offsetTop;         if(this.setCapture) {         this.setCapture();         }         var oThat = this; // 添加class名称
            this.className = 'active'; document.onmousemove = function (ev) { var e = ev || window.event; var iL = e.clientX - iX; var iT = e.clientY - iY; oThat.style.left = iL + 'px'; oThat.style.top = iT + 'px'; // 交换位置的条件
                for(var j = 0; j < aLi.length; j++) { if(oThat != aLi[j] &&  oThat.offsetLeft + oThat.offsetWidth > aLi[j].offsetLeft + aLi[j].offsetWidth / 2
                        &&  oThat.offsetTop + oThat.offsetHeight > aLi[j].offsetTop + aLi[j].offsetHeight / 2
                        &&  oThat.offsetLeft < aLi[j].offsetLeft + aLi[j].offsetWidth / 2
                        &&  oThat.offsetTop < aLi[j].offsetTop + aLi[j].offsetHeight / 2) {     var iCurIndex = oThat.index;     // 交换位置
                        aLi[j].style.left = 210 * (iCurIndex % 3) + 10 + 'px';     aLi[j].style.top = 210 * Math.floor(iCurIndex / 3) + 10 + 'px';     // 交换下标
                        oThat.index = aLi[j].index;     aLi[j].index = iCurIndex;     break; } } }; document.onmouseup = function () { document.onmousemove = null; document.onmouseup = null; if(oThat.releaseCapture) { oThat.releaseCapture(); } // 去掉class名称
                oThat.className = ''; // 重置当前拖拽元素的位置
                oThat.style.left = 210 * (oThat.index % 3) + 10 + 'px'; oThat.style.top = 210 * Math.floor(oThat.index / 3) + 10 + 'px'; }; return false; }; } };
相关文章
相关标签/搜索