Руководство по использованию технологии перетащи-и-брось на jQuery. Часть 2 из 2.
В первой части урока мы рассмотрели общие принципы использования техники "перетащи-и-брось" в веб приложениях с использованием jQuery. Теперь создадим простую игру, в которой на практике будут использованы описанные ранее функции.
Описание игры
Мы построим простую детскую игру. Перед игроком предстанут 10 карт с номерами, расположенными в случайном порядке и 10 слотов. Цель игры - уложить все карты в слоты с соответствующими номерами.
Шаг 1. Разметка HTML
Код HTML для нашей игры очень прост:
<!DOCTYPE html> <html lang="ru"> <head> <title>Простая карточная игра | Материалы проекта RUSELLER.COM</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" type="text/css" href="/css/style.css"> <script type="text/javascript" src="/js/jquery.js"></script> <script type="text/javascript" src="/js/jquery-ui.js"></script> <script type="text/javascript"> // Код JavaScript размещаем здесь </script> </head> <body> <div id="content"> <div id="cardPile">...</div> <div id="cardSlots">...</div> <div id="successMessage"> <h2>Вы сделали это!</h2> <button onclick="init()">Играть снова</button> </div> </div> </body></html>
В разделе head
подключаются библиотеки jQuery и jQuery UI, а также файл style.css
, который мы сформируем на шаге 4. Также добавлен элемент script
для нашего JavaScript кода (который будет разбираться ниже).
В разделе body
у нас есть:
- Элемент
div
"#content"
- контейнер для игры. - Элемент
div
"#cardPile",
который содержит набор из 10 карт, расположенных в случайном порядке. - Элемент
div
"#cardSlots",
который содержит 10 слотов для карт. - Элемент
div
"#successMessage"
для вывода сообщения об успешном завершении игры и кнопки перезапуска (элементы скрываются при инициализации страницы).
Шаг 2. Функция init()
Данная функция производит первоначальные установки игры:
var correctCards = 0; $( init ); function init() { // Скрываем сообщение об успешном завершении $('#successMessage').hide(); $('#successMessage').css( { left: '580px', top: '250px', width: 0, height: 0 } ); // Сбрасываем игру correctCards = 0; $('#cardPile').html( '' ); $('#cardSlots').html( '' ); // Создаем набор случайно разложенных карт var numbers = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; numbers.sort( function() { return Math.random() - .5 } ); for ( var i=0; i<10; i++ ) { $('<div>' + numbers[i] + '</div>').data( 'number', numbers[i] ).attr( 'id', 'card'+numbers[i] ).appendTo( '#cardPile' ).draggable( { containment: '#content', stack: '#cardPile div', cursor: 'move', revert: true } ); } // Создаем слоты карт var words = [ 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять', 'десять' ]; for ( var i=1; i<=10; i++ ) { $('<div>' + words[i-1] + '</div>').data( 'number', i ).appendTo( '#cardSlots' ).droppable( { accept: '#cardPile div', hoverClass: 'hovered', drop: handleCardDrop } ); } }
Рассмотрим код подробно:
- Инициализация переменной
correctCards
Сначала мы объявляем переменнуюcorrectCards
для отслеживания количества правильно размещенных карт. Когда оно достигнет 10 - игра завершена. - Вызываем функцию
init()
, когда документ готов Используем$( init )
для вызова функцииinit()
сразу после загрузки DOM - Скрываем сообщение о завершении игры В функции
init()
первым делом скрываем элементdiv
#successMessage
и уменьшаем его ширину и высоту до 0, так что он будет "выскакивать" при успешном завершении игры. - Сбрасываем игру Так как функция
init()
может быть вызвана после завершения игры, мы устанавливаем значение 0 в переменнуюcorrectCards
и очищаем элементыdiv
#cardPile
и#cardSlots
, чтобы их заполнить новыми элементами. - Создаем набор перемешанных карт Для создания набора карт сначала мы объявляем массив
numbers
с цифрами от 1 до 10, а затем сортируем его в случайном порядке для перемешивания цифр. Затем мы проходим циклом по массивуnumbers
и для каждого числа создаем элементdiv
карты. В данном элементеdiv
мы размещаем число, так что оно появляется на карте на странице. Как только объектdiv
создан, мы сохраняем номер карты с ключом'number'
в объекте с помощью метода jQuerydata()
. Также мы задаем для элементаdiv
картыid
в виде'cardn'
, гдеn
- номер карты. Так мы устанавливаем разные цвета для карт с помощью CSS. Затем карта добавляется в элементdiv
#cardPile
. Для карты вызывается методdraggable(),
который:- Делает ее перетаскиваемой.
- Используем опцию
containment
для ограничения перемещений элементомdiv
#content.
- Используем опцию
stack
, чтобы перетаскиваемая карта всегда находилась сверху. - Используем опцию
cursor
, чтобы изменить форму курсора при перетаскивании. - Устанавливаем опцию
revert
в значениеtrue
. Что возвращает карту обратно в ее начальное положение, если пользователь ее отпустит, так что у него будет следующая попытка. Данная опция отключается, когда пользователь перетаскивает карту на правильный слот.
- Создаем слоты для карт Последняя часть функции
init()
создает 10 слотов для карт. Объявляем массив и инициализируем его содержание словами от "один" до "десять". Затем в цикле проходим массив и создаем элементdiv
для каждого номера. Также сохраняем номер слота с помощью метода вdata()
, чтобы потом проверить соответствие номеров карты и слота. И добавляем слот к элементуdiv
#cardSlots
. Для слота вызываем методdroppable(),
чтобы сделать его целевым элементом для перетаскивания карт. Используем опциюaccept
с селектором"#cardPile div"
, чтобы слот принимал только наши карты с номерами и никаких других перетаскиваемых объектов. ОпцияhoverClass
устанавливает класс CSS для слота, когда карта находится над ним. В завершении мы устанавливаем для обработки событияdrop
функциюhandleCardDrop()
, которая запускается при отпускании карты на слоте.
Шаг 3. Обработчик события handleCardDrop()
Последняя часть кода JavaScript является обработчиком события drop
для целевых элементов:
function handleCardDrop( event, ui ) { var slotNumber = $(this).data( 'number' ); var cardNumber = ui.draggable.data( 'number' ); // Если карта была брошена на правильный слот, // изменяем ее цвет, позиционируем поверх слота, // и предотвращаем повторное перетаскивание if ( slotNumber == cardNumber ) { ui.draggable.addClass( 'correct' ); ui.draggable.draggable( 'disable' ); $(this).droppable( 'disable' ); ui.draggable.position( { of: $(this), my: 'left top', at: 'left top' } ); ui.draggable.draggable( 'option', 'revert', false ); correctCards++; } // Если все карты расположены правильно, выводим сообщение об успехе // и сбрасываем карты для другой игры if ( correctCards == 10 ) { $('#successMessage').show(); $('#successMessage').animate( { left: '380px', top: '200px', width: '400px', height: '100px', opacity: 1 } ); } }
Разберем функцию подробно:
- Получаем номера слота и карты Сначала нужно получить номера слота и карты, которую на него перетащили, чтобы произвести сравнение. Так как наша функция является обработчиком события для целевого элемента, то мы можем получить доступ к нему с помощью переменной
this
. Затем мы оборачиваем элемент в функцию$(),
чтобы конвертировать его в объект jQuery. А затем используем методdata()
для получения данных по ключу'number'
и сохранению их в переменнойslotNumber
. Свойствоdraggable
объектаui
содержит объект jQuery, который представляет перетаскиваемую карту. Используя ключ'number'
в методеdata()
, мы получаем номер карты, который сохраняем в переменнойcardNumber
. - Если карта и слот имеют одинаковые номера, укладываем карту в слот Если два номера совпадают, значит, карта сброшена в правильный слот. Сначала добавляем класс CSS
'correct'
карте, чтобы изменить цвет. Затем отключаются возможности перетаскивания для карты и слота с помощью методовdisable
. Таким образом, пользователь не сможет повторно перетащить карту или сбросить другую карту в слот снова. Затем мы позиционируем карту поверх слота с помощью методаposition()
. Данный метод позволяет позиционировать любой элемент относительно другого элемента, что дает нам возможность правильно размещать наши карты над слотами. Мы позиционируем верхний левый угол (my: 'left top'
) карты (ui.draggable
) над левым верхним углом (at: 'left top'
) слота ($this
). В завершении устанавливаем опцию картыrevert
в значениеfalse
, что предотвращает возвращение карты назад, когда ее бросают. Также мы увеличиваем значение переменнойcorrectCards
для отслеживания правильно размещенных карт. - Проверка завершения игры Если значение переменной
correctCards
равно 10, то игра закончена с победой! Выводим сообщение. Изменение его высоты и ширины с 0 до нужных значений анимируется, что создает эффект масштабирования. В сообщении о завершении игры есть кнопка для повторного запуска, нажатие на которую вызывает функциюinit()
.
Шаг 4. CSS
Осталось задать стили для страницы, карт и слотов:
/* Устанавливаем отступ для страницы, шрифты и цвета, используемые по умолчанию */ body { margin: 30px; font-family: "Georgia", serif; line-height: 1.8em; color: #333; } /* Устанавливаем для заголовка собственный шоифт */ h1, h2, h3, h4 { font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; } /* Область основного содержания */ #content { margin: 80px 70px; text-align: center; -moz-user-select: none; -webkit-user-select: none; user-select: none; } /* Верхний и нижний колонтитулы */ .wideBox { clear: both; text-align: center; margin: 70px; padding: 10px; background: #ebedf2; border: 1px solid #333; } .wideBox h1 { font-weight: bold; margin: 20px; color: #666; font-size: 1.5em; } /* Слот для окончательного положения карты */ #cardSlots { margin: 50px auto 0 auto; background: #ddf; } /* Начальная колода несортированных карт */ #cardPile { margin: 0 auto; background: #ffd; } #cardSlots, #cardPile { width: 910px; height: 120px; padding: 20px; border: 2px solid #333; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 10px; -moz-box-shadow: 0 0 .3em rgba(0, 0, 0, .8); -webkit-box-shadow: 0 0 .3em rgba(0, 0, 0, .8); box-shadow: 0 0 .3em rgba(0, 0, 0, .8); } /* Отдельные карты и слоты */ #cardSlots div, #cardPile div { float: left; width: 58px; height: 78px; padding: 10px; padding-top: 40px; padding-bottom: 0; border: 2px solid #333; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 10px; margin: 0 0 0 10px; background: #fff; } #cardSlots div:first-child, #cardPile div:first-child { margin-left: 0; } #cardSlots div.hovered { background: #aaa; } #cardSlots div { border-style: dashed; } #cardPile div { background: #666; color: #fff; font-size: 50px; text-shadow: 0 0 3px #000; } #cardPile div.ui-draggable-dragging { -moz-box-shadow: 0 0 .5em rgba(0, 0, 0, .8); -webkit-box-shadow: 0 0 .5em rgba(0, 0, 0, .8); box-shadow: 0 0 .5em rgba(0, 0, 0, .8); } /* Цвета для отдельных карт */ #card1.correct { background: red; } #card2.correct { background: brown; } #card3.correct { background: orange; } #card4.correct { background: yellow; } #card5.correct { background: green; } #card6.correct { background: cyan; } #card7.correct { background: blue; } #card8.correct { background: indigo; } #card9.correct { background: purple; } #card10.correct { background: violet; } /* Сообщение "Вы сделали это! */ #successMessage { position: absolute; left: 580px; top: 250px; width: 0; height: 0; z-index: 100; background: #dfd; border: 2px solid #333; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 10px; -moz-box-shadow: .3em .3em .5em rgba(0, 0, 0, .8); -webkit-box-shadow: .3em .3em .5em rgba(0, 0, 0, .8); box-shadow: .3em .3em .5em rgba(0, 0, 0, .8); padding: 20px; }
Рассмотрим несколько интересных моментов в коде CSS:
#cardSlots
и#cardPile
— прямоугольники, которые содержат наборы слотов и несортированных карт соответственно, имеют серую рамку толщиной 2px, тень и скругленные углы.#cardSlots div
и#cardPile div
- селекторы для самих слотов карт. Они смещаются влево, чтобы выстроиться в горизонтальную линию. Карты и слоты имеют такую же рамку, как и прямоугольники#cardSlots
и#cardPile
. В дополнение слоты имеют прерывистую рамку, а карты используют существенно больший размер шрифта для вывода чисел. Свойствоtext-shadow
создает обводку вокруг числа.#cardSlots div.hovered
подключается, когда карта находится над слотом. Данный селектор имеет темно серый фон, так что слот выделяется в общем ряду.#cardPile div.ui-draggable-dragging
подключается в момент перетаскивания карты. Данный селектор имеет тень, так что карта выглядит размещенной над страницей.#card1.correct
до#card10.correct
выбирают карты, когда они размещены в правильном положении. Каждая карта имеет свой собственный цвет.- Стиль
#successMessage
используется для сообщения о завершении игры. Прямоугольник сообщения позиционируется по центру страницы. Ширина и высота его изначально устанавливаются в 0, что дает нам возможность создать эффект масштабирования при открытии.
Заключение
Использование техники "перетащи-и-брось" в приложениях с применением jQuery UI осуществляется достаточно просто. А в результате можно создать простой интуитивно понятный интерфейс, который поможет сделать проект популярным.
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/aC0DsCD6nnA/lessons.php
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-11-26 » Капитан грузового судна, или Как начать использовать Docker в своих проектах
- 2024-11-26 » Обеспечение безопасности ваших веб-приложений с помощью PHP OOP и PDO
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-15 » Перенос сайта на WordPress с одного домена на другой
- 2024-11-08 » OSPanel 6: быстрый старт
- 2024-11-08 » Как установить PhpMyAdmin в Open Server Panel
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
Чтобы вырастить плодоносящий сайт - его полезно регулярно поливать и удобрять с помощью рекламы и оптимизации Компания "RedLine" |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.