sonyps4.ru

Простая карусель jquery с инструкцией. Самый удачный jQuery плагин карусели

Ева Кац поделилась с редакцией рубрики Growth Hacks кейсом продажи недвижимости в соцсетях. По её словам, вложив 47 500 рублей в рекламу, компания получила 10 заказов на покупку домов с минимальным чеком в 1,5 млн рублей.

Через 7 месяцев работы над проектом по недвижимости мы добились внушительных результатов - 696 заявок из соцсетей. Только за один месяц.

Из этих заявок конверсия в потенциальные лиды - 21,4%. Стоимость такого лида при рекламном бюджете в 47 500 - 319 рублей. Из этих лидов клиентами становится 6%. Стоимость клиента - 4 750 рублей.

При минимальном чеке на недвижимость в 1 500 000 рублей за месяц мы получаем клиентов на 15 000 000 рублей. Мы не даем точную статистику по продажам - в этой области решение о покупке люди принимают до полугода. Зато мы можем утверждать, что SMM - продает. Рассказываем, как мы добились таких результатов.

Заявкой может быть:

  • Запрос от пользователя на расчет цены и на условия по проекту.
  • Личное сообщение с запросами цены и условий.
  • Лид, который пришел по рекламе лидов в Facebook - по объявлению с конкретным объектом, его описанием и ценой.
  • За последние 5 месяцев мы получили 1 176 заявок:

    Вот примеры того, как выглядят запросы, которые нас интересуют:


    Мы отслеживаем эффективность каждого канала и формата. Например, по рекламе лидов в июне мы добыли 577 заявок. Средняя стоимость лида - 17 рублей. После первого звонка остается 20−25% лидов - так люди, настроенные на конструктивный разговор, обходятся в 70−85 рублей. Из них до продажи, по оценкам клиента, дойдет порядка 5−10%.

    Итоговая конверсия - 1−2%. Реальный клиент обходится нам в 900−1700 рублей. И это - только по одному из каналов. По остальным каналам мы получили 119 запросов. Из них 20 конвертировались в заявки: люди, узнав стоимость, оставили телефон для предметного обсуждения условий.

    Средняя стоимость такого лида - 1 800 рублей. Это уже теплый лид, который прошел первичный отбор, планирует строиться и готов к детальной беседе.

    Важный момент: эти цифры - результаты через 7 месяцев работы. Для эффективной рекламы необходимо время: на правильный подбор аудиторий, тестирование рекламных инструментов. Даже в рамках одной соцсети таких инструментов - десятки. Время нужно и на поиск такого формата контента, который сработает лучше. Все это - месяцы кропотливой работы. А теперь я расскажу, как мы это делаем.

    На что сделали ставку при продвижении

    Продукт клиента - бревенчатые дома и бани. Здесь нет типовых проектов: для каждого клиента архитектор разрабатывает индивидуальный проект.

    Так каждый заказчик «Артели» получает особенный дом, созданный под конкретный характер, с учетом всех пожеланий и исходных условий. Учитывается все - даже нюансы вроде ландшафта и соседних строений на участке.

    Материал редкий и дорогой - сухостойная карельская сосна (она же Kelo). Строения из этого дерева стоят столетиями. В этих домах есть купеческая добротность, тепло и душа. И важно, чтобы будущие клиенты «Артели» ощутили это еще на этапе просмотра социальных сетей.

    Качественный контент

    Мы сделали ставку на качественный контент. В этом нам помогает сам клиент - все фотографии в сообществах нам передает «Артель». Также клиент идет навстречу при подготовке заметок. Это важно, потому что в материалах много специфической информации и деталей, которые может знать только участник процесса.

    По этому проекту у нас создано несколько чатов:

    • Общий: здесь мы общаемся с клиентом по проекту, получаем материалы для публикаций, собираем информацию.
    • Чат с архитектором: здесь мы расспрашиваем его о проекте и архитектурных решениях.
    • Переписки с отдельными сотрудниками «Артели»: с главным ответственным за строительство на участке, с плотником и так далее.

    В отдельных случаях информацию для заметок добываем по телефону. Каждый такой разговор - небольшое, на 20−30 минут, интервью. Одну публикацию мы можем готовить неделю.

    В подготовке задействуем всех ответственных лиц и максимально расспрашиваем каждого участника процесса: от руководителя «Артели» до плотника. Это больше журналистский подход, но только так получается добывать интересные детали и ценную информацию.

    У специалистов «Артели» взгляд замылен, и история, которая вызовет реакцию в Facebook и спровоцирует шквал перепостов, для них может быть обычной рутиной, которая не стоит внимания.

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

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

    Мы делаем около 10-12 публикаций в месяц в Facebook и вдвое больше - в Instagram. Чтобы понимать, какие публикации вызывают больший ажиотаж, мы смотрим на классическую статистику в Facebook - количество реакций, обсуждений и репостов.

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

    Чтобы увеличить охват по заинтересованным пользователям, большинству публикаций мы даем отдельное продвижение по интересам. Список интересов и аудиторию подбираем исходя из заметки и её темы. Так мы увеличиваем шансы, что наш материал увидят именно те, кто нам нужен. Это же позволяет добывать более дешевые клики и лайки - так, средняя цена за результат для промо-заметок у нас варьируется от 13 до 90 копеек.


    В Instagram даем меньше текста. В Facebook - экспериментируем с объемом. Как показывает практика, здесь людям можно давать читать.

    И если вы привели в сообщество целевую аудиторию, она будет это делать. В сообществе «Артели» всегда кипит жизнь. Вот пример публикации, которую мы дополнительно продвигали, и данных по охвату:

    И это - не самая популярная заметка.

    Другие примеры:

  • Карточка объекта: двухэтажная баня в Можайске: 1439 лайков, 175 перепостов.
  • «2015: ретроспектива»: 1379 лайков, 179 перепостов (9899 кликов на публикацию), 9 618 просмотров фотографий.
  • «Дома из Полярной сосны: взгляд изнутри»: 674 лайка, 102 перепоста, 3 293 просмотра фото.
  • «Рисунки полов»: 648 лайков, 114 перепостов, 4 698 просмотров фотографий.
  • «Старорусская беседка в Десне»: 627 лайков, 72 перепоста, 4 972 просмотра фотографий.
  • «Дом с двойным светом в Курске»: 629 лайков, 84 перепоста, 5 938 просмотров фотографий.
  • «Парящий сруб»: 621 лайк, 111 перепостов, 3 740 просмотра фотографий.
  • «Начало пути»: 613 лайков, 67 перепостов, 5954 просмотра фотографий.
  • Сюда же можно добавить и новую обложку, которая набрала 878 лайков и 69 перепостов. Когда пошла волна - мы сразу добавили краткое описание и стали вести людей на сайт «Артели». Одна заметка принесла нам 715 переходов на сайт.

    Работа с аудиториями

    О качестве рекламы можно судить по активности аудитории. Если у вас в сообществе 10 000 человек, и все молчат - значит, вы им либо не интересны, либо это вообще не люди. Мы следим за аудиториями «Артели», как маленький принц за своей планетой. Сейчас статистика по комментариям и заявкам говорит, что мы на верном пути. Об этом же говорит статистика сообщества:


    • показали себя хорошо,
    • требуют доработки,
    • не оправдали надежд.

    Аудитории мы определяем заранее, а в процессе - модифицируем, в зависимости от результатов. Карта постоянно расширяется, а мы увеличиваем число рекламных инструментов и аудиторий под каждый вид рекламы.

    Так выглядит фрагмент карты для «Артели»

    Сервис: реактивная модерация

    Когда в сообщество и Instagram каждый день приходят сотни новых людей и когда по рекламе в день может поступить по 20-30 комментариев - важно оперативно на все отреагировать.

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

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

    Реклама

    Мы работаем со всеми видами рекламы в Facebook и Instagram: рекламируем сообщество и страницу в Instagram, ведем людей на сайт, даем скачать прайс, затем догоняем ретаргетингом, собираем лиды и даем промо-заметки в обеих социальных сетях. Работаем с «каруселями», продвигаем видео и создаем холсты - полноценные мини-лендинги для мобильных устройств.

    Ежемесячно мы запускаем от 4 до 8 видов рекламы. Всего каждый месяц у нас запущено по 10−15 кампаний разных форматов (промо-заметки не в счет). Внутри каждой кампании - по 4−8 объявлений. Так у нас в одновременной ротации каждый месяц - от 50 до 100 объявлений разных форматов.

    Благодаря этому рекламный бюджет расходуется равномерно. Мы прорабатываем все каналы, затем анализируем, откуда приходит больше заявок и перераспределяем деньги с менее эффективных каналов - на более. И это непрерывный процесс. Поэтому в последние месяцы мы сделали ставку на рекламу Instagram и на сбор лидов.

    1. Сбор лидов

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

    В объявлениях мы охватываем разные сегменты - от условного среднего класса до премиума. Показываем объекты из разных ценовых категорий - от нескольких сотен тысяч рублей до нескольких миллионов. Объявления выглядят так:

    Выше я писала, что только в июне по этой рекламе пришло 577 лидов из 5 разных кампаний. Средняя стоимость лида - 17 рублей. При конверсии в 1−2% (цифры не окончательные: средний цикл клиента - от 4 до 6 месяцев) мы получаем реального клиента за 900−1500 рублей.

    2. Реклама страницы клиента в Instagram

    Важно: речь идет не о прямой рекламе, которая ведет на сайт, а о рекламе самого Instagram. Мы уже писали на Коссе, как делаем и настраиваем такую рекламу. Это второй по эффективности вид рекламы: позволяет охватить сотни тысяч (в среднем, от 300 до 400 тысяч в месяц) людей, привлечь несколько тысяч в Instagram и добыть несколько десятков целевых запросов.

    Так, только за июнь мы получили 61 заявку из Instagram. Конверсия в заинтересованных клиентов - в тех, кто оставляет свой телефон для предметного обсуждения - порядка 10%.

    3. Реклама сообщества и промо-заметки в Фейсбуке

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

    Промо-публикации для привлечения новых подписчиков работают плохо. Но хорошо - для прямых продаж и для повышения узнаваемости бренда. При грамотном подборе аудиторий один пост может привлечь до десяти запросов (наш рекорд - 30 заявок к одной заметке). Вот пример такой заметки :


    Здесь мало лайков и перепостов. Но не в лайках счастье: только эта заметка принесла нам при небольшом бюджете - 10 заявок.

    При подготовке промо-публикаций у нас есть железные правила. Приведу несколько:

    • Рекламу на заметку мы запускаем через несколько дней после его публикации. Первые дни заметка мелькает у подписчиков в ленте и активно собирает лайки и перепосты. Активность сокращается через 2 дня и сходит на нет - через 4−5. Тогда мы даем рекламу.
    • Этот подход еще помогает выставить правильный бюджет. Если мы видим, что публикация вызывает интерес и приносит заявки - на его продвижение мы выделим больше денег.
    • Аудиторию мы подбираем вручную, и всегда отталкиваемся от тематики заметки. Отобранные проверенные аудитории должны быть - но важно захватывать новые. При этом подбирать аудиторию так, чтобы рекламу видели только те, кому будет интересна.
    Слово об аудиториях

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

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

    Креативы и посылы

    В зависимости от аудитории мы используем разные посылы и креативы. Если это человек, который ездит в Астрахань на рыбалку, любит загородный отдых, охоту и большие автомобили, мы пообещаем ему добротность и экологичность. Например, в таком формате:

    Мы продумываем креативы исходя из начальных болей и потребностей клиента. Для кого-то такой дом - семейное гнездо, а для кого-то вопрос статуса.

    Подход к работе

    Мы строим работу по циклу Деминга: выдвигаем гипотезу, проверяем, фиксируем результат, затем выдвигаем новые гипотезы. Так мы тестируем аудитории, рекламные форматы и отдельные объявления. Распишу по этапам:

    • Неделя 1. Для каждой кампании готовим 4−6 объявлений: с разными фотографиями и разными текстами и посылами. Запускаем рекламу и начинаем следить.
    • Неделя 2. Наблюдаем. Для каждого типа рекламы у нас есть внутренние KPI - верхние границы по стоимости подписчика, перехода и взаимодействия с рекламой. Если реклама обходится дорого - забираемся вглубь кампаний, изучаем под микроскопом объявления, корректируем, отключаем неэффективные, создаем новые. Если результаты хорошие - оставляем кампанию и продолжаем наблюдать.
    • Неделя 3. Изучаем каждую кампанию. Анализируем объявления-победителей: оставляем только их, затем переносим на другие кампании - с поправками на аудиторию и тип рекламы. Где необходимо - перераспределяем бюджет.
    • Неделя 4. Реклама останавливается, а мы делаем выводы. Вносим пометки в ментальную карту, фиксируем сильные аудитории, записываем сработавшие и не сработавшие подходы. Затем планируем рекламу на следующий месяц.

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

    Мы стерли аудитории, которые приносят такие результаты, чтобы не подкармливать конкурентов нашего клиента.

    Не в дешевизне дело

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

    Стоимость клика и лайка обманчива и коварна: среди этих тысяч может не оказаться ни одного клиента. Качество важнее.

    В рекламе «Артели» лучше всего идут широкие аудитории: например, все, кто живет в России в возрасте от 30 до 50. Или эта же аудитория, суженная до владельцев продукции Apple как предположительно более обеспеченных людей. В свою очередь, те, кто живет в центре Москвы в престижных поселках на Рублевке, обходятся в несколько раз дороже.

    Дороже - но перспективнее. Приведу простой пример. Когда мы ведем людей на сайт, то оцениваем не только цену за клик. Изучаем поведение на сайте. Роем Яндекс.Метрику и Гугл Аналитикс. Благодаря этому мы вовремя обнаружили, что перспективнее оказалась дорогая аудитория: если дешевая широкая покидала сайт через минуту и просматривала всего одну-две страницу, то дорогая - уходила с сайта реже, дольше на нем находилась и просматривала вдвое больше страниц за сеанс.

    С чем это связано? На мой взгляд, все просто.

    У «Артели» - необычные и яркие объекты. Они привлекают внимание сами по себе, в независимости от того, собирается человек строить дом или нет. Реклама на широкую аудиторию приносит много кликов от любопытных - но среди них мало тех, кто на самом деле собирается строиться и кто может себе позволить баню за несколько миллионов.

    Новые форматы и свежие инструменты

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

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

    Примеры форматов, которые мы тестировали:

    Заметки

    Как только в сообществах появилась возможность делать красивые отформатированные заметки, мы их протестировали, а затем -

    Когда я начал изучать эту тему, мне не нужна была трехмерная карусель, но я больше интересовался техническими деталями ее реализации. Разумеется, основные используемые методы, конечно же, относятся к модулю CSS Transforms Module Level 1 , но по мере того, как будет применена группа других технологий разработки переднего плана, затрагивая различные темы в CSS, Sass и клиентском JavaScript .

    Демо

    Чтобы проиллюстрировать настройку 3D-преобразований CSS, я покажу вам версию компонента только для CSS. Затем я покажу вам, как улучшить его с помощью JavaScript, разработав простой скрипт компонента.

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

    Для разметки изображения внутри компонента обернуты внутри элемента, который обеспечивает базовый скелет:

    Это будет нашим фундаментом.

    Геометрическая структура карусели

    Прежде чем смотреть в CSS, давайте рассмотрим план, который будет разработан в следующих разделах.

    Эти элементы должны быть расположены по кругу, очерченном карусели. Этот круг может быть аппроксимирован его ограниченным регулярным многоугольником и изображениями, расположенными по бокам:

    Таким образом, количество сторон такого многоугольника совпадает с количеством изображений в карусели:
    С тремя изображениями многоугольник является равносторонним треугольником;
    С четырьмя изображениями это квадрат;
    С пятью пятиугольниками; и так далее:

    Что делать, если в карусели меньше трех изображений?

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

    Этот воображаемый опорный многоугольник будет располагаться в трехмерном пространстве, перпендикулярном плоскости окна просмотра, и его центр будет оттеснен назад в экран на расстоянии, равном его апотему, расстоянии стороны многоугольника от его центра, как показано на рис. Этот сверху вниз вид карусели:

    Таким образом, сторона, которая в настоящее время обращена к зрителю, будет находиться на плоскости экрана при z = 0, а переднее изображение, не подверженное перспективой ракурса, будет иметь свой обычный 2D размер. d Письмо на картинке представляет значение для CSS perspective свойства.

    Построение геометрии карусели

    В этом разделе я покажу вам ключевые правила CSS, которые я буду проходить шаг за шагом.

    В следующих фрагментах кода некоторые переменные Sass используются, чтобы сделать компонент более настраиваемым. Я буду использовать, $n чтобы обозначить количество изображений в карусели и $item-width указать ширину изображения.

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

    Carousel { display: flex; flex-direction: column; align-items: center; > * { flex: 0 0 auto; } .figure { width: $item-width; transform-style: preserve-3d; img { width: 100%; &:not(:first-of-type) { display: none /* Just for now */ } } } }

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

    Первое изображение не нуждается в дополнительных преобразованиях, потому что оно уже находится в своем целевом положении, то есть на передней стороне карусели.

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

    Carousel figure { transform-origin: 50% 50% (-$apothem); }

    Это значение отрицается, потому что в CSS положительное направление оси z находится вне экрана, к зрителю. Скобки необходимы, чтобы избежать синтаксических ошибок Sass . Вычисление многоугольника apothem будет объяснено позже.

    Переведя систему отсчета элемента, вся карусель может поворачиваться с вращением на (новой) оси y:

    Carousel figure { transform: rotateY(/* some amount here */rad); }

    Я вернусь к деталям этого поворота позже.

    Перейдем к преобразованиям для других изображений. При абсолютном позиционировании изображения складываются внутри :

    Carousel figure img:not(:first-of-type) { position: absolute; left: 0; top: 0; }

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

    Img:not(:first-of-type) { transform-origin: 50% 50% (-$apothem); }

    Затем изображения могут поворачиваться на их новой оси y на величину, заданную ($i - 1) * $theta радианами, где $i индекс (начиная с одного) изображения и $theta = 2 * $PI / $n, $PI представляя математическую константу pi . Следовательно, второе изображение будет повернуто $theta третьим 2 * $theta , и так далее, до последнего изображения, которое будет повернуто ($n - 1) * $theta .

    Это относительное расположение изображений будет сохранено во время поворотов карусели (т.е. Вращения вокруг измененной оси y ) благодаря иерархической природе вложенных преобразований CSS.

    Это количество вращения каждого изображения может быть присвоено с помощью @for директивы управления Sass:

    Carousel figure img { @for $i from 2 through $n { &:nth-child(#{$i}) { transform: rotateY(#{($i - 1) * $theta}rad); } } }

    Это использует for...through конструкцию, а не for...to потому, что вместо for...to последнего значения, присвоенного переменной индекса $i , будет n-1 вместо n .

    Обратите внимание на два примера #{} синтаксиса интерполяции Sass . В первом случае он используется для индекса:nth-child() селектора;
    Во втором случае он используется для установки значения свойства вращения.

    Вычисление Apothem

    Вычисление апофемы полигона зависит от количества сторон и ширины стороны, то есть, на $n и $item-width переменных.
    Формула:

    $image-width / (2 * tan($PI/$n))

    Где tan() - касательная тригонометрическая функция.

    Эта формула может быть получена с некоторой геометрией и тригонометрией. В источнике пера эта формула не реализована так, как написано, потому что тангенциальная функция недоступна в Sass, поэтому вместо этого используется твердое значение. Формула будет полностью реализована в демонстрации JavaScript вместо этого.

    Расстояние между элементами карусели

    На этом этапе изображения карусели «зашиты» бок о бок, образуя требуемую полигональную форму. Но здесь они плотно упакованы, а часто в трехмерных каруселях между ними есть пространство. Это расстояние повышает восприятие 3D-пространства, потому что оно позволяет вам видеть обратные изображения на задней части карусели.

    Можно дополнительно добавить этот промежуток между изображениями, введя другую конфигурационную переменную $item-separation и используя ее в качестве горизонтальной прокладки для каждого элемента. Точнее, взяв половину этого значения для левого и правого заполнения:

    Carousel figure img { padding: 0 $item-separation / 2; }

    Изображения сделаны полупрозрачными с opacity свойством, чтобы лучше проиллюстрировать структуру карусели, а гибкая макета на корневом элементе карусели использовалась для вертикального центрирования ее в окне просмотра.

    Вращение карусели

    Чтобы облегчить тестирование поворота карусели, я собираюсь добавить элемент управления пользовательского интерфейса, чтобы перемещаться между изображениями. См. Демо-версию CodePen для HTML, CSS и JavaScript, реализующих этот элемент управления; Здесь я опишу только код, относящийся к вращению.

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

    После обновления currImage , поворот карусели выполняется с помощью:

    Figure.style.transform = `rotateY(${currImage * -theta}rad)`;

    (Здесь и в следующих фрагментах литералы шаблонов ES6 используются для интерполяции выражений в строках, не стесняйтесь использовать традиционный оператор конкатенации «+», если вы предпочитаете)

    Где theta то же самое, что и раньше:

    NumImages = figure.childElementCount; theta = 2 * Math.PI / numImages;

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

    Обратите внимание, что это currImageзначение не ограничено диапазоном , но вместо этого оно может расти бесконечно, как в положительном, так и в отрицательном направлении. На самом деле, если изображение на передней панели является последним (так currImage== n-1), и пользователь нажимает следующую кнопку, если мы переустановим currImageна 0, чтобы перейти к первому изображению карусели, произойдет переход Угол поворота от (n-1)*theta до 0, и это повернет карусель в противоположном направлении по всем предыдущим изображениям. Аналогичная проблема может возникнуть при нажатии кнопки prev, когда первое изображение является первым.

    Чтобы быть разборчивым, я должен даже проверить потенциальные переполнения currentImage , потому что Number тип данных не может принимать сколь угодно большие значения. Эти проверки не реализованы в демо-коде.

    Увидев базовый CSS, лежащий в основе карусели, теперь JavaScript можно использовать для улучшения компонента несколькими способами, такими как:

    • Произвольное количество изображений
    • Изображения с процентной шириной
    • Несколько экземпляров карусели на странице
    • Конфигурации для каждого экземпляра, такие как размер зазора и видимость на обратной стороне
    • Конфигурация с использованием атрибутов данных HTML5 *

    Сначала я удаляю из таблицы стилей переменные и правила, связанные с происхождением преобразования и поворотами, потому что это будет сделано с использованием JavaScript:

    $item-width: 40%; // Now we can use percentages $item-separation: 0px; // This now is set with Js $viewer-distance: 500px; .carousel { padding: 20px; perspective: $viewer-distance; overflow: hidden; display: flex; flex-direction: column; align-items: center; > * { flex: 0 0 auto; } figure { margin: 0; width: $item-width; transform-style: preserve-3d; transition: transform 0.5s; img { width: 100%; box-sizing: border-box; padding: 0 $item-separation / 2; &:not(:first-of-type) { position: absolute; left: 0; top: 0; } } } }

    Function carousel(root) { // coming soon... }

    root Аргумент относится к элементу DOM , который содержит карусель.

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

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

    Window.addEventListener("load", () => { var carousels = document.querySelectorAll(".carousel"); for (var i = 0; i < carousels.length; i++) { carousel(carousels[i]); } });

    carousel() Выполняет три основные задачи:

    • Настройка навигации.
    • Настройка трансформаций
    • Зарегистрируйте слушателя с изменением размера окна, чтобы сохранить отзыв карусели, адаптировав его к новому размеру видового экрана

    Перед рассмотрением кода настройки преобразования я рассмотрю некоторые ключевые переменные и как они инициализируются на основе конфигурации экземпляра:

    Var figure = root.querySelector("figure"), images = figure.children, n = images.length, gap = root.dataset.gap || 0, bfc = "bfc" in root.dataset ;

    Количество изображений (n) инициализируется в зависимости от количества дочерних элементов элемента. Разделение между слайдами (gap) , инициализируется из data-gap атрибута HTML5 , если установлено. Флаг видимости обратной стороны (bfc) читается с использованием API набора данных HTML5. Это будет использоваться позже, чтобы определить, должны ли изображения на обратной стороне карусели быть видимыми или нет.

    Настройка преобразований CSS

    Код, который устанавливает свойства, связанные с преобразованиями CSS, инкапсулируется в setupCarousel(). Эта вложенная функция принимает два аргумента. Первое - количество элементов в карусели, то есть nвведенная выше переменная. Второй параметр s- длина стороны многоугольника карусели. Как я упоминал ранее, это равно ширине изображений, поэтому можно прочитать текущую ширину одного из них getComputedStyle():

    SetupCarousel(n, parseFloat(getComputedStyle(images).width));

    Таким образом, ширина изображения может быть задана с помощью значений процентов.

    Window.addEventListener("resize", () => { setupCarousel(n, parseFloat(getComputedStyle(images).width)); });

    Для простоты я не разбираюсь в слушателе изменения размера.

    Первое, что setupCarousel() нужно сделать, - вычислить apothem многоугольника, используя переданные параметры и ранее обсуждавшуюся формулу:

    Apothem = s / (2 * Math.tan(Math.PI / n));

    Затем это значение используется для изменения начала преобразования фигурного элемента для получения новой оси вращения карусели:

    Figure.style.transformOrigin = `50% 50% ${-apothem}px`;

    Затем применяются стили для изображений:

    For (var i = 0; i < n; i++) { images[i].style.padding = `${gap}px`; } for (i = 1; i < n; i++) { images[i].style.transformOrigin = `50% 50% ${- apothem}px`; images[i].style.transform = `rotateY(${i * theta}rad)`; } if (bfc) { for (i = 0; i < n; i++) { images[i].style.backfaceVisibility = "hidden"; } }

    Первый цикл присваивает пробел для пространства между элементами карусели. Второй цикл устанавливает 3D-преобразования. Последний цикл обрабатывает обратные грани, если соответствующий флаг был указан в конфигурации карусели.

    Наконец, rotateCarousel() вызывается, чтобы перенести текущее изображение на передний план. Это небольшая вспомогательная функция, которая, учитывая индекс отображаемого изображения, поворачивает фигурный элемент по оси Y для перемещения целевого изображения вперед. Он также используется навигационным кодом для перехода туда и обратно:

    Function rotateCarousel(imageIndex) { figure.style.transform = `rotateY(${imageIndex * -theta}rad)`; }

    Вот окончательный результат, демонстрация, в которой создаются несколько каруселей, каждая из которых имеет другую конфигурацию.

    Как-то мои друзья решили сделать мне приятный сюрприз. Сам сюрприз был очень простым, для него требовалась самая обычная футболка без рисунков.

    И тут они столкнулись с проблемой — все футболки в магазинах были с изображениями. Они никак не могли найти самую простую футболку, без изображений. Я думаю и вы сталкивались с подобной проблемой, когда не найти самую простую вещь.

    И с каруселями та же самая история, почти все карусели уже с дизайном. А вам практически всегда нужна чистая карусель, которую потом можно оформить так как задумал дизайнер.

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

    jQuery плагин чистой и мощной карусели

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

    Его можно оформлять как угодно .

    И так, вот этот плагин: Owl Carousel.

    Установка плагина

    1. Подключаем jQuery , если он еще не подключен, например так

    2. Копируем файлы плагина в папку с сайтом

    • Распаковываем
    • Копируем на сайт папку owl-carousel

    3. Подключаем эти файлы к сайту:

    4. Добавляем на страницу код

    1 2 3 4 5 6 7 8 9 10 11 12 13 14

    5. Запускаем плагин

    $(document).ready(function(){ // Находим блок карусели var carousel = $("#carousel"); // Запускаем плагин карусели carousel.owlCarousel(); });

    6. Оформляем

    /* Основной блок */ .owl-wrapper-outer { border: 1px solid #777; border-radius: 5px; overflow: hidden; background: white; } /* 1 квадратик карусели */ .carousel-element { padding: 30px; text-align: center; font-size: 300%; border-right: 1px solid #777; }

    Кнопки «Назад» и «Вперед»

    В этом примере я покажу не самый быстрый, но зато самый универсальный способ.

    1. Добавляем сами кнопки

    Назад Вперед

    2. Присоединяем кнопки к плагину карусели

    После запуска плагина добавляем код

    // Назад // При клике на "Назад" $("#js-prev").click(function () { // Запускаем перемотку влево carousel.trigger("owl.prev"); return false; }); // Вперед // При клике на "Вперед" $("#js-next").click(function () { // Запускаем перемотку вправо carousel.trigger("owl.next"); return false; });

    Теперь при клике на «Назад» и «Вперед» будет срабатывать перемотка.

    Маркеры

    Это такие точки, которые показывают, где мы сейчас находимся.

    Их можно включить при запуске плагина, добавив следующий параметр

    // Запускаем плагин карусели carousel.owlCarousel({ // Точки под каруселью pagination: true });

    /* Блок с точками */ .owl-pagination { text-align: center; /* Выравниваем точки по-середине */ } /* 1 Точка */ .owl-page { width: 10px; height: 10px; border: 1px solid #777; display: inline-block; background: white; margin: 10px; border-radius: 5px; } /* Активная точка */ .owl-page.active { background: #777; }

    Чтобы показывался только 1 блок

    Это довольно часто нужно, для этого добавляем следующий параметр

    // Запускаем плагин карусели carousel.owlCarousel({ singleItem: true, // Показывать только 1 блок на всю ширину });

    Разное количество блоков на разных устройствах

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

    // Запускаем плагин карусели carousel.owlCarousel({ // Количество отображающихся блоков // в зависимости от устройства (ширины экрана) // Количество блоков на больших экранах items: 10, // 5 блоков на компьютерах (экран от 1400px до 901px) itemsDesktop: , // 3 блока на маленьких компьютерах (экран от 900px до 601px) itemsDesktopSmall: , // 2 элемента на планшетах (экран от 600 до 480 пикселей) itemsTablet: , // Настройки для телефона отключены, в этом случае будут // использованы настройки планшета itemsMobile: false });

    А что за сюрприз то?

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

    Я открываю, смотрю футболка. Разворачиваю. Вот блин, что за тупость. Я вижу на этой футболке 3 своих фотографии. Одеваю футболку и все начинают ржать, получилось тупо и весело.

    /* Тут начинается наша карусель. Блок.carousel-wrapper спозиционирован относительно, абертки.carousel-item абсолютно. . */ .carousel-wrapper{ position:relative; /* Абсолютно спозиционированные блоки получают высоту и ширину от родителя. Мы сделали их прозрачными по умолчанию, и потом они будут плавно появляться по нажатию на ссылки.arrow-prevи.arrow-next. */ .carousel-item{ position:absolute; top:0; bottom:0; left:0; right:0; padding:25px50px; opacity:0; transition:all0.5sease-in-out; /* Заметили padding слева и справа по 50px? Таким способом мы можем позиционировать наши ссылки! Каждая будет по 50px шириной. Кроме того, я использую пустые ссылки с фоновым рисунком таким образом, что ссылки выглядят как стрелки. Проверьте, поменяли ли вы URL ссылок с оригинальным URL, чтобы ваши ссылки не были просто прозрачными прямоугольниками. */ .arrow{ position:absolute; top:0; display:block; width:50px; height:100%; -webkit-tap-highlight-color:rgba(0,0,0,0); background:url("/carousel-arrow-dark.png")50%50%/20pxno-repeat; /* Давайте вернем нашу стрелку налево. */ &.arrow-prev{ left:0; } /* А вторую направо. Поскольку я использую одно и то же изображение для стрелки, я поворачиваю его на 180 градусов. */ &.arrow-next{ right:0; -webkit-transform:rotate(180deg); transform:rotate(180deg); } } /* Мне очень нравится, как слайды карусели смотрятся на темном фоне, и если блок.carousel-itemимеет класс "light", мы изменим его текст на белый и используем белые стрелки вместо серых. Проверьте еще раз, правильно ли указан путь к изображению стрелки */ &.light{ color:white; .arrow{ background:url("/carousel-arrow-light.png")50%50%/20pxno-repeat; } } /* Напишем медиа-запрос для изменения размера стрелок на устройствах с меньшим размером экрана.*/ @media(max-width:480px){ .arrow,&.light.arrow{ background-size:10px; background-position:10px50%; } } } /* Установим целям для ссылок значение display: none; Таким образом, мы избавляемся от постоянного перепрыгивания браузера в самый верх карусели при каждом нажатии на стрелки. Это свойство действует для любых элементов, чей идентификатор начинается на "target-item". */ { display:none; } /* Выше мы сделали все наши слайды карусели прозрачными, а это значит, что во время загрузки карусели мы будем получать вместо нее большое пустое поле. Изменим значение прозрачности для первого слайда на 1 для отображения. Так же устанавливаем z-index значение 2, позиционируя его выше остальных слайдов. */ .item-1{ z-index:2; opacity:1; } /* Но нам не нужно, чтобы первый слайд всегда имел значение прозрачностиopacity: 1; в противном случае нам придется пробираться через этот слайд, во время ротации остальных. */ *:target~.item-1{ opacity:0; } /* ..но если #target-item-1 в фокусе, и мы хотим показать первый слайд, тогда выбираем его с помощью значка ~ и устанавливаем прозрачность опять в 1:-) */ #target-item-1:target~.item-1{ opacity:1; } /* Если другие target-item-# в фокусе, выбираем их используя ~ селектор, плавно показываем, и размещаем их сверху с помощьюz-index: 3. Тут вы можете добавить дополнительные spanс идентификатором target-item, если их у вас будет больше трех. Может сразу и добавить 10 штук.. */ #target-item-2:target~.item-2,#target-item-3:target~.item-3{ z-index:3; opacity:1; } }

    1. jQuery карусель «clickCarousel»

    Блок с прокруткой анонсов новостей. Для прокрутки блоков используются стрелки влево/вправо. В архиве карусель в двух стилевых оформлениях: светлом и темном.

    1. jQuery карусель, плагин «carouFredSel»

    Аккуратная свежая карусель изображений на jQuery.

    4. jQuery плагин: карусель «Elastislide»

    5. Плагин «TinyCarousel»

    Отличные слайдеры контента в виде карусели изображений с применением jQuery. На демонстрационной странице описано, как прикрутить эту карусель к своему сайту.

    Плагин «Slider Kit», легкая карусель с различными способами прокрутки.

    7. javascript карусель

    8. jQuery плагин «Grid Navigation Effects»

    Оригинальная навигация между миниатюрами изображений. Для просмотра эффекта справа на демонстрационной странице нажмите на кнопки «Вверх» и «Вниз». В этом jQuery решении также предусмотрен эффект при наведении курсора на миниатюру и прокрутка с помощью колеса мыши.

    9. Легкая карусель 10. Карусель из блоков «Easy Paginate»

    jQuery плагин «Easy Paginate». Каждый прямоугольный блок представляет собой обычный пункт списка li, при этом если пунктов больше трех, то чтобы просмотреть их все необходимо воспользоваться навигацией, подобной слайдеру (с помощью стрелок «вперед», «назад» и с помощью кнопок навигации внизу).

    11. Вертикальный ротатор «Vertical Ticker»

    Вертикальный ротатор на jQuery: автоматическое прокручивание контента на странице. Предусмотрены кнопки навигации, а также возможность остановить ротацию и запустить ее снова. При наведении курсора мыши движение останавливается. На уровне HTML разметки прокручивающиеся блоки представлены обычными пунктами списка li.

    12. javascript CSS прокручивающаяся область

    javascript решение «TinyScroller» для создания прокручивающейся области, помещенной в контейнер DIV.

    13. jQuery плагин «Smooth Div Scroll»

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

    Навигация между слайдами с контентом может осуществляться с помощью стрелок или по нажатию на миниатюру. Снизу есть кнопка «Show», позволяющая скрыть/показать миниатюры или полное описание слайда.

    15. Ротатор контента «Circular Content Carousel»

    17. Скроллер

    Блок со скроллером, появляющимся при наведении курсора. Прокручивать содержимое можно как с помощью полосы прокрутки, так и с помощью колеса мыши.

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

    19. Потрясающий слайдер

    Слайдер генерируется автоматически. Данные с названием товара, описанием, ссылкой и адресом изображения берутся из файла slider.db.txt. Используемые технологии: CSS, PHP, jQuery.

    20. Ротация блоков c использованием jQuery

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

    Плагин для прокрутки контента, например, можно использовать для показа последних новостей или для показа Twitter летны на сайте.

    22. Динамический блок «Отзывы клиентов»

    Автоматическая ротация содержимого блока. Используемые технологии: PHP, XML, CSS, jQuery.

    Этот плагин прообразовывает пункты списка (ul li) в элементы jQuery карусели.

    26. javascript карусель «ImageFlow»

    Изображения легко прокручивать с помощью колеса мыши.

    27. Прокручивание контента

    Компактный блок с анонсом последних материалов на сайте или новостей. В левой колонке отображается разбитый на страницы список из кратких анонсов последних новостей. При выборе одного из них в правой колонке отображается более подробное описание и ссылка на прочтение полного текста публикации. Реализовано с помощью jQuery.

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

    33. Прокрутка содержимого, Mootools плагин «Scrollbar»

    Прокручивание осуществляется как при помощи полосы прокрутки, так и с помощью колеса мыши.



    Загрузка...