JSFiddle - React, Tailwind, and code Playground
HTML
<div class="slider">
<div class="slider_wrapper">
<div class="slider_item">
<div style="height: 250px; background: orange;"> <div class="slideText">
<h3>первый</h3>
</div><!--конец slideText-->
</div>
</div>
<div class="slider_item">
<div style="height: 250px; background: green;">
<div class="slideText">
<h3>второй</h3>
</div><!--конец slideText-->
</div>
</div>
<div class="slider_item">
<div style="height: 250px; background: violet;"> <div class="slideText">
<h3>третий</h3>
</div><!--конец slideText-->
</div>
</div>
<div class="slider_item">
<div style="height: 250px; background: coral;">
<div class="slideText">
<h3>четвертый</h3>
</div><!--конец slideText-->
</div>
</div>
</div>
<a class="slider_control slider_control_left" href="#" role="button"></a>
<a class="slider_control slider_control_right" href="#" role="button"></a>
</div>
CSS
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
color: #fff;
height: 3000px;
}
.slider {
position: relative;
overflow: hidden;
}
.slider_wrapper {
display: flex;
transition: transform 0.6s ease;
}
.slider_item {
flex: 0 0 100%;
max-width: 100%;
}
@media (min-width: 980px) {
.slider_item {
flex: 0 0 50%;
max-width: 50%;
}
}
.slider_control {
position: absolute;
top: 50%;
display: flex;
align-items: center;
justify-content: center;
width: 40px;
color: #fff;
text-align: center;
opacity: 0.5;
height: 50px;
transform: translateY(-50%);
background: rgba(0, 0, 0, .5);
}
.slider_control:hover,
.slider_control:focus {
color: #fff;
text-decoration: none;
outline: 0;
opacity: .9;
}
.slider_control_left {
left: 0;
}
.slider_control_right {
right: 0;
}
.slider_control::before {
content: '';
display: inline-block;
width: 20px;
height: 20px;
background: transparent no-repeat center center;
background-size: 100% 100%;
}
.slider_control_left::before {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E");
}
.slider_control_right::before {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E");
}
.slider_item {
line-height: 250px;
font-size: 100px;
text-align: center;
}
...
JavaScript
let multiItemSlider=fr();
// let multiItemSlider = (function () {
function fr(){
function _isElementVisible(element) {
var rect = element.getBoundingClientRect(),
vWidth = window.innerWidth || doc.documentElement.clientWidth,
vHeight = window.innerHeight || doc.documentElement.clientHeight,
elemFromPoint = function (x, y) { return document.elementFromPoint(x, y) };
if (rect.right < 0 || rect.bottom < 0
|| rect.left > vWidth || rect.top > vHeight)
return false;
return (
element.contains(elemFromPoint(rect.left, rect.top))
|| element.contains(elemFromPoint(rect.right, rect.top))
|| element.contains(elemFromPoint(rect.right, rect.bottom - 1))
|| element.contains(elemFromPoint(rect.left, rect.bottom - 1))
);
}
return function (selector, config) {
var
_mainElement = document.querySelector(selector), // основный элемент блока
_sliderWrapper = _mainElement.querySelector('.slider_wrapper'), // обертка для .slider-item
_sliderItems = _mainElement.querySelectorAll('.slider_item'), // элементы (.slider-item)
_sliderControls = _mainElement.querySelectorAll('.slider_control'), // элементы управления
_sliderControlLeft = _mainElement.querySelector('.slider_control_left'), // кнопка "LEFT"
_sliderControlRight = _mainElement.querySelector('.slider_control_right'), // кнопка "RIGHT"
_wrapperWidth = parseFloat(getComputedStyle(_sliderWrapper).width), // ширина обёртки
_itemWidth = parseFloat(getComputedStyle(_sliderItems[0]).width), // ширина одного элемента
_positionLeftItem = 0, // позиция левого активного элемента
_transform = 0, // значение транфсофрмации .slider_wrapper
_step = _itemWidth / _wrapperWidth * 100, // величина шага (для трансформации)
_items = [], // массив элементов
...