Amazon-подобный интерфейс для выбора размера и цвета товара (то есть, щелкните маленькое красное поле, чтобы выбрать красный товар и т. Д.) - PullRequest
2 голосов
/ 05 апреля 2009

В моем интернет-магазине я хочу реализовать интерфейс, подобный Amazon's , для выбора размера и цвета товара. То есть вместо переключателей для разных размеров / цветов пользователь должен увидеть несколько маленьких коробочек, каждая из которых содержит либо образец цвета, либо название размера. Когда пользователь щелкает поле, граница должна измениться, чтобы указать, что она выбрана.

Я уже использую jQuery, поэтому я подумал, что выбираемый виджет jQuery будет естественным способом реализовать это. К сожалению, кажется, что вы не можете контролировать максимальное количество элементов, которые может выбрать пользователь, и поэтому я не мог ограничить пользователей выбором одного цвета / размера в пользовательском интерфейсе.

Каков наилучший способ реализовать эту функциональность с помощью jQuery (если возможно)?

Ответы [ 4 ]

7 голосов
/ 13 апреля 2009

Вот как это сделать правильно, используя прогрессивное улучшение . Идея проста: превратить прилично размеченную HTML-форму в более приятные кнопки выбора цвета и размера для пользователей, которые имеют JavaScript.

Преимущества этого метода многочисленны, вы можете легко переключать или удалять компоненты (JS / CSS) и работать с формой. Он будет работать для пользователей, которые не поддерживают javascript, и, если мы будем осторожны, он будет доступен через программы чтения с клавиатуры и экрана. Это также не требует дополнительного кода при отправке, и будет намного проще использовать с валидатором формы.

Большая часть работы выполняется с использованием CSS с минимальным JavaScript для добавления завершающих штрихов.

Полный пример работы можно найти на jsbin . Включает выбор цвета и размера. Я включил здесь только цвета, так как между ними только небольшая разница в CSS.

HTML

Прежде всего, разметьте компоненты формы. Вот основы, вы, возможно, захотите добавить что-то вроде обертки вокруг всего виджета или использовать другие имена классов.

<label>Color</label>
<ul class="radio color">
  <li class="red">
    <input type="radio" name="color" id="color_red" value="red" />
    <label for="color_red">Red</label>
  </li>
  <li class="green">
    <input type="radio" name="color" id="color_green" value="green" />
    <label for="color_green">Green</label>
  </li>
  <!-- ...and so on... -->
</ul>

Это может показаться много для "основ", но здесь происходит несколько вещей. Весь контейнер UL помечается как «радио», поэтому все внутри может быть соответствующим образом нацелено с помощью CSS ("ul.radio label").

Дополнительно я добавляю класс, соответствующий имени ввода, и класс для каждого LI, повторяющего значение, чтобы CSS мог добавить соответствующие стили ("ul.color li.red"). Остальное - в значительной степени ваша стандартная разметка форм.

JavaScript

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

jQuery(function($){
  // notify CSS that JS is present
  $( 'body' ).addClass( 'js-active' );
  // for every radio control...
  $( 'ul.radio' )
    // redo every change
    .bind('click', function () {
      // refresh "current classes"
      $( 'li', this ).removeClass( 'selected' )
        .filter( ':has(:checked)' ).addClass( 'selected' );
    })
    // trigger initial run
    .trigger( 'click' );  
});

Обратите внимание: эта «хитрость» запуска клика для обеспечения начального запуска может быть небезопасной, если у вас выше обработчики кликов (обычно document.body), я использую этот метод для краткости.

CSS

Здесь происходит настоящее волшебство. Идея состоит в том, что мы можем убрать элементы управления вводом из вида и стилизовать метки как цветные кнопки. До тех пор, пока атрибуты for на ярлыках правильно указывают на id на входах, достаточно щелкнуть ярлыки, чтобы правильно выбрать элемент управления.

