Используем jQuery для улучшения юзабилити сайта

#
Используем jQuery для улучшения юзабилити сайта

  1. Карусулька с автопрокруткой
    Демо http://shop.tuningster.ru/ - блоки справа
    Эффект карусельки на JavaScript, автоматически прокручивающий элементы (товары, в моем случае) в блоке. Код очень прост, достаточно:
    1 Скачать и установить jQuery http://jquery.com/
    Закачали скрипт в папку js на хостинге и отредактировали Основной макет:
    <script src="/js/jquery-1.3.2.min.js" type="text/javascript"></script>
    </head>

    2 Отредактировать шаблон, где у вас находится блок. Курсив - скрипт прокрутки, жирный - параметры. В скрипте - сколько выводится, в вызове - сколько всего будет их. Мой вызов подтягивает 5 товаров из магазина, скроллятся по 2 штуки.
    <!-- Скроллеры -->
    <script type="text/javascript" charset="utf-8">
    $(function () {
        $('ul.spy').simpleSpy();
    });

    (function ($) {
        
    $.fn.simpleSpy = function (limit, interval) {
        limit = limit || 2;
        interval = interval || 4000;
        
        return this.each(function () {
            // 1. setup
                // capture a cache of all the list items
                // chomp the list down to limit li elements
            var $list = $(this),
                items = [], // uninitialised
                currentItem = limit,
                total = 0, // initialise later on
                height = $list.find('> li:first').height();
                
            // capture the cache
            $list.find('> li').each(function () {
                items.push('<li>' + $(this).html() + '</li>');
            });
            
            total = items.length;
            
            $list.wrap('<div class="spyWrapper" />').parent().css({ height : height * limit });
            
            $list.find('> li').filter(':gt(' + (limit - 1) + ')').remove();

            // 2. effect        
            function spy() {
                // insert a new item with opacity and height of zero
                var $insert = $(items[currentItem]).css({
                    height : 0,
                    opacity : 0,
                    display : 'none'
                }).prependTo($list);
                            
                // fade the LAST item out
                $list.find('> li:last').animate({ opacity : 0}, 1000, function () {
                    // increase the height of the NEW first item
                    $insert.animate({ height : height }, 1000).animate({ opacity : 1 }, 1000);
                    
                    // AND at the same time - decrease the height of the LAST item
                    // $(this).animate({ height : 0 }, 1000, function () {
                        // finally fade the first item in (and we can remove the last)
                        $(this).remove();
                    // });
                });
                
                currentItem++;
                if (currentItem >= total) {
                    currentItem = 0;
                }
                
                setTimeout(spy, interval)
            }
            
            spy();
        });
    };
        
    })(jQuery);
    </script>

          <div class="panel bg2">
             <div class="inner">
                <span class="corners-top"><span></span></span>
                <h3>Новинки</h3>
                <?php
                   $shop = & singleton('shop');

                   $param = array();
                   $param['items_order']='Desc';
                   $param['items_field_order']='shop_items_catalog_date_time';
                   $param['current_group_id'] = false;
                   $param['items_on_page'] = 5;
                   $shop->ShowShop('8','МагазинКаталогТоваровНаГлавнойВерт',$param,$external_propertys);
                ?>                                                                        
                <span class="corners-bottom"><span></span></span>
             </div>
          </div>



    3 Пойти в XSL шаблоны, найти ваш шаблон блока Присвоить вашему списку ul class="spy", а элементы должны быть в <li>. На всякий случай привожу пример шаблона:
    <?xml version="1.0" encoding="windows-1251"?>
    <!DOCTYPE xsl:stylesheet>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
       
       <xsl:template match="/">
          <xsl:apply-templates select="/shop"/>
       </xsl:template>
       
       <!-- Шаблон для магазина -->
       <xsl:template match="/shop">
          
          <!-- Получаем ID родительской группы и записываем в переменную $parent_group_id -->
          <xsl:variable name="parent_group_id" select="@current_group_id"/>
          
          <!-- Если в находимся корне - выводим название магазина -->
          <!--<h1><xsl:value-of disable-output-escaping="yes" select="name" /></h1>-->
          
          <xsl:variable name="count">1</xsl:variable>
          
          <!-- Выводим товары магазина -->
          <xsl:if test="count(item) &gt; 0">
             <ul class="spy">
                <xsl:apply-templates select="item"/>
             </ul>
          </xsl:if>
       </xsl:template>
       
       
       
       <!-- Шаблон для товара -->
       <xsl:template match="item">
          
          <!-- Определяем цвет фона -->
          <xsl:variable name="background_color">
             <xsl:choose>
                <xsl:when test="(position() + 1) mod 2 &gt; 0">#f7f7f7</xsl:when>
                <xsl:otherwise>#ffffff</xsl:otherwise>
             </xsl:choose>
          </xsl:variable>
          
          <li class="goods_column">
             
             <!-- Изображения для товара, если есть -->
             <xsl:if test="small_image!=''">
                <a href="{/shop/path}{fullpath}{path}/">
                   <img src="{small_image}" align="top"/>
                </a>
             </xsl:if>
             
             <!-- Название товара -->
             <br/>
             <a href="{/shop/path}{fullpath}{path}/">
                <xsl:value-of disable-output-escaping="yes" select="name"/>
             </a>
             <!-- Цена товара товара -->
             <br/>
             <xsl:value-of disable-output-escaping="yes" select="price"/>&#xA0;<xsl:value-of disable-output-escaping="yes" select="currency"/>&#xA0;
             
             <!-- Ссылку на добавление в корзины выводим, если:
             type = 0 - простой тип товара
             type = 1 - электронный товар, при этом остаток на складе больше 0 или -1,
             что означает неограниченное количество
             <xsl:if test="type = 0 or (type = 1 and (eitem_count > 0 or eitem_count = -1))">
                <a href="{/shop/path}cart/?action=add&amp;item_id={@id}" onclick="return AddIntoCart('{/shop/path}', {@id}, 1)">
                   <img alt="В корзину" title="В корзину" src="/hostcmsfiles/images/cart.gif"/>
                </a>
             </xsl:if> -->
          </li>
          
       </xsl:template>
       
       <!-- Шаблон для модификаций -->
       <xsl:template match="modifications/item">
          <tr>
             <td>
                <!-- Название модификации -->
                <a href="{/shop/path}{fullpath}{path}/">
                   <xsl:value-of disable-output-escaping="yes" select="name"/>
                </a>
             </td>
             <td>
                <!-- Цена модификации -->
                <xsl:value-of disable-output-escaping="yes" select="price"/>&#xA0;
                <!-- Валюта -->
                <xsl:value-of disable-output-escaping="yes" select="currency"/>
             </td>
          </tr>
       </xsl:template>
       
       <!-- Шаблон для скидки -->
       <xsl:template match="discount">
          <br/>
          <xsl:value-of disable-output-escaping="yes" select="name"/>&#xA0;
          <xsl:value-of disable-output-escaping="yes" select="value"/>%</xsl:template>
       
       <!-- ======================================================== -->
       <!-- Шаблон выводит рекурсивно ссылки на группы инф. элемента -->
       <!-- ======================================================== -->
       
       <xsl:template match="group" mode="goup_path">
          <xsl:param name="parent_id" select="@parent"/>
          
          <!-- Получаем ID родительской группы и записываем в переменную $parent_group_id -->
          <xsl:param name="parent_group_id" select="/shop/@current_group_id"/>
          
          <xsl:apply-templates select="//group[@id=$parent_id]" mode="goup_path"/>
          
          <xsl:if test="@parent=0">
             <a href="{/shop/path}">
                <xsl:value-of disable-output-escaping="yes" select="/shop/name"/>
             </a>
          </xsl:if>
          
          <img src="/images/arrow_path.gif" class="arrow_path"/>
          
          <!-- ============================================================================================== -->
          <!-- Если ID группы, для которой выводим список элементов, равен ID текущей группы - выводим жирным -->
          <!-- ============================================================================================== -->
          <xsl:if test="$parent_group_id=@id">
             <a href="{/shop/path}{fullpath}">
                <b>
                   <xsl:value-of disable-output-escaping="yes" select="name"/>
                </b>
             </a>
          </xsl:if>
          
          <!-- ============================ -->
          <!-- Иначе выводим обычную ссылку -->
          <!-- ============================ -->
          <xsl:if test="$parent_group_id!=@id">
             <a href="{/shop/path}{fullpath}">
                <xsl:value-of disable-output-escaping="yes" select="name"/>
             </a>
          </xsl:if>
       </xsl:template>
    </xsl:stylesheet>

    Вот и все

  2. Lightbox - увеличение картинок по клику.
    Я уже приводил пример с highslide, но раз уж мы подключили jQuery, то будем использовать его по максимуму.
    Найдено тут http://www.no-margin-for-errors.com/projects/prettyPhoto-jquery-lightbox-clone/
    Демо там же, либо на любой страничке товара на http://shop.tuningster.ru
    Бедем считать что библиотеку jQuery мы уже подключили. Если нет - смотри выше.

    • Скачиваем по ссылке выше библиотеку, js и css кидаем в папку js, а images в images. В css я заменил путь "../images/" на "/images/" . Подключаем.
      <link rel="stylesheet" href="/js/css/prettyPhoto.css" type="text/css" media="screen" charset="utf-8" />
         <script src="js/jquery.prettyPhoto.js" type="text/javascript" charset="utf-8"></script>

    • Теперь надо добавить к картинкам в XSL rel="prettyPhoto" везде, где надо. Например, в в просмотре товара:
      <!-- Изображение для товара, если есть -->
                        <xsl:if test="small_image != ''">
                           <div style="float: left; width: {small_image/@width}px; margin: 0px 10px 10px 0px;">
                              <a rel="prettyPhoto" href="{image}" title="{name}" alt="{name}" width="{image/@width}" height="{image/@height}">
                                 <img src="{small_image}" style="margin: 0px 5px 5px 0px" alt="{name}"/>
                              </a>

      И ниже - вызов функции
      <script type="text/javascript" charset="utf-8">
            $(document).ready(function(){
               $("a[rel^='prettyPhoto']").prettyPhoto();
            });
         </script>

    • Небольшая доработка от меня - чтобы название было по-ширине картинки. Открываем файл скрипта, находим
      {$ppt.css({top:$pp_pic_holder.offset().top-22,left:$pp_pic_holder.offset().left+(W.padding/2),display:"none"}
      и заменяем на
      {$ppt.css({width:$pp_pic_holder.width(),top:$pp_pic_holder.offset().top-30,left:$pp_pic_holder.offset().left+(W.padding/2),display:"none"}

      И в css меняем размер шрифта .ppt на 11px.

    Все, если все пути верные, должно работать. Добавить rel="prettyPhoto" нужно ко всем картинкам, которые хотите залайтбоксить. Если хотите сделать перелистывание среди картинок на странице, то добавлять надо rel="prettyPhoto[gallery]". Также у скрипта есть темы и настройки. Если интересно, смотрите оригинал руководства.
http://www.aiventa.ru
#
Re: Используем jQuery для улучшения юзабилити сайта
"

Это вкладки, которые я делал для сайта http://www.cheapbay.ru , посмотреть можно там же.

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

Идем и скачаваем библиотеку jQuery, если она еще у вас не подключена. Копируем библиотеку, к примеру, в папку /js на хостинге.

Открываем макет сайта, в <head> вставляем вызов, где jquery-1.3.2.min.js — название скачанной выми библиотеки:

<script src="/js/jquery-1.3.2.min.js"></script>
<script>  
    // When the document loads do everything inside here …
    $ (document).ready (function (){      
      // When a link is clicked
      $ ( "a.tab").click (function () {
         // switch all tabs off
         $ (".active").removeClass ( "active");
         // switch this tab on
         $ (this).addClass ( "active");      
         // slide all content up
         $ (".content").slideUp ();        
         // slide this content up
         var content_show = $ (this).attr ( "title");
         $ ("#"+content_show).slideDown ();
      });
    });
</script>

Далее, в макете или шаблоне страницы создадим нужную разметку:

<div id= "tabbed_box_1">
   <h2>Витрина <small>Переключайте вкладки</small></h2>

<ul>
   <li><a href="#" title= "content_1">Новинки</a></li>
   <li><a href="#" title= "content_2">Просматриваемые</a></li>
   <li><a href="#" title= "content_3">Покупаемые</a></li>
   <li><a href="#" title= "content_3">Популярные</a></li>
   </ul>

<div id= "content_1">Код вызова 1</div>
<div id= "content_2">Код вызова 2</div>
<div id= "content_3">Код вызова 3</div>
<div id= "content_4">Код вызова 4</div>
</div>



Здесь я вставлю нужные мне коды вызова витрины с сортировкой в каждый таб:

   1. Новинки
      <?php
       $shop = & singleton ('shop';

       $param = array ();
       $param['items_order']='Desc';
       $param['items_field_order']='shop_items_catalog_date_time';
       $param['current_group_id'] = false;
       $param['items_on_page'] = 12;
       $param['xml_show_group_type'] = 'all';
       $shop->ShowShop ('9','МагазинКаталогТоваровНаГлавной',$param);
      ?>                    
   2. Просматриваемые
      <?php
       $shop = & singleton ('shop';

       $param = array ();
       $param['items_order']='Desc';
       $param['items_field_order']='shop_items_catalog_show_count';
       $param['current_group_id'] = false;
       $param['items_on_page'] = 6;
       $param['xml_show_group_type'] = 'all';
       $shop->ShowShop ('9','МагазинКаталогТоваровНаГлавной',$param);
      ?>                    
   3. Покупаемые    
      <?php
      $param = array ();

      $element['type'] = 0; // 0 — основное св-во, 1 — дополнительное
      $element['name'] = 'shop_items_catalog_table.shop_shops_id';
      $element['prefix'] = " AND
      shop_items_catalog_table.shop_items_catalog_item_id =
      shop_order_items_table.shop_items_catalog_item_id
      AND
      shop_order_items_table.shop_order_id=
      shop_order_table.shop_order_id
      AND
      shop_order_table.shop_order_status_of_pay = 1 AND ";

      $element['if'] = '='; // Условие
      $element['value'] = '1';  
      $element['sufix'] = ' GROUP BY shop_order_items_table.shop_items_catalog_item_id';
      $param['select'][] = $element;

      $param['items_field_order'] = 'COUNT (shop_order_items_table.shop_items_catalog_item_id) ';
      $param['items_order'] = 'DESC';

      $param['current_group_id'] = false;

      $param['items_begin'] = 0;

      $param['items_on_page'] = 10;

      $param['sql_from'] = ", shop_order_items_table, shop_order_table";

      $shop = new shop ();

      $shop->ShowShop (1, 'МагазинКаталогТоваровНаГлавнойСпецПред', $param);
      ? >
   4. Популярные
      <?php
       $shop = & singleton ('shop';

       $param = array ();
       $param['items_order']='Desc';
       $param['items_field_order']='shop_comment_grade';
       $param['current_group_id'] = false;
       $param['items_on_page'] = 6;
       $param['xml_show_group_type'] = 'all';
       $shop->ShowShop ('9','МагазинКаталогТоваровНаГлавной',$param);
      ?>

Теперь остается только прописать стили для этого всего. Их вы можете взять для примера с моего сайта, блок css /* Tabs

http://www.cheapbay.ru/articles/hostcms/jquery-tabs/
http://www.aiventa.ru
#
Re: Используем jQuery для улучшения юзабилити сайта
Большое спасибо за примеры!
Не могли бы вы так же подробно описать, как вы сделали меняющиеся товары справа ("Обратите внимание"? Насколько большой там может быть выборка? И можно ли сделать их смену помедленнее?
http://superweb.pro/ — сайты на HostCMS под ключ
#
Re: Re: Используем jQuery для улучшения юзабилити сайта
Обратите внимание - это просто рандомные товары. Пример есть на форуме. Выборку большой делать не стоит, потому что если скрипты у пользователя отключены, он получит длинный столбец. Проверьте в IE.
Смену можно. За это отвечает параметр interval = interval || 4000;
http://www.aiventa.ru
#
Re: Используем jQuery для улучшения юзабилити сайта
hell0men,
Доброго времени. Подскажите где копать оформление блоков с товаром на главной как у Вас здесь в tabs
http://www.cheapbay.ru/

Спасибо!
#
Re: Используем jQuery для улучшения юзабилити сайта
http://www.cheapbay.ru/articles/hostcms/jquery-tabs/ вот тут есть полное руководство.
http://www.aiventa.ru
#
Re: Используем jQuery для улучшения юзабилити сайта
hell0men,
Спасибо, видимо не так задал вопрос, табы сделаны - не подскажете как вы вывели товар в несколько колонок и как правили шаблон блока с товаром?
#
Re: Используем jQuery для улучшения юзабилити сайта
Ничего сложного. Смотрите разметку и css.
Добавить только для перевода строки
<xsl:if test="position() mod 4 = 0"><br class="clear"/></xsl:if>

Это тоже было сто раз на форуме.
http://www.aiventa.ru
#
Re: Используем jQuery для улучшения юзабилити сайта
hell0men,
Спасибо за Ваши ответы,но или глаз уже замылен или руки у меня из ж...) Куда я только не ставил ваш пример кода ( в 89.xsl шаблон - это ведь он отвечает за вывод на главной?) - не бьётся на колонки как у вас на сайте. Можете назвать строку кода или приложить полностью код шаблона?
Спасибо огромное заранее!
#
Re: Используем jQuery для улучшения юзабилити сайта
У меня отдельный шаблон для Каталога на Главной для табов.
http://www.aiventa.ru
Авторизация