динамическое добавление div в виде столбцов подряд с помощью Zurb Foundation

Я пытаюсь динамически добавить div (который будет целью для графиков jqplot) на панель вкладок с помощью Foundation 6. Я хочу, чтобы div располагались в столбцах в строке. Я могу получить div в строке, но каждый div оказывается в строке сам по себе, а не является элементом столбца в строке.

Мне нужен этот макет: Макет, который я хочу

Я использовал приведенный ниже код для создания строки div на панели «graph1»:

var dynDivR1 = document.createElement("div");
dynDivR1.id = ("dynRow1");
dynDivR1.class = "row"; 
document.getElementById("graph1").appendChild(dynDivR1);

Затем я вхожу в цикл, чтобы создать фактические изображения (получить данные, создать график jqplot). В цикле я создаю div графа, используя следующий код:

    var dynDiv2 = document.createElement("div");
dynDiv2.id = ("dynDiv2" + divno2);
dynDiv2.class = "small-7 medium-3 large-3 columns";
dynDiv2.style.height = "200px";
dynDiv2.style.width = "200px";     
dynDiv2.style.backgroundColor = 'white';
document.getElementById("dynRow1").appendChild(dynDiv2);

var plotInDiv2 = simplePlot(dynDiv2.id, lineDat2, sensorNames);
    divno2 +=1;

simplePlot — это функция, которая создает график с помощью jqplot. Этот код работает в том смысле, что дивы создаются динамически, в них размещаются графики. У меня проблема с макетом: поскольку у меня будет много графиков, я хочу, чтобы они располагались в столбцах, идущих по странице, а не в строках вниз по странице (в конечном итоге мне придется иметь строки и столбцы, но пока я просто пытаюсь решить столбец проблема).

Я попытался удалить атрибуты ширины и высоты столбца в div изображения, но это также не сработало (только что получил изображения / div полной ширины).

Когда я смотрю на полученный HTML-код, созданный мной элемент div не содержит информации о классе. Так, например, div dynRow1 выглядит так (см. фактический HTML ниже):

<div id="dynRow1">

У него нет атрибута class = row. Когда я смотрю на div (console.log) сразу после создания, там class = row.

Я попытался вставить дополнительный div класса столбца в строку, подобную этой (а затем прикрепить к ней div plot), но это не сработало:

<div class="medium-6 columns">

Я застрял и был бы очень признателен за любые предложения или указатели, которые могут дать другие.

Большое тебе спасибо.