Нам нужно нацелиться на вещи только в пределах ".js-active", чтобы пользователи, у которых нет JavaScript, но все еще есть CSS, увидели элементы радиовхода. Какой-то класс ".radio-js" может быть альтернативно добавлен в оболочку UL, чтобы сделать то же самое.

Во-первых, плавайте кнопки и придавайте им более похожий на кнопки вид:

/* attributes are lined up horizontally */
ul.color li,
ul.size li {
  border : 1px solid #aaa;
  margin : 0 4px 0 0;
  padding : 2px;
  float : left;
  overflow : hidden;
  position : relative;
}

Мы помещаем position:relative и overflow:hidden на каждую LI, чтобы мы могли сместить элемент ввода вне поля зрения. Это сделает его доступным, но нам больше не нужно смотреть на него:

/* if JS: remove inputs from sight */
.js-active ul.color input,
.js-active ul.size input {
  position : absolute;
  left : -999em;
}

Далее следует превратить метки в кнопки:

/* if JS: turn color labels into buttons */
.js-active ul.color label {
  cursor : pointer;
  display : block;
  height : 18px;
  width : 18px;
  text-indent : -999em; /* hide text */
}
/* color buttons in color -- allowed even if no JS */
ul.color li.red label   { background : red;   }
ul.color li.green label { background : green; }
ul.color li.blue label  { background : blue;  }

Наконец, установите несколько стилей для нашего выделенного / выбранного элемента.

/* if JS: current selected highlight */
.js-active ul.color .selected,
.js-active ul.size .selected {
  border : 2px solid #000;
  padding : 1px;
}

Для полноты: Получение значений выбора , если вы хотите добавить больше эффектов, продемонстрировано в другом месте на SO.

5 голосов
/ 11 апреля 2009

Можно выбрать jQuery для предотвращения выбора, хотя, к сожалению, это не очень интуитивно понятно:

$('#selectable').selectable({
   selected: function(event, ui) {
       var total = $(ui.selected).siblings('li.ui-selected').length + 1;
       if(total > 1) {
           $(ui.selected).removeClass('ui-selected');
       }
   }
});

Это остановит что-либо после того, как 1 выбор сделан на выбираемом виджете.

Остальные просто настраивают его под ваши конкретные потребности.

РЕДАКТИРОВАТЬ : Мне стало немного скучно, поэтому я реализовал еще немного, чтобы вы могли получить представление.

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

0 голосов
/ 12 апреля 2009

Человек, этот интерфейс Amazon уродлив. Я был бы соблазн попробовать что-то еще в духе:

Размеры должны быть достаточно легкими. Я бы, наверное, сделал маленькие картинки футболок разных размеров, вроде как здесь:

(это лучший пример выбора размера рубашки, который я мог найти, большинство мест довольно ужасные)

0 голосов
/ 12 апреля 2009

Если ваша цель - разрешить выбор только одного элемента, это будет сделано:

$(function() {
    $("#selectable").selectable({
        // this will prevent selecting a second item (for dragging\clicking)
        selecting: function(event,ui) {
            if ($(ui.selecting).siblings("li.ui-selecting").length > 0)
                $(ui.selecting).removeClass("ui-selecting");
        },
        // this will prevent selecting a second item (for CTRL+Click)
        selected: function(event,ui) {
            if ($(ui.selected).siblings("li.ui-selected").length > 0)
                $(ui.selected).removeClass("ui-selected");
        },
        // this will prevent un-selecting items (one item must be selected)
        unselected: function(event,ui) {
            if ($(ui.unselected).siblings("li.ui-selecting").length == 0)
                $(ui.unselected).addClass("ui-selected");
        }
    })
});

Этот код позволит выбрать один элемент, а также запретит выбор другого элемента путем перетаскивания мышью или нажатия клавиш CTRL +. Это также предотвратит отмену выбора пунктов. Это поведение очень похоже на то, что есть у Amazon.

Вы можете использовать событие stop для внесения изменений на странице после выбора элемента (аналогично примерам, которые поставляются с JQuery UI).

...