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


    九宫格算法核心:

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

    公式:

    • 行 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实现)

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

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

    3、代码如下:

    html代码:

    <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代码:

    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代码:

    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;
            };
        }
    };
  • 相关阅读:
    ie和vuex的兼容
    关于插件的调整使用
    手机端禁止浏览器左右滑动
    vue 路由跳转记住当前页面位置
    前端知识组成,好多啊
    vue的一些随笔
    sublime的一些记录
    前端周报:前端面试题及答案总结;JavaScript参数传递的深入理解
    前端开发周报: CSS 布局方式方式与JavaScript数据结构和算法
    20170815 前端开发日报
  • 原文地址:https://www.cnblogs.com/lguow/p/10935350.html
Copyright © 2020-2023  润新知