IFE-2016-SP_task33_square_follow_directives

by baishusama

HTML

<div class="panel">
  <div id="board">
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div class="grid"></div>
    <div...

CSS

body {
  margin: 0;
}

.panel {
  padding: 1px;
}

#board {
  position: relative;
  overflow: hidden;
  margin: 0 auto;
  /*border: 2px solid;*/
  padding: 39px;
  width: 402px;
  height: 402px;
}

.grid {
  float: left;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  border: 1px solid #ddd;
  width: 40px;
  height: 40px;
}


/* [!!note] 注意 nth-child 里的 n 必须写在最前,否则不会生效 */

.grid:nth-child(-n + 10) {
  position: relative;
  border-top-color: #000;
  border-top-width: 2px;
  height: 41px;
}


/* 添加数字 */

.grid:nth-child(-n + 10):before {
  position: absolute;
  top: -24px;
  left: 8px;
  display: block;
  /*content: '1';*/
  width: 24px;
  height: 24px;
  line-height: 24px;
  text-align: center;
}

.grid:nth-child(1):before {
  content: '1';
}

.grid:nth-child(2):before {
  content: '2';
}

.grid:nth-child(3):before {
  content: '3';
}

.grid:nth-child(4):before {
  content: '4';
}

.grid:nth-child(5):before {
  content: '5';
}

.grid:nth-child(6):before {
  content: '6';
}

.grid:nth-child(7):before {
  content: '7';
}

.grid:nth-child(8):before {
  content: '8';
}

.grid:nth-child(9):before {
  content: '9';
}

.grid:nth-child(10):before {
  content: '10';
}

.grid:nth-child(10n + 1) {
  position: relative;
  border-left-color: #000;
  border-left-width: 2px;
  width: 41px;
}

.grid:nth-child(10n + 1):after {
  position: absolute;
  top: 8px;
  left: -24px;
  display: block;
  /*content: '1';*/
  width: 24px;
  height: 24px;
  line-height: 24px;
  text-align: center;
}

.grid:nth-child(1):after {
  content: '1';
}

.grid:nth-child(11):after {
  content: '2';
}

.grid:nth-child(21):after {
  content: '3';
}

.grid:nth-child(31):after {
  content: '4';
}

.grid:nth-child(41):after {
  content: '5';
}

.grid:nth-child(51):after {
  content: '6';
}

.grid:nth-child(61):after {
  content: '7';
}

.grid:nth-child(71):after {
  content: '8';
}

.grid:nth-child(81):after {
  content: '9';
}

.grid:nth-child(91):after {
 ...

JavaScript

// 解决 IE 和非 IE 浏览器在事件绑定方面的兼容性
function addEventHandler(elem, event, handler) {
    if (elem.addEventListener) {
        elem.addEventListener(event, handler, false);
    } else if (elem.attachEvent) {
        elem.attachEvent("on" + event, handler);
    } else {
        elem["on" + event] = handler;
    }
}

// 以下关于 css 前缀的处理方法借鉴自 jQuery :jquery-3.1.0.js
function getProperName(cssPropertyName) {
    var name = cssPropertyName;
    var cssPrefixes = ["Webkit", "Moz", "ms"];
    var emptyStyle = document.createElement("div").style;
    if (name in emptyStyle) {
        return name;
    }

    var capName = name[0].toUpperCase + name.slice(1);
    var i = cssPrefixes.length;
    while (i--) {
        name = cssPrefixes[i] + capName;
        if (name in emptyStyle) {
            return name;
        }
    }
}

function generateInlineStyle(degree) {
    var deg = degree || 0;
    return 'rotate(' + deg + 'deg)';
}

// DOM
var squareDOM = document.getElementById("square");
var boardDOM = document.getElementById("board");
var dirInputDOM = document.getElementById("directives");
var dirInputBtnDOM = dirInputDOM.nextElementSibling;

// 小方块
var square = (function() {
    var sqPos = [5, 5];
    var sqDir = 0;
    // var DIRECTION = ["faceNorth", "faceEast", "faceSouth", "faceWest"];
    var PROPERTY = getProperName("transform");
    console.log("当前浏览器支持的是 " + PROPERTY);

    var directionMod4 = function() {
        /* sqDir % 4 === 0,1,2,3 */
        // 为了解决当 sqDir 为负数时,sqDir % 4 的值不在 0,1,2,3 之间的问题

        /* 法1. 能否借助 Math 的某未知方法??? */
        //     Q: Math 有没有方法能取模只返回正数?
        //     A: JS 当下不存在这样的函数。
        //     Q: 能否通过比如说 Math.abs 实现(特别是还要能避免使用 if)?
        //     A: 至少用 Math.abs 只会帮倒忙。。

        /* 法2. 本想借助 substr 方法支持末尾计数法和一个静态字符串来实现。。。 */
        //     A: 但是当被模数的绝对值大于模数时,存在问题。比如 >4 的时候会反回 NaN 。
        //        实质上,String 的末尾计数法(substr/slice)的计算方式并不能很好地和真正的取模运算相映射 Orz
        // var DIRECTION = ["faceNorth", "faceEast", "faceSouth", "faceWest"];
        //...