Как я могу распознать вертикальные пустые места в моей разметке в JavaScript?

#javascript #html

Вопрос:

в этом HTML-файле есть несколько разделов, которые являются абсолютными

Я хочу написать код на JavaScript, который может указать мне строку каждого div. Всякий раз, когда в вертикальных осях у нас нет коробки, есть строка, для меня проблема в том, как я могу сообщить своему приложению «есть строка»!

вот мой HTML-код:

 lt;htmlgt; lt;headgt;  lt;stylegt;  .container {  width : 1170px;  margin : 0 auto;  position : relative;  }   .box {  position : absolute;  background : red;  width : 300px;  height : 300px;  color : #fff;  font-size : 50px;  }  lt;/stylegt; lt;/headgt; lt;bodygt; lt;div class="container"gt;  lt;div class="box" style="top: 20px; left: 30px" id="box1"gt;box1lt;/divgt;  lt;div class="box" style="height:100px; top: 90px; left: 530px" id="box2"gt;box2lt;/divgt;  lt;div class="box" style="top: 1450px; left: 230px" id="box3"gt;box3lt;/divgt;  lt;div class="box" style="top: 550px; left: 630px" id="box4"gt;box4lt;/divgt;  lt;div class="box" style="top: 950px; left: 130px" id="box5"gt;box5lt;/divgt; lt;/divgt;   lt;/bodygt;  lt;/htmlgt;  

Я хочу, чтобы мой код работал с большим или меньшим количеством полей, поэтому я думаю, что должен написать функцию, но без понимания этих строк я не могу этого сделать… Есть какие-нибудь советы?

Комментарии:

1. Вы должны начать с формального определения того, что такое a row , — тогда вы сможете проверить, в какой «строке» находится любой данный DIV.

2. Да, но это именно моя проблема. Я не знаю, каким способом лучше определить строку для этого приложения. должен ли я сказать, что любое вертикальное свободное пространство между этими ящиками-это строки или другой способ? Даже если это лучший подход, я не нашел лучшего способа сделать это :’)

3. Как насчет определения некоторых строк, которые начинаются с верхней границы первого поля и заканчиваются на его нижней границе, получите эти высоты, и это ваша первая строка, и учтите, что все остальные поля, у которых есть верхняя граница внутри этой строки, находятся в этой строке, чем получите верхнюю границу следующего поля, которое находится под первой строкой, и создайте свою вторую строку.. и так далее

4. Ну, определения проблем, как правило, являются чисто математической проблемой, поэтому не имеет значения, новичок ли вы в программировании, если вы хорошо разбираетесь в математике. Вы можете начать с бумаги, с системы координат Декарта, и попытаться выразить свою логику в виде одного или нескольких математических уравнений.

5. @Габриэль О! это решение интересно для меня, и я думаю, что оно выглядит проще, чем мое решение.

Ответ №1:

Вот простой пример, сначала он находит минимальные и максимальные высоты строк, а затем перебирает все поля, и если высота верхней границы находится между верхней и нижней высотой строки, он присваивает это поле этой строке, и вы получите объект с идентификаторами ваших полей и строками, в которых они находятся: (номера строк начинаются с 0, я использовал положение массива, чтобы получить его, но вы можете назначить любое число, которое хотите при создании массива строк ) вот пример вывода:

 [  {  "box": "box1",  "row": 0  },  {  "box": "box2",  "row": 0  },  {  "box": "box3",  "row": 3  },  {  "box": "box4",  "row": 1  },  {  "box": "box5",  "row": 2  } ]  
 let boxes = document.getElementsByClassName("box"); // construct an array with the rows function getRow(fromHeight) {  const o = {};  for (var i = 0; i lt; boxes.length; i  ) {  const boxRect = boxes[i].getBoundingClientRect();  if ((!o.top || o.top gt; boxRect.top) amp;amp; boxRect.top gt; fromHeight) {  o.top = boxRect.top;  o.bottom = boxRect.bottom;  }  }  return o; } let rows = []; let fromHeight = 0; for (var i = 0; i lt; boxes.length; i  ) {  let row = getRow(fromHeight);  if (Object.keys(row).length !== 0) rows.push(row);  fromHeight = row.bottom; } // console.log(rows);  // get array with every box row let array = []; for (var i = 0; i lt; boxes.length; i  ) {  const boxRect = boxes[i].getBoundingClientRect();  var row = rows.findIndex(p =gt; p.top lt;= boxRect.top amp;amp; p.bottom gt;= boxRect.top);  array.push({box:boxes[i].id, row: row}); } console.log(array); 
 lt;htmlgt;  lt;headgt;  lt;stylegt;  .container {  width: 1170px;  margin: 0 auto;  position: relative;  }   .box {  position: absolute;  background: red;  width: 300px;  height: 300px;  color: #fff;  font-size: 50px;  }  lt;/stylegt; lt;/headgt;  lt;bodygt;  lt;div class="container"gt;  lt;div class="box" style="top: 20px; left: 30px" id="box1"gt;box1lt;/divgt;  lt;div class="box" style="height:100px; top: 90px; left: 530px" id="box2"gt;box2lt;/divgt;  lt;div class="box" style="top: 1450px; left: 230px" id="box3"gt;box3lt;/divgt;  lt;div class="box" style="top: 550px; left: 630px" id="box4"gt;box4lt;/divgt;  lt;div class="box" style="top: 950px; left: 130px" id="box5"gt;box5lt;/divgt;  lt;/divgt;  lt;/bodygt;  lt;/htmlgt; 

Комментарии:

1. Большое спасибо. Это было лучшее решение, и его было легко понять.