Целевой средний потомок нескольких макетов из 3 столбцов

#javascript #reactjs #css #sass

#javascript #reactjs #css #sass

Вопрос:

У меня есть массив объектов, содержащих детали, которые я хочу отобразить в DOM

 searches.content.map((search, i) => {
   //....logic done here
   return <div class="SavedSearchBox">search.title</div>
)}
 

У меня есть следующий CSS для отображения строки из 3 столбцов, поэтому в каждой строке будет 3 SavedSearchBox ‘s.

 .SavedSearchBox {
   width: 33.33333333%;
   border: 1px solid #d8d8d8;
   display: inline-block;
   vertical-align: top;
   float: left;
}
 

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

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

Я рад услышать любые решения JS (пожалуйста, без jQuery, поскольку я использую React и предпочел бы не использовать jQuery) или решения CSS / SASS.

По сути, я хочу следующее…

  ----------- -------- -----------
| no margin | margin | no margin |
 ----------- -------- -----------
| no margin | margin | no margin |
 ----------- -------- -----------
| no margin | margin | no margin |
 ----------- -------- -----------
| no margin | margin | no margin |
 ----------- -------- -----------
 

и для случаев, когда они не делятся на 3

  ----------- -------- -----------
| no margin | margin | no margin |
 ----------- -------- -----------
| no margin | margin | no margin |
 ----------- -------- -----------
| no margin | margin | no margin |
 ----------- -------- -----------
       | margin | margin |    
        -------- -------
 

и

  ----------- -------- -----------
| no margin | margin | no margin |
 ----------- -------- -----------
| no margin | margin | no margin |
 ----------- -------- -----------
| no margin | margin | no margin |
 ----------- -------- -----------
            | margin |    
             -------
 

У меня есть jfiddle, чтобы протестировать его, по крайней мере, для css.

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

1. Почему бы вместо этого не использовать Flexbox ?

2. Принимая во внимание комментарий @BenM, вы могли бы использовать justify-content в сочетании с flex-shrink параметром.

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

Ответ №1:

На самом деле похоже, что у вас проблема с X-Y, и вы можете использовать Flexbox для достижения этой цели следующим образом:

 .container {
  display: flex;
  justify-content: center;
  flex-flow: row wrap;
  margin: 0 -1.5%;
}

.container .SavedSearchBox {
  background: whiteSmoke;
  box-sizing: border-box;
  margin: 10px 1.5%;
  padding: 10px;
  text-align: center;
  width: 30%;
} 
 <div class="container">
  <div class="SavedSearchBox">search.title</div>
  <div class="SavedSearchBox">search.title</div>
  <div class="SavedSearchBox">search.title</div>
  <div class="SavedSearchBox">search.title</div>
  <div class="SavedSearchBox">search.title</div>
  <div class="SavedSearchBox">search.title</div>
  <div class="SavedSearchBox">search.title</div>
</div> 

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

1. Спасибо за это, но это добавило бы поля слева к 1-му столбцу в строке и поля справа к 3-му столбцу в строке. Я хочу, чтобы поле применялось только ко 2-му столбцу в строке. Легко ли это достижимо?

2. Конечно, просто добавьте отрицательный запас .container .