Корзина для сайта магазина с помощью CSS и JavaScript
В этом руководстве мы продемонстрируем как создать корзину для интернет-магазина с использованием HTML и CSS3 . При этом мы применим Google Fonts ( шрифт « Roboto » ).
HTML
Шаг 1: Создадим HTML-структуру
Сначала нужно создать контейнер div , который мы назовем « .shopping-cart ».
Внутри него у нас будет заголовок и три пункта, которые будут содержать:
Кнопку « Удалить » и кнопку « Добавить в избранное »;
Изображение товара;
Название и описание товара;
Кнопки, с помощью которых можно задавать количество товара;
Итоговую цену.
Shopping Bag
Common ProjectsBball HighWhite
$549
Maison MargielaFuture SneakersWhite
$870
Our LegacyBrushed ScarfBrown
$349
CSS
Убедитесь, что при создании корзины для сайта на PHP вы подключили шрифт, который мы используем в этом руководстве. Теперь добавим основные стили для раздела body :
* < box-sizing: border-box; >html, body
После этого создадим корзину с размерами 750 на 423 пикселя и зададим для нее стили. Обратите внимание, что мы используем flexbox , поэтому устанавливаем для свойства display значение flex , а для flex-direction – column . Потому что по умолчанию для flex-direction установлено значение row :
.shopping-cart
Теперь создадим первый элемент корзины для сайта на JavaScript , который будет названием товара. Для этого изменим значение высоты на 60 пикселей и зададим несколько основных стилей. Следующие три элемента — это товары в корзине. Для каждого из них мы установим высоту 120 пикселей и display: flex :
Следующий элемент скрипта корзины для сайта HTML — это изображение товара, для которого нужно задать поле справа 50 пикселей:
.image < margin-right: 50px; >Let’s add some basic style to product name and description. .description < padding-top: 10px; margin-right: 60px; width: 115px; >.description span < display: block; font-size: 14px; color: #43484D; font-weight: 400; >.description span:first-child < margin-bottom: 5px; >.description span:last-child
Далее нужно задать стили для количества приобретаемого товара: кнопки для увеличения и уменьшения количества. Сначала мы создадим CSS корзины покупок для сайта, а затем заставим его работать с помощью JavaScript :
Теперь заставим работать кнопки количества приобретаемого товара:
$('.minus-btn').on('click', function(e) < e.preventDefault(); var $this = $(this); var $input = $this.closest('div').find('input'); var value = parseInt($input.val()); if (value > 1) < value = value - 1; >else < value = 0; >$input.val(value); >); $('.plus-btn').on('click', function(e) < e.preventDefault(); var $this = $(this); var $input = $this.closest('div').find('input'); var value = parseInt($input.val()); if (value < 100) < value = value + 1; >else < value =100; >$input.val(value); >);
И это наша окончательная версия корзины товаров для сайта :
Руководство завершено! Надеюсь, оно вам понравилось, и вы узнали что-то новое. Если у вас есть вопросы, напишите об этом в комментариях!
Скрипт корзины для лендинга
06.11.22. Друзья, с радостью сообщаю, что начинаю разработку новой версии корзины (SmartBasket). Теперь это будет каталог товаров с удобным редактированием из админки. Многие просили упростить этот процесс и сделать более наглядным.
В связи с этим к вам есть небольшая просьба. Если у вас есть какие-то идеи, советы или пожелания – добавляйтесь в телеграм-чат. Так я пойму, что Smartbasket действительно кому-то нужен и есть смысл развивать проект. Будем голосовать за новый функционал, общаться и вместе делать корзину лучше. Хочется делать продукт не «в стол», а чтобы он реально было полезен людям.
Если за 2 месяца наберется более 150 человек, то буду продолжать развивать проект, добавляя новые функции и возможности. Если окажется, что потребности в корзине нет, то закончу минимально-рабочую версию и займусь чем-то новым.
Скрипт, который описан в статье ниже больше не поддерживается.
Всем, привет. Многие слышали, что я начал разрабатывать свой скрипт корзины для лендинга. На блоге уже была статья на эту тему, но я использовал готовое решение другого автора.
Сначала все прекрасно работало, но, примерно год назад, многие начали жаловаться, что корзина не работает. Связано это было с тем, что часть файлов, необходимых для работы скрипта лежали на сервере у разработчика, который время от времени «падал», причем не на короткое время, а на недели. Конечно читателей это не устраивало. Кроме того, некоторые писали и об ошибках работы самой логики скрипта, связанной с подсчетом цены при удалении товара из корзины.
Сначала я рекомендовал написать напрямую автору скрипта, но позже решил заняться разработкой корзины самостоятельно, так как многие об этом просили. Появилось немного времени, и я на скорую руку собрал минимальный функционал корзины.
Назвал скрипт SmartBasket и в этой статье хочу поделиться им с вами. Если он окажется полезным и интересным для вас, то напишите мне, пожалуйста, в комментариях свой отзыв (чего не хватает конкретно вам, что улучшить, какой функционал добавить и т.д.). Так я пойму, что скрипт корзины действительно нужен и будет стимул его развивать.
Демонстрация работы скрипта
Как подключить корзину
Для подключения скрипта, скачайте архив с этой страницы и поместите папку smartbasket в корень вашего сайта.
Так как скрипт использует jQuery, то убедитесь, что он у вас подключен.
После подключения jQuery (обычно перед закрывающим тегом body) подключаем и инициализируем скрипт, там же добавим div, в котором и будет располагаться основная корзина.
Не забываем подключить и таблицу стилей:
Настройки корзины
С подключением закончили, теперь давайте займемся настройкой.
Сразу хочу сказать, что при разработке скрипта я ориентировался на то, чтобы, практически, никак не влиять на внешний вид вашего сайта. Не подключал никаких шрифтов, не писал стилей для карточек и т.д. Старался сделать так, чтобы по минимуму влиять на внешний вид вашего сайта.
Итак, первое что мы сделаем — это укажем нашему скрипту обертку вашей карточки товара.
Для этого, в месте, где инициализировали скрипт указываем класс обертки карточки в параметре ‘productElement‘:
product__element — и есть класс моего блока с карточкой.
На следующем шаге нужно указать скрипту класс кнопки, которая будет отправлять товар в корзину, для этого воспользуемся параметром «buttonAddToBasket»:
У кнопки есть несколько обязательных атрибутов, в которых и хранятся основные данные о товаре.
data-sb-id-or-vendor-code — артикул или id товара;
data-sb-product-name — название товара;
data-sb-product-price — цена, разделенная точкой, если есть копейки;
data-sb-product-quantity — количество, по умолчанию укажите 1;
data-sb-product-img — полный путь к картинке;
Не обязательные атрибуты:
data-sb-product-size — размер. Задается, если вы используете опцию вывода размера в карточке товара. Подробнее о том, как это сделать в инструкции ниже.
Пример кнопки
Обратите внимание, что все атрибуты обязательны для заполнения. Если у вас нет артикула, то просто задайте уникальный набор цифр.
Следующим параметром, который мы настроим будет маска ввода номер телефона «countryCode». По умолчанию сейчас маска для Украины с первыми цифрами ‘+38‘, но вы можете поставить, ‘+7‘ или любые другие цифры.
Пока можно менять только их, но, если вы хотите иметь полный контроль над всеми цифрами, напишите мне и я сделаю.
Теперь укажем валюту, которую хотим использовать в корзине. Для этого есть параметр smartBasketCurrency, в который можно положить один из значков валют:
Если ваша карточка товара предусматривает выбор количества товара, добавляемого в корзину, то укажите класс элемента где будет располагаться блок выбора количества в параметре ‘productQuantityWrapper‘. Например, я хочу, чтобы выбор количества располагался в теге div с классом ‘product__quantity’.
После добавления параметра ‘productQuantityWrapper’ cо значением ‘product__quantity’, кнопки выбора количества автоматически появятся на сайте в указанном блоке.
Выбор размера в карточке
Недавно появилась возможность добавлять размер, который в свою очередь, может влиять и на цену. Например, в интернет-магазине продают 3 размера пиццы — 32 см, 26 см или 16 см. От радиуса зависит и цена. Вы хотите, чтобы в карточке пользователь мог выбрать нужный размер.
Давайте я немного поясню суть работы. Вот так выглядит верстка блока с выбором размера у меня:
32 см
26 см
22 см
Для работы скрипта здесь важны атрибуты «data-sb-curent-price» и «data-sb-curent-size» и «data-sb-curent-id-or-vendor-code» так как в них содержаться параметры для подстановки цены, размера и артикула. То есть при размере 32 см, цена пиццы 320 рублей, при размере 22 см — цена пиццы 220 рублей и т.д. Если цена при любом размере остается одинаковой, просто укажите везде одну и туже стоимость. Аналогичная ситуация и с артикулом. Или укажите везде одинаковый, или вообще не используйте атрибут «data-sb-curent-id-or-vendor-code», если не планируете давать возможность добавлять один и тот же товар с разными характеристиками.
Чтобы цена в карточке менялась, нужно обернуть число с ценой в отдельный блок, например, span, со своим классом. У меня это выглядит так:
Теперь класс обертки «product__size» для блока с размерами и класс обертки цены «product__price-number» нужно передать в настройки скрипта:
Теперь при клике на элемент с размером из «data-sb-curent-price» подставится цена в «product__price-number». Если не совсем понятно, напишите мне, попробую разъяснить.
Последняя настройка, которая сейчас доступна это вывод мини-корзины. То есть кнопки, которая отображает статус корзины (показывает текущее количество товара в корзине) и вызывает, при нажатии на нее, модальное окно с основной корзиной.
Я специально не задавал никаких стилей и ей, чтобы у вас был полный контроль если не над всей корзиной, то над максимальным количеством ее элементов. Принцип вывода, похож на настройку предыдущего поля. Нужно указать класс элемента, в котором отобразится кнопка в параметре ‘smartBasketMinArea‘.
Кроме того, у вас есть возможность задать текст в кнопке, перед иконкой корзины и изменить саму иконку. Делается это при помощи параметров smartBasketMinText и smartBasketMinIconPath.
Для настройки отступов и внешнего вида, иконка и текст обернуты в теги с классами «smart-basket__min-icon» и «smart-basket__min-text».
Настройка почты для отправки
Для настройки отправки почты, нужно открыть файл config.php, который находится в папке /smartbasket/php/
Здесь нас интересуют 2 строки:
const SENDER = ‘sender@yandex.ru’;
const CATCHER = ‘catcher@list.ru’;
SENDER — это адрес, с которого будет отправляться письмо. CATCHER — адрес на который будет приходить письмо. Обратите внимание, что адрес отправителя должен быть реальными, чтобы не возникало проблем с доставкой.
SMTP
Если у вас возникают проблемы с отправкой формы, то воспользуйтесь SMTP протоколом передачи почты. Для этого в одном из последних обновлений я добавил специальные константы:
Раскомментируйте эти строки и заполните в соответствии с вашим почтовым сервисом. Возникнут вопросы — пишите.
Обязательность полей для заполнения пользователем
В новом обновлении, как вы и просили, добавил еще одно поле для связи (email), теперь, если кому-то накладно звонить в другие регионы, они могут сделать обязательным поле для заполнения почты. По умолчанию обязательным оставил только телефон, но вы можете это исправить в настройках. Для этого предусмотрено 2 параметра:
telIsRequired
emailIsRequired
Чтобы сделать обязательным поле, поставьте ему значение «true». Чтобы сделать необязательным, укажите «false». Все это выглядеть может так:
Пока это все, что есть. Да, впереди еще много работы и много идей. Будет больше проверок, больше функций, больше возможностей. Много раз еще придется переписать все и оптимизировать. Пока, это тестовый вариант, чтобы понять нужен ли кому-то подобный скрипт и насколько он актуален. Все пожелания и предложения пишите в комментариях, буду рад любой обратной связи и постараюсь улучшать функционал по мере свободного времени.
Надеюсь, что ничего не упустил, если что — пишите!
Если нужна видео-инструкция с описанием процесса установки настройки, напишите в комментариях, я попробую сделать.
06.11.22. Друзья, с радостью сообщаю, что начинаю разработку новой версии корзины (SmartBasket). Теперь это будет каталог товаров с удобным редактированием из админки. Многие просили упростить этот процесс и сделать более наглядным.
В связи с этим к вам есть небольшая просьба. Если у вас есть какие-то идеи, советы или пожелания – добавляйтесь в телеграм-чат. Так я пойму, что Smartbasket действительно кому-то нужен и есть смысл развивать проект. Будем голосовать за новый функционал, общаться и вместе делать корзину лучше. Хочется делать продукт не «в стол», а чтобы он реально было полезен людям.
Если за 2 месяца наберется более 150 человек, то буду продолжать развивать проект, добавляя новые функции и возможности. Если окажется, что потребности в корзине нет, то закончу минимально-рабочую версию и займусь чем-то новым.
Скрипт, который описан в статье выше больше не поддерживается.
06/11/2022 Дмитрий Давыдов
474 комментария
Дмитрий, с настройкой почты не получается, как правильно настроить отправку почты?
Добрый день! Спасибо большое за корзину. Я делаю небольшой проект по инжинирингу данных и это именно то, что нужно. Но вот беда: при увеличении/уменьшении количества товаров напрямую из корзины, не пересчитывается количество товаров (sbQuantity) и (sbPriceCommon) у каждого элемента в коллекции e в функции commonResult. И у t в функции updateBasket то же самое. При этом количество и сумма по отдельной позиции работает отлично, а общее количество и сумма пересчитываются при удалении строки с товаром из корзины. Видел демо, пробовал там ставить брейкпоинты на интересующих местах, это не помогло, перекидывает в код jQuery. jQuery подключал разные версии. Может быть дело совсем не там, где я ищу, я js никогда не видел раньше и очень тяжело разбираться, поэтому нужна помощь хотя бы в какую сторону копать. Я немного код под свои нужды как мог переделал в некоторых небольших местах, где теги формируются, но тоже не из-за этого. Возможно дело в вёрстке, буду разбираться дальше. ПС: Оставлю комментарий, если кто-то ещё упорется как я. Всё нормально и с вёрсткой и скрипт прекрасно работает. Вот это место: data-sb-id-or-vendor-code=»<< el.id >>» Дело в том, что айдишник товара у меня в базе — число и jinja в шаблоне «<< el.id >>» подставляет в этот параметр именно число, а не строку. И из-за этого всё ломается. Приведение к строке в шаблоне не помогло «<< el.id|string >>» . Но помог вариант с добавлением пробела «<< el.id|string + ' '>>». Но обнаружил, что джаваскрипт это довольно забавно и нашёл эту строчку. let r = t(this).data(«sbId») Мои полдня мучений закончились 😀 Смотрите, как теперь могу: let r = t(this).data(«sbId»).toString()<>
Создаем корзину для сайта
В этом уроке разберем, как можно создать корзину для сайта. Рассмотрим основные моменты. У нас будет страница с товарами, где для каждого товара будет кнопка купить со своим id, при клике на кнопку мы будем делать Ajax-запрос к php скрипту. В этом php файле будем создавать сессию корзины. Ну и напоследок сделаем страницу нашей корзины для сайта, где также при помощи Ajax-запросов можно будет менять количество товаров или удалять товар из корзины.
Вот наша страница с товарами:
Корзина для сайта
Товар 1
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae, modi!
Товар 2
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae, modi!
Товар 3
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae, modi!
Теперь напишем скрипт обработки клика на кнопку, в котором мы получим id кнопки, который является кодом нашего товара и отправим его аякс запросом в файлик addtocart.php.
Также добавим на нашу страницы ссылку на корзину со счетчиком товаров.
Теперь создадим наш файл addtocart.php, где мы будем получать данные от аякс-запроса, открывать сессию корзины и записывать в нее добавленный товар. Сессия корзины будет у нас в виде массива, где индексами будут id наших товаров, а значения количество товаорв. При добавлении товара будем устанавливать количество 1, которое можно будет менять на странице корзины.
else/если в сесии корзины уже есть товары $temp = $_SESSION['cart'];//заносим в масив старую сесию if (!array_key_exists($id, $temp)) /проверяем есть ли в корзине уже такой товар $temp[$id] = 1; //в масив заносим количество тавара 1 > > $count = count($temp);//считаем товары в корзине $_SESSION['cart'] = $temp;//записывае в сесию наш масив echo $count; //возвращаем количество товаров ?>
Теперь сделаем страницу корзины cart.php. Мы будем выводить товары в виде таблицы:
input с количеством
У себя по id товара можете вытаскивать из базы информацию о товаре, для отображения названия, картинки, цены…
Вот код нашей корзины:
Корзина
Ваша корзина пуста
id
количество
Удалить
$kol): ?>
id товара:
">
Теперь подключим на нашу страницу корзины jqery и напишем скрипт отбработки изменения количества и кнопки удалить. Тут мы также будем делать аякс-запрос к нашим php-обработчикам, где будет меняться сессия корзины.
Осталось написать два php обработчика. В cartamount.php мы будем изменять количество товаров в нашей сессии, а в cartdel.php удалять в сессии запись с нужным id . Начнем с cartamount.php
Теперь в нашей сессии изменено количество и если обновим страничку корзины, то количество товаров сохранится. Теперь создадим обработчик удаления товара cartdel.php
$_SESSION['cart'] = $temp; //сохраняем сессию ?>
Вот и все наша корзина для сайта готова, теперь можно создавать кнопку «оформить заказ» и там уже работать с нашей сессией корзины.
Верстка компонентов корзины
Корзина состоит из двух компонентов — кнопки для вызова окна, а также всплывающего окно самой корзины.
Кнопка корзины
Представляет из себя круглую кнопку с изображением корзины. В правом верхнем углу находится счетчик выбранных товаров. Обязательно нужно сделать кнопку фиксированной, чтобы пользователь ее постоянно видел при прокрутке страницы.
Разметка для кнопки корзины:
Изображение корзины есть в исходнике проекта на GitHub
Стили для кнопки корзины:
.cart < width: 75px; height: 75px; border-radius: 50%; background-color: #364364; transition: 0.1s; cursor: pointer; position: fixed; /* Фиксированное расположение */ top: 50px; /* в правом верхнем углу */ right: 50px; display: flex; justify-content: center; align-items: center; object-fit: contain; padding: 15px; box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.1); >/* Увеличиваем кнопку при наведении на нее */ .cart:hover < transform: scale(1.1); >/* Стилизуем счетчик товаров */ .cart__num
Окно оформления заказа
Представляет из себя список выбранных товаров с ценами и кнопками удалить. Внизу находится информация по стоимости заказа и скидки.
В начале напишем две вспомогательные функции: toNum и toCurrency.
function toNum(str) < const num = Number(str.replace(/ /g, "")); return num; >function toCurrency(num) < const format = new Intl.NumberFormat("ru-RU", < style: "currency", currency: "RUB", minimumFractionDigits: 0, >).format(num); return format; >
Функция toNum принимает строковый параметр и удаляет в нем все пробелы, затем преобразует его в число с помощью встроенной функции Number. Эта функция полезна для преобразования строк цен в числовые значения, которые можно использовать для расчетов.
Функция toCurrency форматирует число в строку валюты с использованием символа российского рубля.
Класс Product представляет товар с некоторыми свойствами, такими как источник изображения, название, цена и цена со скидкой. У него есть конструктор, который принимает параметр card, который будет HTML-элементом, представляющим карточку продукта на веб-странице.
Конструктор инициализирует свойства объекта Product, запрашивая параметр card для определенных элементов с помощью CSS-селекторов и извлекая соответствующую информацию из этих элементов. Например, свойство imageSrc устанавливается путем получения исходного URL-адреса первого дочернего элемента с классом card__image внутри параметра card.
Класс для корзины
Класс для описания корзины покупок и расчета стоимости и скидок.
Класс Cart, который представляет корзину покупок. У него есть конструктор, который инициализирует пустое свойство массива products.
Класс имеет методы для добавления и удаления товаров из корзины, которые изменяют массив products, добавляя или удаляя данный товар по указанному индексу.
Также определены три метода получения для стоимости корзины, стоимости со скидкой и скидки со скидкой. Эти методы вычисляют соответствующие значения путем перебора массива products и суммирования цен или скидок на каждый продукт.
Вспомогательная функция toNum используется для преобразования строк цен в числовые значения.
Создаем объект корзины и сохраняем его в localStorage
Этот код инициализирует новый экземпляр класса Cart и присваивает его переменной myCart. Затем он проверяет, есть ли какие-либо данные, хранящиеся в локальном хранилище браузера под ключом cart. Если таких данных нет, он сохраняет версию объекта myCart в формате JSON в локальном хранилище.
Далее код извлекает данные из локального хранилища под ключом «card» и преобразует их обратно в объект с помощью JSON.parse(). Затем проанализированный объект присваивается переменной savedCart.
Наконец, массив products из savedCart присваивается массиву products из myCart, а значение свойства count из myCart используется для обновления текстового содержимого элемента cartNum.
Обратите внимание, что этот код предполагает, что класс Cart имеет свойства products и count, и что переменная cartNum представляет элемент в DOM, который отображает количество товаров в корзине.
Этот код добавляет прослушиватель событий к каждому элементу в массиве cardAddArr, который содержит элементы DOM, представляющие кнопки cardAdd на веб-странице. Когда пользователь нажимает одну из этих кнопок, вызывается функция прослушивания.
Функция прослушивателя сначала предотвращает действие события click по умолчанию, используя e.preventDefault(). Затем он находит ближайший элемент .card к нажатой кнопке, используя метод closest().
Код создает новый экземпляр продукта, используя элемент card, извлекая информацию из card для создания объекта product.
Далее код извлекает сохраненные данные корзины из localStorage и присваивает свой массив products свойству myCart.products. Затем он добавляет объект product в экземпляр myCart, используя свой метод addProduct.
После добавления товара в корзину код сохраняет обновленный объект myCart в localStorage в виде строки JSON с помощью JSON.stringify(). Наконец, он обновляет текстовое содержимое элемента cartNum, чтобы отобразить новое количество товаров в корзине, используя свойство myCart.count.
Этот код определяет функцию popupContainerFill(), которая заполняет всплывающий контейнер информацией о продукте из корзины покупок, хранящейся в локальном хранилище.
Функция сначала извлекает данные корзины из локального хранилища, а затем сопоставляет массив продуктов корзины, чтобы создать новый массив элементов HTML, представляющих каждый продукт в корзине. Каждый элемент продукта создается путем создания вложенных элементов div, которые содержат изображение продукта, заголовок, цену и кнопку удаления.
При нажатии кнопки удаления для данного продукта запускается прослушиватель событий, который удаляет этот продукт из корзины, вызывая метод myCart.removeProduct(), обновляет информацию о корзине в локальном хранилище, а затем обновляет всплывающий контейнер с обновленными данными. информацию о корзине, снова вызвав popupContainerFill().
Наконец, функция устанавливает значение полей общей стоимости, скидки и стоимости со скидкой во всплывающем контейнере, чтобы отразить обновленную информацию о корзине.