2010-11-16 102 views
15

我正在尋找一種方法來繪製一個網格(即http://www.artlex.com/ArtLex/g/images/grid.gif)在一個div內,使用CSS(如果需要,JS)。感覺應該是比較直接的,但我一直沒有弄明白。任何建議將不勝感激。使用CSS繪製網格

謝謝你在前進, 萊尼

+0

可能的重複[如何使一個網格(如圖紙紙張網格)與只是CSS?](http://stackoverflow.com/questions/3540194/how-to-make-a-grid-like-graph-paper -grid-with-just-css) – 2010-11-16 04:36:11

+0

在我的情況下,理想的解決方案將不涉及圖像,因爲我需要動態縮放網格,並用各種顏色填充塊。我可以用不同的圖像類型來管理它,但會變得非常多毛。 – lennysan 2010-11-16 04:38:38

回答

23

這裏有一個簡單的解決方案,使用jQuery。該腳本將嘗試儘可能多地填充網格元素而不會溢出。該函數接受一個參數,該參數定義網格的大小。

function createGrid(size) { 
    var ratioW = Math.floor($(window).width()/size), 
     ratioH = Math.floor($(window).height()/size); 

    var parent = $('<div />', { 
     class: 'grid', 
     width: ratioW * size, 
     height: ratioH * size 
    }).addClass('grid').appendTo('body'); 

    for (var i = 0; i < ratioH; i++) { 
     for(var p = 0; p < ratioW; p++){ 
      $('<div />', { 
       width: size - 1, 
       height: size - 1 
      }).appendTo(parent); 
     } 
    } 
} 

這還需要一個簡單的CSS樣式:

.grid { 
    border: 1px solid #ccc; 
    border-width: 1px 0 0 1px; 
} 

.grid div { 
    border: 1px solid #ccc; 
    border-width: 0 1px 1px 0; 
    float: left; 
} 

看到一個簡單的演示在這裏:http://jsfiddle.net/yijiang/nsYyc/1/


下面是一個使用本地DOM功能。我還應該更改初始比例計算使用DOM功能,但我不能爲我的生命得到window.innerWidth返回準確的數字固定的:

function createGrid(size) { 
    var ratioW = Math.floor((window.innerWidth || document.documentElement.offsetWidth)/size), 
     ratioH = Math.floor((window.innerHeight || document.documentElement.offsetHeight)/size); 

    var parent = document.createElement('div'); 
    parent.className = 'grid'; 
    parent.style.width = (ratioW * size) + 'px'; 
    parent.style.height = (ratioH * size) + 'px'; 

    for (var i = 0; i < ratioH; i++) { 
     for (var p = 0; p < ratioW; p++) { 
      var cell = document.createElement('div'); 
      cell.style.height = (size - 1) + 'px'; 
      cell.style.width = (size - 1) + 'px'; 
      parent.appendChild(cell); 
     } 
    } 

    document.body.appendChild(parent); 
} 

createGrid(10); 

它基本上是jQuery代碼的直接轉換。如果您需要更多的性能,你可以切換到生成使用字符串的箱子推到一個數組:

arr.push('<div style="width:', (size - 1), 'px;height:', (size - 1), 'px;"></div>'); 

然後在最後

parent.innerHTML = arr.join(''); 
+0

相同的大小驚人,看起來很完美 – lennysan 2010-11-16 05:12:55

+0

順便說一句,任何建議,使這更高效?這段代碼中的任何東西,我可以緩存或替換jquery與本機JS,使其運行速度更快? – lennysan 2010-11-16 05:59:34

+0

@lennysan肯定!事實上,整個事情可以在原生JS中重寫。另外,你可能不想追加循環中的元素,而是將它追加到其他的東西上,然後在循環外面追加整個東西到主體。如果你願意,我可以把它改寫成更高性能的東西。 – 2010-11-16 06:02:03

2

這是怎麼我會做到這一點:

1)製作一個L的形象將L的每一側是等於你的廣場之一網格。

2)設置此爲BG您的DIV的形象,重複在X和Y軸