Добавлено 26.12.16 Вот такой HTML у меня получается (я не включил закрывающие теги - они есть, страница загружается и работает без ошибок в Firebug:

<div class="tabs-content" data-tabs-content="dy-tabs-2">
<div id="data1" class="tabs-panel" role="tabpanel" aria-hidden="true" aria-labelledby="data1-label">
<div id="graph1" class="tabs-panel is-active" role="tabpanel" aria-hidden="false" aria-labelledby="graph1-label">
<div id="dynRow1">
<div id="dynDiv21" class="jqplot-target" style="height: 200px; width: 200px; background-color: white; position: relative;">
<div id="dynDiv22" class="jqplot-target" style="height: 200px; width: 200px; background-color: white; position: relative;">

Затем это фрагмент снимка экрана полученного HTML Вырезанный снимок экрана с HTML-страницы

Еще раз спасибо


person Tim Lynam    schedule 23.12.2016    source источник
comment
вы пытались использовать disply:inline-block для созданного элемента   -  person Jishnu V S    schedule 23.12.2016
comment
Нет у меня нет. Не могли бы вы привести пример того, как это может работать?   -  person Tim Lynam    schedule 23.12.2016
comment
можете ли вы показать мне динамически добавленный html, если мы увидим структуру, тогда мы сможем решить, как она устроена   -  person Jishnu V S    schedule 24.12.2016
comment
HI Jishnu V S. Я добавил HTML (надеюсь, это то, что вам нужно увидеть) и снимок экрана с результатом. Спасибо за любые предложения, которые у вас могут быть. К сожалению, я буду в автономном режиме чуть более двух недель, начиная с 24 часов, поэтому мне придется попробовать все, что вы предложите, когда я вернусь в сеть.   -  person Tim Lynam    schedule 26.12.2016


Ответы (3)


Уважаемый, пожалуйста, проверьте фрагмент, я добавил display:inline-block в ваш сгенерированный div, это то, что вам нужно?

<div class="tabs-content" data-tabs-content="dy-tabs-2">
  <div id="data1" class="tabs-panel" role="tabpanel" aria-hidden="true" aria-labelledby="data1-label">
    <div id="graph1" class="tabs-panel is-active" role="tabpanel" aria-hidden="false" aria-labelledby="graph1-label">
      <div id="dynRow1">
        <div id="dynDiv21" class="jqplot-target" style="height: 200px; display:inline-block; width: 200px; background-color: orange; position: relative;"></div>
        <div id="dynDiv22" class="jqplot-target" style="height: 200px; display:inline-block; width: 200px; background-color: black; position: relative;"></div>
      </div>
    </div>
  </div>
</div>

person Jishnu V S    schedule 26.12.2016
comment
Спасибо Наиля за это предложение. В итоге я использовал решение Криса О, поскольку оно соответствовало тому, что я пытался сделать. Хотя ваш фрагмент дал нужные мне результаты (за что спасибо), он не предоставил метод кода для получения этих результатов, если это имеет смысл. В любом случае, я очень ценю вашу помощь! - person Tim Lynam; 20.01.2017

Добавление строки <div class='row'> у вас есть <div class='column row'>.

Использование столбца и строки в классе создает div шириной в 12 столбцов. Любые новые столбцы div, которые вы добавите, перейдут в новую строку.

Кроме того, вам нужно будет добавить ширину (в блоках сетки), которую вы хотите для своих столбцов (до 12 в строке).

<div class='small-7 medium-3 large-3 columns'>

Этот код показывает div столбца, который будет состоять из 7 ячеек сетки на маленьком экране, 3 на среднем и 3 на большом.

Добавление нового элемента div должно происходить следующим образом... (уведомление classList.add("row")):

  // create a new ROW div  
  var dv = document.createElement("div");
  dv.id = ("newDiv");
  dv.classList.add("row");

Вот пример codepen добавления всего контента для создания строки с несколькими столбцами и использования базовых классов: https://codepen.io/cmodesign/pen/woEpEd

http://foundation.zurb.com/sites/docs/grid.html

person Chris O    schedule 23.12.2016
comment
Спасибо @Chris O. Я пытался использовать ‹div class='row'› в одном из своих тестов во время поиска решения, но это не сработало. Я также попытался указать стиль сетки для столбцов, но не сделал этого так, как вы предлагаете. Я попробую это в сочетании со спецификацией ‹div class='row'›. Спасибо еще раз. - person Tim Lynam; 24.12.2016
comment
Тим добавил альтернативный метод добавления классов и рабочий пример codepen. - person Chris O; 27.12.2016
comment
Тим... ты снова онлайн? - person Chris O; 13.01.2017
comment
Привет Крис. Только что вернулся и хочу попробовать ваши предложения. Даст вам знать, как это происходит. Спасибо - я очень благодарен за ваши предложения. - person Tim Lynam; 17.01.2017

Спасибо Крису О за полезные предложения. Я использовал предложения Криса в качестве основы для следующего решения, которое работает.

function staticPlots (selectDataSet) {
/* Function to create row and column div's for each variable in SelectDataSet and then plot
the data for each variable using jqplot line graph.
Temporary data in dataToPlot.
Temporary list of variables in selectVar
*/

// Temporary selection of variables to plot
selectVar = ["R1_","R2_","R3_","R4_","C1_","C2_","C3_","C4_","C5_","C6_","C7_","C8_","C9_","C10_","C11_","C12_"];

/* Create divs and place plots in them
First calculate the number of rows needed with four plots per row
lx is iterator to set unique col ids
*/

var x = selectVar.length;
var y = 4;
var z = Math.ceil(x / y); 
var lx = 0;

for(var r=1; r<=z; r++) {
    var dv = createRowColDivs();
    dv.id = ("newRow"+r);
    dv.classList.add("row");
    document.getElementById("graph1").appendChild(dv);

    var newCol;
    for(var i=1; i<=4; i++) {
        newCol = document.createElement("div");
        newCol.classList.add("small-3");
        newCol.classList.add("columns");
        newCol.id = "col"+lx; 
        dv.appendChild(newCol);
        var names = selectVar[lx];

        // Temporary data for illustration so the database is not used
        dataToPlot = [[1,4,5,6,8,2,3],[2,8,7,6,3,2,3]];
        var plotInDiv2 = simplePlot(newCol.id, dataToPlot, names);
        lx ++;
    }
}
};

Функция createRowColDivs просто создает div строки, чтобы я мог использовать его в других процессах. Можно было бы легко сохранить эти процессы в функции staticPlots.

function createRowColDivs() {

  // create a new ROW div  
  var dv = document.createElement("div");
  dv.id = ("newDiv");
  dv.classList.add("row");
  return(dv);
};

Этот код дает мне макет графика по столбцам, который мне нужен.

Спасибо Крис за фрагмент, который увидел меня на моем пути. Одна вещь, которую мне пришлось изменить в вашем коде, - это прикрепить div строки до того, как я определил div col. мне также потребовалось слишком много времени, чтобы понять, что мне нужно использовать lx для создания уникальных идентификаторов для каждого графика.

Всегда цените предложения по улучшению кода, если кому-то это нужно.

person Tim Lynam    schedule 20.01.2017