2010-11-16 19 views
15

Poszukuję sposobu narysowania siatki (tj. http://www.artlex.com/ArtLex/g/images/grid.gif) wewnątrz elementu div, za pomocą kodu CSS (i JS w razie potrzeby). Wydaje się, że powinno to być stosunkowo proste, ale nie byłem w stanie tego rozgryźć. Każda rada byłaby bardzo doceniana.Rysowanie siatki przy użyciu CSS

Dziękuję z góry, Lenny

+0

możliwy duplikat [Jak zrobić siatkę (jak siatka z papieru graficznego) za pomocą tylko css?] (Http://stackoverflow.com/questions/3540194/how-to-make-a-grid-like-graph-paper -grid-with-just-css) –

+0

Idealne rozwiązanie w moim przypadku nie wymaga żadnych obrazów, ponieważ muszę dynamicznie skalować siatkę i wypełniać bloki różnymi kolorami. Mógłbym sobie z tym poradzić z różnymi typami obrazów, ale to byłoby dość włochate. – lennysan

Odpowiedz

23

Oto proste rozwiązanie z wykorzystaniem jQuery. Ten skrypt spróbuje wypełnić jak najwięcej elementów siatki bez przepełnienia. Funkcja akceptuje pojedynczy parametr określający rozmiar siatki.

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); 
     } 
    } 
} 

Wymaga to również prosty styl 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; 
} 

Zobacz proste demo tutaj: http://jsfiddle.net/yijiang/nsYyc/1/


Oto jeden za pomocą natywnych funkcji DOM. Należy również zmienić początkowe obliczenia stosunku do używania funkcji DOM ale nie mogę dla życia mnie dostać window.innerWidth wrócić dokładnych liczb ustalone, że:

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); 

Jest to w zasadzie bezpośrednie tłumaczenie kodu jQuery. Jeśli potrzebujesz jeszcze bardziej wydajność można przełączyć do generowania pola za pomocą strun popychany do tablicy:

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

następnie pod koniec

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

niesamowita, wygląda idealnie – lennysan

+0

BTW, jakieś porady dotyczące zwiększenia wydajności? Cokolwiek w tym kodzie mogę buforować lub zastępować jquery natywnym JS, aby działał szybciej? – lennysan

+0

@lennysan Zdecydowanie! Całość można w rzeczywistości przepisać w natywnym JS. Poza tym możesz nie dołączać elementów do pętli, ale zamiast tego dołączać je do czegoś innego, a następnie poza pętlą dopisz całość do ciała. Mogę przepisać go na coś bardziej wydajnego, jeśli chcesz. –

2

to jak chciałbym to zrobić:

1) Sprawdź, obraz litery L, gdzie każda strona L jest równy jednemu z placów w siatka.

2) ustawić to jako bg wizerunek Twojej div powtórzyć na xi osi y

3) Nadaj div do 1px czarne obramowanie w górnej i prawej

4) Masz pożądany efekt !

nadzieję, że pomoże

Edycja po obejrzeniu Twojego żadnych zdjęć komentarz:

dlaczego nie wystarczy użyć tabeli aby siatkę (jak nie będą mogli robić co chcesz bez obrazy) i nakładki tabela z pozycjonowanym div zawartości?

+0

hmm widziałem tylko twój komentarz po opublikowaniu mojej odpowiedzi ... –

+0

To brzmi jak rozsądne rozwiązanie, jednak użycie obrazu utrudniłoby skalowanie tej siatki (coś, o czym zapomniałem wspomnieć, jest w tym przypadku ważne). Mam nadzieję, że pojawiają się inne podejścia, w przeciwnym razie wygrasz :) – lennysan

+0

Ta strona jest zbyt szalona. – lennysan

7

wiem, to pytanie udzielono już odpowiedzi, ale jestem wykonałem znaczną pracę nad tym problemem dla projektu, nad którym pracowałem, więc pomyślałem, że podzielę się swoimi odkryciami. Szybkość renderowania była dla mnie ogromnym problemem i podobnie jak @Yiiang, zacząłem od dołączenia węzłów z pętli, ale odkryłem, że nie jest to bardzo wydajne rozwiązanie, więc przyjrzałem się sposobom optymalizacji algorytmu.

Zrozumiałe algorytmem, pętle zagnieżdżania powodują złożoność O (n^2), której w tym przypadku można uniknąć generując wiersz html raz (ponieważ jest taki sam dla każdego wiersza), a następnie łącząc ten ciąg w każdym rzędzie .Powoduje to złożoność O (n) i jest zdecydowanie najskuteczniejszym rozwiązaniem, jakie znalazłem.

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; 
} 

To tworzy podstawową strukturę HTML dla siatki, która może być odpowiednio stylizowana przy użyciu CSS.

4

Oto rozwiązanie, które jest zredagowaną wersją odpowiedzi @ YiJiang, aby zmniejszyć ją do złożoności O (n). Jedynym powodem dodałem moje rozwiązanie było to, że jest w komplecie z CSS i jsfiddle próbki (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

rozwiązaniem prostym 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; 

przykład: http://jsfiddle.net/fexpxpq4/

+2

Świetna czysta odpowiedź CSS, dzięki której unika się hałasu .js lub dom. –

+1

Wziąłem ten genialny hack i zrobiłem z niego pakiet Sass: [Artboard] (https://github.com/robenkleene/artboard). Głównym powodem pakietu jest pokazanie zmiennej Sass, aby łatwo zmienić rozmiar siatki. – robenk

Powiązane problemy