mirror of
https://github.com/a2nt/webpack-bootstrap-ui-kit.git
synced 2024-10-22 11:05:45 +02:00
IMPR: Carousel accesability attributes
This commit is contained in:
parent
9df78276e9
commit
c0d4f554ff
@ -2,82 +2,85 @@ import Events from '../_events';
|
|||||||
import Carousel from 'bootstrap/js/src/carousel';
|
import Carousel from 'bootstrap/js/src/carousel';
|
||||||
|
|
||||||
const CarouselUI = ((window) => {
|
const CarouselUI = ((window) => {
|
||||||
const NAME = 'js-carousel';
|
const NAME = 'js-carousel';
|
||||||
|
|
||||||
const init = () => {
|
const init = () => {
|
||||||
console.log(`${NAME}: init`);
|
console.log(`${NAME}: init`);
|
||||||
|
|
||||||
document.querySelectorAll(`.${NAME}`).forEach((el, i) => {
|
document.querySelectorAll(`.${NAME}`).forEach((el, i) => {
|
||||||
const carousel = new Carousel(el);
|
const carousel = new Carousel(el);
|
||||||
// create next/prev arrows
|
// create next/prev arrows
|
||||||
if (el.dataset.bsArrows) {
|
if (el.dataset.bsArrows) {
|
||||||
const next = document.createElement('button');
|
const next = document.createElement('button');
|
||||||
next.classList.add('carousel-control-next');
|
next.classList.add('carousel-control-next');
|
||||||
next.setAttribute('type', 'button');
|
next.setAttribute('type', 'button');
|
||||||
next.setAttribute('data-bs-target', el.getAttribute('id'));
|
prev.setAttribute('aria-label', 'Next Slide');
|
||||||
next.setAttribute('data-bs-slide', 'next');
|
next.setAttribute('data-bs-target', el.getAttribute('id'));
|
||||||
next.addEventListener('click', (e) => {
|
next.setAttribute('data-bs-slide', 'next');
|
||||||
carousel.next();
|
next.addEventListener('click', (e) => {
|
||||||
|
carousel.next();
|
||||||
|
});
|
||||||
|
next.innerHTML = '<span class="carousel-control-next-icon" aria-hidden="true"></span><span class="visually-hidden">Next</span>';
|
||||||
|
el.appendChild(next);
|
||||||
|
|
||||||
|
const prev = document.createElement('button');
|
||||||
|
prev.setAttribute('type', 'button');
|
||||||
|
prev.setAttribute('aria-label', 'Previous Slide');
|
||||||
|
prev.classList.add('carousel-control-prev');
|
||||||
|
prev.setAttribute('data-bs-target', el.getAttribute('id'));
|
||||||
|
prev.setAttribute('data-bs-slide', 'prev');
|
||||||
|
prev.addEventListener('click', (e) => {
|
||||||
|
carousel.prev();
|
||||||
|
});
|
||||||
|
prev.innerHTML = '<span class="carousel-control-prev-icon" aria-hidden="true"></span><span class="visually-hidden">Previous</span>';
|
||||||
|
el.appendChild(prev);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (el.dataset.bsIndicators) {
|
||||||
|
const indicators = document.createElement('div');
|
||||||
|
indicators.classList.add('carousel-indicators');
|
||||||
|
const items = el.querySelectorAll('.carousel-item');
|
||||||
|
let i = 0;
|
||||||
|
while (i < items.length) {
|
||||||
|
const ind = document.createElement('button');
|
||||||
|
ind.setAttribute('type', 'button');
|
||||||
|
ind.setAttribute('aria-label', 'Slide to #' + (i + 1));
|
||||||
|
if (i == 0) {
|
||||||
|
ind.classList.add('active');
|
||||||
|
}
|
||||||
|
ind.setAttribute('data-bs-target', el.getAttribute('id'));
|
||||||
|
ind.setAttribute('data-bs-slide-to', i);
|
||||||
|
|
||||||
|
ind.addEventListener('click', (e) => {
|
||||||
|
const target = e.target;
|
||||||
|
carousel.to(target.getAttribute('data-bs-slide-to'));
|
||||||
|
indicators.querySelectorAll('.active').forEach((ind2) => {
|
||||||
|
ind2.classList.remove('active');
|
||||||
|
});
|
||||||
|
target.classList.add('active');
|
||||||
|
});
|
||||||
|
|
||||||
|
indicators.appendChild(ind);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
el.appendChild(indicators);
|
||||||
|
el.addEventListener('slide.bs.carousel', (e) => {
|
||||||
|
el.querySelectorAll('.carousel-indicators .active').forEach((ind2) => {
|
||||||
|
ind2.classList.remove('active');
|
||||||
|
});
|
||||||
|
el.querySelectorAll(`.carousel-indicators [data-bs-slide-to="${ e.to }"]`).forEach((ind2) => {
|
||||||
|
ind2.classList.add('active');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
el.classList.add(`${NAME}-active`);
|
||||||
});
|
});
|
||||||
next.innerHTML = '<span class="carousel-control-next-icon" aria-hidden="true"></span><span class="visually-hidden">Next</span>';
|
};
|
||||||
el.appendChild(next);
|
|
||||||
|
|
||||||
const prev = document.createElement('button');
|
window.addEventListener(`${Events.LODEDANDREADY}`, init);
|
||||||
prev.setAttribute('type', 'button');
|
window.addEventListener(`${Events.AJAX}`, init);
|
||||||
prev.classList.add('carousel-control-prev');
|
|
||||||
prev.setAttribute('data-bs-target', el.getAttribute('id'));
|
|
||||||
prev.setAttribute('data-bs-slide', 'prev');
|
|
||||||
prev.addEventListener('click', (e) => {
|
|
||||||
carousel.prev();
|
|
||||||
});
|
|
||||||
prev.innerHTML = '<span class="carousel-control-prev-icon" aria-hidden="true"></span><span class="visually-hidden">Previous</span>';
|
|
||||||
el.appendChild(prev);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (el.dataset.bsIndicators) {
|
|
||||||
const indicators = document.createElement('div');
|
|
||||||
indicators.classList.add('carousel-indicators');
|
|
||||||
const items = el.querySelectorAll('.carousel-item');
|
|
||||||
let i = 0;
|
|
||||||
while (i < items.length) {
|
|
||||||
const ind = document.createElement('button');
|
|
||||||
ind.setAttribute('type', 'button');
|
|
||||||
if (i == 0) {
|
|
||||||
ind.classList.add('active');
|
|
||||||
}
|
|
||||||
ind.setAttribute('data-bs-target', el.getAttribute('id'));
|
|
||||||
ind.setAttribute('data-bs-slide-to', i);
|
|
||||||
|
|
||||||
ind.addEventListener('click', (e) => {
|
|
||||||
const target = e.target;
|
|
||||||
carousel.to(target.getAttribute('data-bs-slide-to'));
|
|
||||||
indicators.querySelectorAll('.active').forEach((ind2) => {
|
|
||||||
ind2.classList.remove('active');
|
|
||||||
});
|
|
||||||
target.classList.add('active');
|
|
||||||
});
|
|
||||||
|
|
||||||
indicators.appendChild(ind);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
el.appendChild(indicators);
|
|
||||||
el.addEventListener('slide.bs.carousel', (e) => {
|
|
||||||
el.querySelectorAll('.carousel-indicators .active').forEach((ind2) => {
|
|
||||||
ind2.classList.remove('active');
|
|
||||||
});
|
|
||||||
el.querySelectorAll(`.carousel-indicators [data-bs-slide-to="${ e.to }"]`).forEach((ind2) => {
|
|
||||||
ind2.classList.add('active');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
el.classList.add(`${NAME}-active`);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
window.addEventListener(`${Events.LODEDANDREADY}`, init);
|
|
||||||
window.addEventListener(`${Events.AJAX}`, init);
|
|
||||||
})(window);
|
})(window);
|
||||||
|
|
||||||
export default CarouselUI;
|
export default CarouselUI;
|
||||||
|
Loading…
Reference in New Issue
Block a user