Для реализации есть довольно сложная задача, которая полностью нарушила мой разум. Может быть, кто-то посоветует, как сгенерировать алгоритм на основе следующего описания.
У меня есть один контейнер с блоками статической ширины, скажем 150px
. Ширина контейнера для настольных устройств составляет 600px
а для мобильных устройств - 450px
. Это означает, что в настольной версии у меня есть 4 блока подряд, а в мобильной версии - 3 блока подряд. Чтобы заполнить все пробелы, оставшиеся в строке (если есть), мне нужно добавить заполнители, которые выглядят как другие блоки, но без содержимого и разного цвета. Количество добавленных заполнителей всегда должно быть одинаковым, но некоторые должны быть скрыты в настольной версии, а некоторые должны быть скрыты в мобильной версии. Мне нужно использовать CSS для скрытия и отображения заполнителей на разных экранах и JavaScript для добавления заполнителей при загрузке страницы.
Рассмотрим следующую разметку для 5 блоков с содержимым и 3 заполнителей:
<section>
<article>Article 1</article>
<article>Article 2</article>
<article>Article 3</article>
<article>Article 4</article>
<article>Article 5</article>
<span>Placeholder 1</span>
<span class="mobile-hide">Placeholder 2</span>
<span class="mobile-hide">Placeholder 3</span>
</section>
ДЕМО: http://jsfiddle.net/5qpsj/
Здесь у меня есть 1 базовый заполнитель и 2 заполнителя, которые скрыты на мобильных экранах. Однако, если количество блоков контента равно 4, комбинация заполнителей становится другой, отображая только 2 заполнителя, которые должны быть скрыты на экранах рабочего стола:
<section>
<article>Article 1</article>
<article>Article 2</article>
<article>Article 3</article>
<article>Article 4</article>
<span class="desktop-hide">Placeholder 1</span>
<span class="desktop-hide">Placeholder 2</span>
</section>
ДЕМО: http://jsfiddle.net/5qpsj/1/
Я пробовал разное количество блоков контента и создал следующую таблицу возможных комбинаций:
---------------------------------------------------------------------
| Blocks | Placeholders | <no class> | .mobile-hide | .desktop-hide |
---------------------------------------------------------------------
| 0 | 4 | 3 | 1 | 0 |
| 1 | 3 | 2 | 1 | 0 |
| 2 | 2 | 1 | 1 | 0 |
| 3 | 1 | 0 | 1 | 0 |
| 4 | 2 | 0 | 0 | 2 |
| 5 | 3 | 1 | 2 | 0 |
| 6 | 2 | 0 | 2 | 0 |
| 7 | 3 | 0 | 1 | 2 |
| 8 | 1 | 0 | 0 | 1 |
| 9 | 3 | 0 | 3 | 0 |
| 10 | 2 | 2 | 0 | 0 |
| 11 | 1 | 1 | 0 | 0 |
| 12 | 0 | 0 | 0 | 0 |
| 13 | 3 | 2 | 1 | 0 |
| ... | ... | ... | ... | ... |
---------------------------------------------------------------------
Начиная с 13 блоков комбинации остаются такими же, как для 1 блока, 2 блока и т.д. Лично я не вижу в этих числах никакого шаблона, что мешает мне написать соответствующий алгоритм для добавления заполнителей и установки необходимых классов при загрузке страницы.
Конечно, я мог бы жестко закодировать значения от 0 до 12 числа блоков или использовать подход, который проверяет ширину контейнера при изменении размера страницы и добавляет/удаляет необходимое количество заполнителей (выполняется плохо!), Но моя цель - создать код, который выполняет всю эту работу один раз при загрузке, а затем полагается только на CSS.
Итак, в основном, что-то вроде этого:
for (var i = 0; i < [number_of_placeholders]; i++) {
var placeholder = document.createElement('span');
if ([condition]) {
placeholder.className = 'mobile-hide';
}
if ([condition]) {
placeholder.className = 'desktop-hide';
}
section.appendChild(placeholder);
}
У тебя есть идеи?
Итак, вот мой подход. Не стесняйтесь заменять биты jQuery на VanillaJS. Возможно, вы, возможно, немного умнее с необходимыми заполнителями и подсчитаете, есть ли какие-то общие для настольных и мобильных устройств. Я просто добавил их отдельно и позволял CSS позаботиться об этом. См. Мой пример здесь http://jsfiddle.net/yThng/ (добавьте еще .block
и снова запустите, чтобы увидеть, что он работает):
function generatePlaceholders(){
var mobileRowCount = 3, // blocks per row on mobile
desktopRowCount = 4, // blocks per row on desktop
// how many blocks are there?
blockCount = $('.block').length,
// how many placeholders on mobile/desktop needed
mobilePlaceholders = 0,
desktopPlaceholders = 0,
// iterator
i;
// use modulo to see if there are rows that are not filled (on mobile)
if( blockCount%mobileRowCount > 0 ){
// if there are, calculate how many placeholders needed
mobilePlaceholders = mobileRowCount - blockCount%mobileRowCount;
}
// same as above, but for desktop
if( blockCount%desktopRowCount > 0 ){
desktopPlaceholders = desktopRowCount - blockCount%desktopRowCount;
}
// append needed desktop placeholders
for( i=0; i < desktopPlaceholders; i++ ){
$('#container').append('<div class="desktop-only-placeholder" />');
}
// append need mobile placeholders
for( i=0; i < mobilePlaceholders; i++ ){
$('#container').append('<div class="mobile-only-placeholder" />');
}
}
0
блоков: jsfiddle.net/5qpsj/2 . Вы можете обновить свой ответ, и я приму его. Спасибо за помощь!