• Главная
  • Контакты
Подписаться:
  • Twitter
  • Facebook
  • RSS
  • VK
  • PushAll
logo

logo

  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • За год
    • Положительные
    • Отрицательные
  • Сортировка
    • По дате (возр)
    • По дате (убыв)
    • По рейтингу (возр)
    • По рейтингу (убыв)
    • По комментам (возр)
    • По комментам (убыв)
    • По просмотрам (возр)
    • По просмотрам (убыв)
Главная
  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • Главная
  • Карусель на Vanilla.JS

Карусель на Vanilla.JS +11

24.04.2017 11:59
iGetPass 18 5300 Источник
Разработка веб-сайтов*, JavaScript*
Прочитав эту статью решил запилить свою карусель с блэк-джеком и jQuery хотя нет, без него ибо 2017 год и он не особо и нужен. Создадим функцию, которая принимает объект с параметрами, и делает слайдер. Некоторые моменты будут опущены, такие, как: вендорные префиксы, таймер смены и т.д.
Первое что мы сделаем — разметка для карусели, на классах, а не id, дабы можно было использовать несколько раз один и тот же модуль на странице, ну и специфичность не была 3-его порядка.

HTML
<div class="wrap">
	<div class="b-carousel js-carousel">
		<button class="b-carousel__prev js-carousel__prev">Prev</button>
		<button class="b-carousel__next js-carousel__next">Next</button>
		<div class="b-carousel__wrap js-carousel__wrap">
			<div class="b-carousel__item">
				<img src="..." alt="" class="b-carousel__img">
			</div>
			<div class="b-carousel__item">
				<img src="..." alt="" class="b-carousel__img">
			</div>
			<div class="b-carousel__item">
				<img src="..." alt="" class="b-carousel__img">
			</div>
			<div class="b-carousel__item">
				<img src="..." alt="" class="b-carousel__img">
			</div>
		</div>
	</div>
</div>


У нас есть:

  • Блок — обертка для карусели, который скрывает все, что вылезает за его рамки;
  • Контейнер для самих слайдов, которые будут располагаться в строчку, с помощью flexbox, можем себе это позволить;
  • Блоки слайдов, которые скрывают все, что вылезает за их границы;
  • Блок – хелпер для выравнивания картинки по вертикали. И, внутри него уже будем располагать картинки.

В CSS используем БЭМ нотификацию, ибо не засоряем глобальную область. Сделаем его чуть-чуть адаптивным.

CSS
.b-carousel {
	width: 100%;
	overflow: hidden;
	position: relative;

	box-sizing: border-box;
	border: 1px solid;
}

	.b-carousel__prev,
	.b-carousel__next {
		position: absolute;
		top: 50%;
		left: 20px;
		width: 50px;
		height: 50px;
		background: #fff;
		transform: translateY(-50%) translateZ(0);
		cursor: pointer;
		text-indent: 100%;
		white-space: nowrap;
		overflow: hidden;
		z-index: 3;
	}

		.b-carousel__next {
			left: auto;
			right: 20px;
		}

	.b-carousel__wrap {
		display: flex;
		transition: transform .5s;
		will-change: transform;
		position: relative;
		z-index: 1;
		height: 100%;
	}

		.b-carousel__item {
			flex: 0 0 100%;
			overflow: hidden;
			display: flex;
			align-items: center;
			justify-content: center;
		}

			.b-carousel__img {
				width: 100%;
				display: block;
			}


Transform: translateZ(0) у контролов — хак для вынесения их на отдельный композитный слой, чтобы при смещении контейнера со слайдами не было перерисовки кнопок. А у обертки свойство will-change. Оно для броузера, чтобы он знал, что с блоком будут происходить какие-то действия.

Да начнем писать код. Создадим функцию, которая принимает объект с параметрами:

function Carousel(setting) {

	/* Scope privates methods and properties */
	let privates = {};

	/* Privates properties */
	privates.setting = setting;

	privates.sel = {
		"main": document.querySelector(privates.setting.main),
		"wrap": document.querySelector(privates.setting.wrap),
		"children": document.querySelector(privates.setting.wrap).children,
		"prev": document.querySelector(privates.setting.prev),
		"next": document.querySelector(privates.setting.next)
	};

	privates.opt = {
		"position": 0,
		"max_position": document.querySelector(privates.setting.wrap).children.length
	};

	// Control
	if(privates.sel.prev !== null) {
		privates.sel.prev.addEventListener('click', () => {
			this.prev_slide();
		});
	}

	if(privates.sel.next !== null) {
		privates.sel.next.addEventListener('click', () => {
			this.next_slide();
		});
	}

}

