Фильтрующиеся блоки

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

Вместо этого, мы решили объединить такие страницы в одну, но позволить как смотреть все продукты сразу, так и фильтровать по специфичным признакам. Немного jQuery нам в помощь!

Демо

Разметка

Каждый блок обернут в div. Он имеет один общий класс и класс своего типа. У div`ов нет атрибута href, но они могут иметь атрибут rel, в котором я и буду хранить url. В примере щелчок по div`у не работает, этот код за комментирован, но вы можете посмотреть как он работает.

  1. <div class="discounted-item freeshipping" rel="/store/products/12539">
  2. <img src="images/12539.jpg" alt="fieldlazer" />
  3. <div class="reasonbar">
  4. <div class="prod-title" style="width: 70%;">
  5. Крем для лица "Динамик"</div>
  6. <div class="reason" style="width: 29%;">Бесплатно!</div>
  7. </div>
  8. <div class="discount-bar">
  9. Цена: <span>0 руб</span>
  10. <strike>Старая цена: 735 руб</strike>
  11. <strong>Сэкономь 735 руб!</strong>
  12. </div>
  13. </div>

Фильтрующее меню это просто набор ссылок. Каждая ссылка имеет свой id, который равен классу продуктов.

  1. <p id="catpicker">
  2. <a href="#" id="allcat" class="current">Всё</a> |
  3. <a href="#" id="reduced" class="filter">Скидка</a> |
  4. <a href="#" id="freeshipping" class="filter">Бесплатно!</a> |
  5. <a href="#" id="discontinued" class="filter">Распродажа</a> |
  6. <a href="#" id="webonly" class="filter">Только
  7. в интернет-магазине</a>
  8. </p>

CSS

В CSS нет ничего специфичного, но я его приведу для красивого отображения примера.

  1. * { margin: 0; padding: 0; }
  2. html { overflow-y: scroll; }
  3. body { font: 12px Georgia; }
  4.  
  5. #page-wrap { width: 690px; margin: 20px auto; }
  6.  
  7. h1 { font: 30px Georgia; margin: 0 0 10px 0; }
  8.  
  9. .discounted-item { width: 100%; margin: 0 0 10px 0; position: relative; cursor: pointer;
  10. height: 125px; }
  11.  
  12. .discount-bar { padding: 10px 0 10px 100px; font: italic 18px Georgia, Serif; }
  13. .discount-bar strike { color: #999; padding: 0 5px; }
  14. .discount-bar span { font: bold 18px Helvetica, Sans-Serif; }
  15.  
  16. .reasonbar { padding: 4px 0 4px 100px; overflow: hidden;
  17. width: 540px; color: white; }
  18.  
  19. .prod-title { width: 49%; float: left; font: bold 17px Helvetica, Sans-Serif; }
  20. .reason { width: 49%; float: right; text-align: right; text-transform: uppercase;
  21. letter-spacing: 2px; padding: 0 5px 0 0; }
  22.  
  23. .discounted-item img { position: absolute; top: 0; left: 0; }
  24.  
  25. .reduced { border: 2px solid #A34427; }
  26. .reduced .reasonbar { background: #A34427; }
  27. .reduced .discount-bar { color: #A34427; background: white; }
  28.  
  29. .freeshipping { border: 2px solid #8B3C2A; }
  30. .freeshipping .reasonbar { background: #8B3C2A; }
  31. .freeshipping .discount-bar { color: #8B3C2A; background: white; }
  32.  
  33. .limited { border: 2px solid #D18D4D; }
  34. .limited .reasonbar { background: #D18D4D; }
  35. .limited .discount-bar { color: #D18D4D; background: white; }
  36.  
  37. .discontinued { border: 2px solid #80401D; }
  38. .discontinued .reasonbar { background: #80401D; }
  39. .discontinued .discount-bar { color: #80401D; background: white; }
  40.  
  41. .webonly { border: 2px solid #B37141; }
  42. .webonly .reasonbar { background: #B37141; }
  43. .webonly .discount-bar { color: #B37141; background: white; }
  44.  
  45. .buynow { position: absolute; bottom: -13px; left: 126px; }
  46.  
  47. .current { font-weight: bold; font-size: 15px; }

Немного пояснений:

  • Так как высота страницы изменяется, вертикальный скрол включен принудительно, чтобы он не появлялся и исчезал.
  • Рисунки позиционируются абсолютно. В отличие от float, это очень легко и надежно.
  • У div`ов курсор установлен как pointer, чтобы показать что они кликабельны.

JavaScript+jQuery

Добавим функционал меняющий прозрачность при наведении.

  1. $(".discounted-item")
  2. .css("opacity","0.8")
  3. .hover(function(){
  4. $(this).css("opacity","1")
  5. }, function() {
  6. $(this).css("opacity","0.8")
  7. })

Добавляем фильтрование:

  1. $("#allcat").click(function(){
  2. $(".discounted-item").slideDown()
  3. $("#catpicker a").removeClass("current")
  4. $(this).addClass("current")
  5. return false
  6. })
  7. $(".filter").click(function(){
  8. var thisFilter = $(this).attr("id")
  9. $(".discounted-item").slideUp()
  10. $("."+ thisFilter).slideDown()
  11. $("#catpicker a").removeClass("current")
  12. $(this).addClass("current")
  13. return false
  14. })

Код для кнопки "показать все" немного другой, т.к. она разворачивает всё блоки.

В примере так же используется еще одна "фишка" - блоки сортируются в случайном порядке на странице, используя плагин для jQuery от James Padolsey

Rate It! (Average 5.00, 1 votes)

Related Posts

2 Responses to Фильтрующиеся блоки

  1. gravatar

    Просто и со вкусом. Неплохой вариант. Вот только выводить придётся все продукты сразу, а у Вас написано, что продуктов много. Получается, что страница будет "весить" нереально много. Не пробовал использовать в этом случае симбиот Вашего решения и использования ajax?

  2. gravatar

    можно и ajax`ом подгружать, но тогда не достичь такой скорости в отображении, пользователю придется ждать и смотреть на прелоадер, что не очень хорошо...

Leave a Reply

Mail will not be published