Размер ячеек
Есть такой код для создания поля из 12х12 ячеек.
<div id="main"></div>
<script type="text/javascript">
var main = document.getElementById( "main" );
var tileW = 50;
var tileH = 45;
for ( var i = 0; i < 12; i++ ) {
for ( var j = 0; j < 12; j++ ) {
var tile = document.createElement( "DIV" );
main.appendChild( tile );
tile.style.cssText = "background-color: #cccccc; border: 1px dashed #eeeeee; position: absolute";
tile.style.height = tileH;
tile.style.width = tileW;
tile.style.top = tileH * i;
tile.style.left = tileW * j;
}
}
</script>
Надо сделать так, чтобы чем ближе к центру находится ячейка, тем она меньше. Ну а крайние, соответственно, больше. Было решено измерять глубину ячейки (пример для наглядности) вот такой функцией:
function Q( i, j ) {
var lvl = Math.min( i, j, 11 - i, 11 - j );
return [ 1.6, 1.4, 1.2, 0.8, 0.6, 0.4 ][lvl];
}
Она вычисляет, на сколько умножать размеры ячейки. Т.е. для крайних (с lvl=0) будет умножаться на 1.6, а для самых центральных - на 0.4 Позицию ячейки надо теперь тоже считать по-другому, поэтому сделал для этого функцию:
function S( r ) {
var s = 0;
for (var i = 0; i < r; i++) {
var t = i < 6 ? i : r - i - 1;
s += [ 1.6, 1.4, 1.2, 0.8, 0.6, 0.4 ][t];
}
return s.toFixed(1);
}
Она вместо i, j возвращает новые множители для top и left с учётом масштабирования Q() - пример работы Теперь в коде умножаю размеры ячейки на Q(i, j), а координаты - вместо top = height * i подаю top = height * S(i) и так же с left. Но получается немного не то
<div id="main"></div>
<script type="text/javascript">
var main = document.getElementById( "main" );
var tileW = 50;
var tileH = 45;
for ( var i = 0; i < 12; i++ ) {
for ( var j = 0; j < 12; j++ ) {
var tile = document.createElement( "DIV" );
main.appendChild( tile );
tile.style.cssText = "background-color: #cccccc; border: 1px dashed #eeeeee; position: absolute";
tile.style.height = tileH * Q(i, j);
tile.style.width = tileW * Q(i, j);
tile.style.top = tileH * S(i);
tile.style.left = tileW * S(j);
tile.onclick = function () { this.style.display = "none" };
}
}
function Q( i, j ) {
var lvl = Math.min( i, j, 11 - i, 11 - j );
return [ 1.6, 1.4, 1.2, 0.8, 0.6, 0.4 ][lvl];
}
function S( r ) {
var s = 0;
for (var i = 0; i < r; i++) {
var t = i < 6 ? i : r - i - 1;
s += [ 1.6, 1.4, 1.2, 0.8, 0.6, 0.4 ][t];
}
return s.toFixed(1);
}
</script>
Где я ошибся в расчётах, может есть готовое решение? В идеале хотелось бы задавать "центр" вручную (например, ячейки уменьшаются не чем ближе к центру, а чем ближе к ячейке i=3; j=9). |
Цитата:
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
*{
padding: 0;
margin: 0;
}
.cell {
text-align: center;
float: left;
height: 23px;
width: 23px;
border: #0000CD 1px solid;
background-color: #FFEBCD;
font-size: 12px;
-webkit-transition: all .5s ease-in-out;
-moz-transition: all .5s ease-in-out;
-o-transition: all .5s ease-in-out;
transition: all .5s ease-in-out;
}
#matrix{
display: inline-block;
margin: 50px auto;
}
.red{
border-radius: 4px;
background: #FF0F0F;
}
.cell:hover{
border-radius: 4px;
background: #0000CD;
}
.yellow{
background: #FFFF00;
}
.green{
background: #008000;
}
.blue{
background: #0000FF
}
</style>
<script>
window.addEventListener('DOMContentLoaded', function() {
var matrix = document.getElementById('matrix'),
l = 24, //ширина можно менять
t = 16, //высота
n = l * t;
function createMatrix() {
var w;
for (var i = 0; i < n; i++) {
var div = document.createElement('div');
div.className = 'cell';
div.dataset.index = i;
matrix.appendChild(div);
if (i == l - 1) {
w = matrix.offsetWidth + 1;
}
}
matrix.style.width = w + 'px';
matrix.style.display = 'block'
}
function chec(indx, size) {
var s = [], m = [],
x = indx % l,
y = indx / l | 0;
size = size || 1;
for (var i = y - size; i <= y + size; i++) {
for (var k = x - size; k <= x + size; k++) {
var num = k + i * l, max = Math.max(Math.abs(i-y),Math.abs(k-x));
i > -1 && i < t && k > -1 && k < l && num < (i * l + l) && num != indx && (s.push(num),m.push(max) )
}
}
return {s : s, m : m}
}
createMatrix(); //создание поля игры
var divs = [].slice.call(document.querySelectorAll('.cell'),0); //массив клеток с которым будем работать
var Q = [1, .8, .6, .4 ]
matrix.addEventListener('mousemove', function (event) {
var el = event.target, cls = el.classList;
if(cls && cls.contains('cell')) {
var index = el.dataset.index;
var arr = chec(index, 3);
divs.forEach(function(el,i) {
var k = arr.s.indexOf(i);
var m = arr.m[k];
m = Q[m];
m = 'scale('+m+')'
k !== -1 ? (el.classList.add('red'),el.innerHTML=arr.m[k],el.style.transform = m ): (el.classList.remove('red'),el.innerHTML='', el.style.transform = '');
});
}
});
});
</script>
</head>
<body>
<div id="matrix" ></div>
</body>
</html>
|
| Часовой пояс GMT +3, время: 03:03. |