Методы управления каруселью:

/* Public methods */
// Prev slide
this.prev_slide = () => {
	--privates.opt.position;

	if(privates.opt.position < 0) {
		privates.sel.wrap.classList.add('s-notransition');
		privates.opt.position = privates.opt.max_position - 1;
	}

	privates.sel.wrap.style["transform"] = `translateX(-${privates.opt.position}00%)`;
};


// Next slide
this.next_slide = () => {
	++privates.opt.position;

	if(privates.opt.position >= privates.opt.max_position) {
		privates.opt.position = 0;
	}

	privates.sel.wrap.style["transform"] = `translateX(-${privates.opt.position}00%)`;
};

Методы next_slide и prev_slide будут двигать обертку с помощью transform, дабы не было перерисовки блока, и анимация происходила на GPU.

Делаем карусель:

new Carousel({
	"main": ".js-carousel",
	"wrap": ".js-carousel__wrap",
	"prev": ".js-carousel__prev",
	"next": ".js-carousel__next"
});

Если нужна поддержка IE, то заменяем стрелочную функцию на:
Ну бросьте, все это знают
Если не все знают


Это все! Меньше кода — меньше трафика (jQuery 3.2 ~85kB). Контроль над параметрами и можем использовать несколько раз на странице.

Демо:



Если понравилась статья, то в скором времени будет продолжение с цикличной анимацией, touch-событиями и еще многими вкусными плюшками!
Поделиться с друзьями
-->

Комментарии (18)


  1. forgetable
    24.04.2017 15:24
    #10188718
    +1

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


    1. iGetPass
      24.04.2017 15:24
      #10188722
      -1

      Согласен, это будет в следующей статье =)


      1. forgetable
        24.04.2017 15:31
        #10188742
        -1

        Здорово. Большой респект за отсутствие jQuery, кстати


        1. iGetPass
          24.04.2017 15:41
          #10188754
          -1

          Мне тоже нравится, не особо jQuery сегодня в зеленых броузерах нужен и в IE 8+


  1. prgrant
    24.04.2017 16:18
    #10188832
    +2

    Нужен swipe, иначе неактуально


    1. iGetPass
      24.04.2017 16:19
      #10188836
      -1

      Это будет в следующей статье =)


  1. iGetPass
    24.04.2017 16:19
    #10188834
    -1

    Это будет в следующей статье =)


  1. psFitz
    25.04.2017 14:04
    #10190260

    Зачем нам очередные велосипеды? Есть же swiper.


    1. iGetPass
      25.04.2017 17:21
      #10190746
      -1

      Тебе не лень тащить в зависимостях jQuery, который весит 85kB?


      1. psFitz
        26.04.2017 09:17
        #10191396

        Сначала советую разобраться в вопросе, потом умничать, есть много либ без jQuery, так же ничего против jq не имею, если в проекте есть jq — специально ищу либу на нём.
        https://github.com/nolimits4web/Swiper/tree/master/dist/js


        1. iGetPass
          26.04.2017 12:32
          #10191764
          +1

          Ты когда-нибудь сам что-нибудь писал? Или не разбираешься в профессии и постоянно берёшь готовые либы и фреймворки?
          Этот swiper, который без jQ весит 94.2kB в сжатом состоянии. Ты понимаешь сколько человек на плохом интернет соединении будет ждать его подгрузку? Пусть с http/2 && сверхбыстрого CDN && gzip'нутого. Это все время на загрузку и распаковку, когда вместо 94.2 и самого вызова ты можешь написать 5kB, который будет работать, как тебе нужно


          1. psFitz
            27.04.2017 10:17
            #10193472

            Давайте не будем судить кто и как разбирается в профессии, во 1, есть разные сайты и не везде надо писать все свое т.к. время ограничено бюджетом, так что не надо этих розовых мечтаний. Во 2, я уверен, что под конец проекта у вас наберется своих наработок на тех же 94kB, только они не будут протестированы сообществом и скорее всего в них будет куча багов.
            Так же никто не мешает зайти в сорцы и вытащить себе только слайдер.


            1. forgetable
              27.04.2017 10:21
              #10193486

              В этом и суть. Мне кажется, нужно стараться использовать своё и как можно меньше библиотек, если занимаешься серьёзными проектами. Если фрилансить, или поджимает время – для этого есть библиотеки.


            1. iGetPass
              27.04.2017 17:40
              #10194320

              Работай с почасовой оплатой!
              Ты один раз написал хороший модуль, написал тесты к нему, и все. По-хорошему для такого модуля — это часа 2


              1. forgetable
                27.04.2017 18:02
                #10194344

                Я всегда работаю с почасовой оплатой. Да, обычно так и происходит.


                1. iGetPass
                  27.04.2017 18:05
                  #10194350

                  Я про тоже, и клиенту меньше трафика


              1. psFitz
                28.04.2017 09:06
                #10195166

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


                1. iGetPass
                  28.04.2017 13:23
                  #10195824

                  Клиенту нужна большая конверсия, в большинстве. Один из факторов большой конверсии — быстрая загрузка страницы => меньший трафик

