可変グリッドレイアウトのスクリプト
作れないだろうなと思って、やってみたんですけど、意外と出来てしまいました。
画面がロードされた時、ウィンドウのリサイズ時にボックスが整列します。
ウィンドウ幅に合わせ、カラム数が決まります。並び順は最初の列は、左から右と並びますが、2列目以降はカラムの高さが高い順(top値が小さい順)にボックスが整列します。
ですので、高さがバラバラの時でも一つのカラムだけ、無駄に高さがあるといったことを防げます。
http://yuto-m.sakura.ne.jp/admin/index.html
ちゃんとセンター揃えにすればよかった・・・
今度直します。
gifアニメ作ろうとしたんですけど、キャプチャーしてる時にブラウザのリサイズすると、録画された映像がチカチカして、見るに耐えなかったのでやめました・・・
以下コードです
HTML
<!doctype html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>variable_grid_layout</title> <link rel="stylesheet" type="text/css" href="css/common.css"> <link href='http://fonts.googleapis.com/css?family=Arvo|Dosis:500' rel='stylesheet' type='text/css'> </head> <body> <div id="container"> <header><p>VARIABLE GRID LAYOUT</p></header> <div id="variable_wrapper"> <ul> <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> <li>10</li> <li>11</li> <li>12</li> <li>13</li> <li>14</li> <li>15</li> <li>16</li> <li>17</li> <li>18</li> <li>19</li> <li>20</li> </ul> </div> </div> <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> <script type="text/javascript" src="js/common.js"></script> </body> </html>
@charset "utf-8"; body,div,p,ul,li,header{ margin: 0; padding: 0; letter-spacing: 5px; line-height: 1.5em; } ul{ width: 100%; height: 100%; list-style: none; } li{ color: white; text-align: center; font-family: 'Dosis', sans-serif; font-size: 100px; -webkit-transition: all 1s; transition: all 1s; top: 0; left: 0; background-color: #92c1d1; border-radius: 10px; } li:nth-child(odd){ height: 200px; } li:nth-child(even){ height: 320px; } #container{ width: 80%; margin: 0 auto; } header{ margin: 50px 0 30px 0; } header p{ font-family: 'Arvo', serif; font-size: 70px; text-align: center; } #variable_wrapper{ width: 100%; position: relative; } #variable_wrapper ul,li{ position: absolute; }
JavaScript
無駄なコードあると思いますが、見逃して下さい・・・
$(function(){ setBoxWidth(150); VariableGrid(150,50,20,20,10); $(window).resize(function(){ VariableGrid(150,50,20,20,10); }) }) function setBoxWidth(bW){ var li = $('#variable_wrapper ul li'); var liHs = new Array($(li).length); $(li).each(function(i){ $(li).eq(i).css('width',bW); }) } function firstTop(tMargin,column){ var t = new Array(); for(var i = 0; i < column; i++){ t[i] = tMargin; } return t; } function VariableGrid(bW,sMargin,tMargin,lInterval, tInterval){ var wrap = $('#variable_wrapper'); var wrapW = $(wrap).width(); var li = $('#variable_wrapper ul li'); var c = Math.floor(wrapW / bW); var minW = Math.floor((bW * c) + (sMargin * 2) + ((c - 1) * 10)); var column = (wrapW < minW)? (c-1): c; var top = firstTop(tMargin,column); var left = new Array(column); var columnInfo = [top,left]; var cTop; var cLeft; for (var j = 0; j < column; j++){ (j === 0)? columnInfo[1][j] = sMargin: columnInfo[1][j] = lInterval + columnInfo[1][j-1] + bW; } $(li).each(function(i){ var j = i % column; var bH = $(li).eq(i).height(); cTop = columnInfo[0][j]; cLeft = columnInfo[1][j]; var min = Math.min.apply(null,columnInfo[0]); if(i < column ){ $(li).eq(i).css('top',cTop).css('left',cLeft); columnInfo[0][j] += bH + tInterval; }else{ if(min === cTop){ $(li).eq(i).css('top',cTop).css('left',cLeft); columnInfo[0][j] += bH + tInterval; }else{ for (var k = 0; k < column; k++){ if(min === columnInfo[0][k]){ $(li).eq(i).css('top',columnInfo[0][k]).css('left',columnInfo[1][k]); columnInfo[0][k] += bH + tInterval; break; } } } } }) var max = Math.max.apply(null,columnInfo[0]); $(wrap).css('height',max + 10); }
引数でマージンの設定とか出来るようにしてます。
気が向いたら、プラグイン化しようと思います。
とりあえず出来たので、良かったです。
対応ブラウザはモダンブラウザです。
IEは見てません。8以下はダメでしょう。
9,10は確認出来ないので・・・