3)給你的div 1px的黑色邊框的頂部和右

4)你想要的效果!

希望看到你沒有圖像後幫助

編輯點評:

爲什麼不直接使用一個表,使電網(你將無法做你想做沒有圖像的)和疊加桌上有一個絕對定位的內容div?

+0

嗯我只在發佈我的答案後纔看到您的評論... – 2010-11-16 04:40:56

+0

這聽起來像是合理的解決方案,但是使用圖像會使得很難輕鬆縮放此網格(在這種情況下,我忘記提及的重要)。希望有其他方法來,否則你贏了:) – lennysan 2010-11-16 04:41:43

+0

這個網站太快了。 – lennysan 2010-11-16 04:42:03

7

我知道這個問題已經回答了,但我對於我正在研究的一個項目,我已經爲這個確切的問題做了大量的工作,所以我想我會分享我的發現。渲染速度對我來說是一個巨大的問題,像@YiJiang,我開始通過追加循環內的節點,但我發現這不是一個非常好的解決方案,所以我研究了優化算法的方法。從算法上講,嵌套循環會導致O(n^2)複雜性,在這種情況下,可以通過生成一次行html來避免這種情況(因爲它對每行都是一樣的),然後將該字符串連接到每一行。這導致了O(n)的複雜性,並且是迄今爲止我發現的最有效的解決方案。

function drawGrid(width, height) { 
    var grid = '<div id="grid">', 
     cell_html = '', 
     i = 0, j = 0; 

    for(; i < width; i++) { 
     cell_html += '<div class="cell"></div>'; 
    } 

    for(; j < height; j++) { 
     grid += '<div class="row">' + cell_html + '</div>'; 
    } 

    grid += '</div>'; 

    return grid; 
} 

這創建了網格的基本HTML結構,然後可以使用CSS適當地設置樣式。

4

這是一個解決方案,它是@ YiJiang的答案的編輯版本,以將其降低到O(n)複雜性。我說我的解決方案的唯一原因是,它是完整的CSS和的jsfiddle樣品(http://jsfiddle.net/madstop/bM5Kr/

CSS:

.gridlines { display: none; position:absolute; background-color:#ccc; } 

的JavaScript/jQuery的:

function createGrid(size) { 
var i, 
    height = $(window).height(), 
    width = $(window).width(), 
    ratioW = Math.floor(width/size),  
    ratioH = Math.floor(height/size); 

for (i=0; i<= ratioW; i++) // vertical grid lines 
    $('<div />').css({ 
      'top': 1, 
      'left': i * size, 
      'width': 1, 
      'height': height }) 
     .addClass('gridlines') 
     .appendTo('body'); 

    for (i=0; i<= ratioH; i++) // horizontal grid lines 
     $('<div />').css({ 
      'top': 1 + i * size, 
      'left': 0, 
      'width': width, 
      'height': 1 }) 
     .addClass('gridlines') 
     .appendTo('body'); 

    $('.gridlines').show(); 
} 

createGrid(50); 
28

一個簡單的CSS的解決方案

background-image: repeating-linear-gradient(0deg,transparent,transparent 70px,#CCC 70px,#CCC 71px),repeating-linear-gradient(-90deg,transparent,transparent 70px,#CCC 70px,#CCC 71px); 
background-size: 71px 71px; 

示例:http://jsfiddle.net/fexpxpq4/

+2

大純CSS的答案,它可以避免任何.js或dom噪音。 – 2016-03-04 10:28:16

+1

我把這個精彩的黑客做了一個Sass軟件包:[Artboard](https://github.com/robenkleene/artboard)。該包的主要原因是公開一個Sass變量來輕鬆改變網格的大小。 – robenk 2016-04-03 19:51:34