МЕТКИ

  • Хабы
  • Теги

JavaScript

Разработка веб-сайтов

javascript

Карусель

СЕРВИСЫ
  • logo

    CloudLogs.ru - Облачное логирование

    • Храните логи вашего сервиса или приложения в облаке. Удобно просматривайте и анализируйте их.
Все публикации автора
  • Карусель на Vanilla.JS. Часть 2 +4

    • 02.05.2017 11:07

    Карусель на Vanilla.JS +11

    • 24.04.2017 11:59

Подписка


ЛУЧШЕЕ

  • Сегодня
  • Вчера
  • Позавчера
07:02

После 1500 на Lichess: классические шахматные книги, которые стоит прочитать любителю +20

08:00

Дедупликация фото без нейросетей. Часть 1: измеряем перцептивные хеши +9

07:05

Rust круче C++? Часть 1: скорость +8

07:15

10 лет работал сеньором и сейчас охренел с собеседований корпоратов +7

06:33

Harness для коллег: 5 шагов из личного опыта +6

07:39

А можно просто интернет? Без очередной инициативы +5

04:51

Куда пропадают 69 гигабайт с каждого терабайта и почему за это судились с производителями +5

07:00

Осетры, Modbus и забытый слив: как я автоматизирую рыбную ферму +4

06:32

Постобработка IFC без Revit, часть 2: площади ТЭП, дубли и правки, которые можно переслать +3

04:24

Чёрный октябрь уязвимостей: что задело мой сервер, как я закрыл дыры и почему ушёл на статику без инлайн-скриптов +3

01:34

Данные для языка, которого почти нет в интернете: текстовые слои, турецкие подмены и псевдоразметка двумя моделями +3

06:30

UI-фреймворк для людей и AI-агентов: Rust, C, C++, ASM, 6 платформ, 900 КБ +2

08:30

«А нам точно нужен Open Source? Мы же вайбкодим вообще всё!» +1

08:00

Под капотом современных ИИ-сервисов: KV-кэш, батчинг, квантизация и серверное железо +1

07:33

Вычисления, хранение, масштабируемость: погружение в архитектуру гиперконвергентной дата-платформы +1

07:33

Вычисления, хранение, масштабируемость: погружение в архитектуру гиперконвергентной дата-платформы +1

06:44

Как ИИ и телематика помогают распределять карьерные самосвалы +1

02:20

Кэширование: 5 неочевидных истин для системного аналитика +1

04:30

Как универсальный разъем стал кошмаром: почему одинаковые кабели USB-C отличаются по скорости в 80 раз +105

12:41

Можно ли навайбкодить операционную систему как Linux, только быструю? +69

07:22

Инцидент с ключами eMudhra: удивительная история длиной в полтора года и обновление миллионов устройств за пару дней +50

20:53

Как я устал от VPN‑клиентов на 300 МБ ОЗУ и написал свой TUN‑клиент на чистом Rust (Unbihex) +49

08:00

Я подсвечивал нейроны крохотного ИИ, чтобы понять, когда тот врет +42

06:59

Биллинг 1 миллиарда событий для 700К клиентов на 1С 8.5 в inFrame режиме для 50К пользователей +37

09:12

Вайб‑кодинг вместо унылых ТЗ: как автономные ИИ‑агенты ускоряют разработку игр +28

13:01

Мы могли бы изобрести трансформеры из памяти +27

16:13

Купил морскую спутниковую антенну примерно за €200 и убедил её, что она на яхте +26

07:01

PostgreSQL на 1 ТБ: сколько стоит облако и выделенный сервер +25

07:15

Интеграция 5G: как обеспечить непрерывность связи между поколениями сетей +23

15:15

Кибермарксизм, или почему ИИ несовместим с капитализмом, и почему нас ждёт слом социально‑экономической формации +21

08:20

Как DeWalt, Milwaukee и Hilti стали похожи на LEGO. И почему их «LEGO» до сих пор не совместимы между собой +21

14:01

Новинка «Высокопроизводительный Go. Руководство по оптимизации» +18

09:01

Я вернулся на Android, и мне не понравилось +18

07:00

Российская платформа FCU-CM4 c модулем  ELTAY RM66 из Новосибирска с NapiLinux и российским софтом NapiConfig +18

12:34

DIY: Российский одноплатник Eltay RM66 в карманном компьютере +16

08:05

Нагрузочное тестирование NDR: как проверить реальную производительность +16

03:49

Проект «Фобос» последняя экспедиция Советского Союза к Марсу +16

17:05

Как немножко обмануть сервер +15

09:20

125 токенов в секунду на RTX 4070 Ti SUPER: как я заставил локальную LLM работать полноценным кодинг-агентом +100

09:02

Как я 2,5 года никому не нужный софт вайбкодил +77

07:00

Я пришёл автоматизировать маркетплейсы из кровавого энтерпрайза, и вот что меня сильно удивило +60

15:36

Как я писал свой TCP на чистом Си: надежный протокол доставки данных поверх UDP +50

13:01

Где CSS подложил вам ловушки +39

07:01

Как жалобы заказчика станут источником ваших новых доходов +33

08:00

5 необычных мини-ПК осени 2026 года: мощная графика, ARM-процессоры и 192 ГБ ОЗУ +30

19:57

Инженеры хотят расти, но не обязательно руководить +23

07:05

Про ещё один потенциально интересный вариант реализации ночного видения +23

13:36

Код считает, модель описывает: как мы встроили LLM в отчетность и не дали ей трогать цифры +21

04:08

Какая самая старая программа с GUI запускается на Windows 11 без эмуляции +20

09:48

Как починить RAG +16

08:44

Новые плейбуки, старые порядки: почему буксует внедрение Infrastructure as Code +16

01:36

Делаем энергоэффективную систему визуального контроля морской акватории +16

07:06

SEO умер? Нет, изменился до неузнаваемости +14

08:11

«Не нашли никаких причин для беспокойства»: как Lenovo продавала ноутбуки, которые сами ломали HTTPS +13

07:33

Как дерзкий рейд за 4 000 километров спас заложников в Энтеббе +12

07:27

ИИ завалил разработчиков работой: что происходит с обновлениями для Ubuntu +12

06:20

Как Анри Беккерель случайно открыл радиоактивность +12

06:00

Вино вернуло 502 Bad Gateway: как писать баг-репорт на бутылку +12

ОБСУЖДАЕМОЕ

  • Как универсальный разъем стал кошмаром: почему одинаковые кабели USB-C отличаются по скорости в 80 раз +105

    • 185   36000

    125 токенов в секунду на RTX 4070 Ti SUPER: как я заставил локальную LLM работать полноценным кодинг-агентом +100

    • 167   100000

    Можно ли навайбкодить операционную систему как Linux, только быструю? +69

    • 79   14000

    Я пришёл автоматизировать маркетплейсы из кровавого энтерпрайза, и вот что меня сильно удивило +60

    • 68   97000

    Ипотека или аренда в Петербурге: я посчитал на Python и вот что вышло -1

    • 66   16000

    Инженеры хотят расти, но не обязательно руководить +23

    • 53   22000

    Кибермарксизм, или почему ИИ несовместим с капитализмом, и почему нас ждёт слом социально‑экономической формации +21

    • 47   7500

    Я вернулся на Android, и мне не понравилось +18

    • 47   7900

    Как я писал свой TCP на чистом Си: надежный протокол доставки данных поверх UDP +50

    • 31   12000

    Куда девать идеи из сессий с coding‑агентом: пять мест, и доска, которая за шесть недель стала свалкой +6

    • 30   11000

    Как я устал от VPN‑клиентов на 300 МБ ОЗУ и написал свой TUN‑клиент на чистом Rust (Unbihex) +49

    • 29   32000

    Обновили PHP после PHP2Shell? Сохраните вывод php -v — он может понадобиться в суде +6

    • 25   12000

    Какая самая старая программа с GUI запускается на Windows 11 без эмуляции +20

    • 25   11000

    Открытое письмо профессору Коху: Фрактальная природа сознания и преодоление углеродного шовинизма +5

    • 23   7100

    LLM после работы: делаю дочке интерактивную книгу с 16 концовками на ESP32-P4 +8

    • 21   9100
  • Главная
  • Контакты
© 2026. Все публикации принадлежат авторам.