Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.05.2020, 20:50
Новичок на форуме
Отправить личное сообщение для bublik787 Посмотреть профиль Найти все сообщения от bublik787
 
Регистрация: 20.05.2020
Сообщений: 2

Управление CSS свойством transform. Слайдер на transform
Делаю сайт на flexbox.
Код:
<div class="headerSliderContainer">
	<p>ПОПУЛЯРНЫЕ ТОВАРЫ</p>
</div>
		




		<div class="sliderContainer">

			<button id="buttonTopMenuLeft" class="buttonTopMenuLeft"></button>
			<div id="slider" class="slider">
				<div id="slider2" class="slider2">
					
					<div id="slide" class="slide">
						<img src="#" alt="">
						<div class="productName"></div>
						<button class="buy">В КОРЗИНУ</button>

					</div>
					
					<div class="slide">
						<img src="#" alt="">
						<div class="productName"></div>
						<button class="buy">В КОРЗИНУ</button>

					</div>
					
					<div class="slide">
						<img src="#" alt="">
						<div class="productName"></div>
						<button class="buy">В КОРЗИНУ</button>

					</div>
					
					<div class="slide">
						<img src="#" alt="">
						<div class="productName"></div>
						<button class="buy">В КОРЗИНУ</button>

					</div>
					
					<div class="slide">
						<img src="#" alt="">
						<div class="productName"></div>
						<button class="buy">В КОРЗИНУ</button>

					</div>
					
					<div class="slide">
						<img src="#" alt="">
						<div class="productName"></div>
						<button class="buy">В КОРЗИНУ</button>

					</div>
					
					<div class="slide">
						<img src="#" alt="">
						<div class="productName"></div>
						<button class="buy">В КОРЗИНУ</button>

					</div>
					
					<div class="slide">
						<img src="#" alt="">
						<div class="productName"></div>
						<button class="buy">В КОРЗИНУ</button>

					</div>
					
					<div class="slide">
						<img src="#" alt="">
						<div class="productName"></div>
						<button class="buy">В КОРЗИНУ</button>

					</div>
					
					<div class="slide">
						<img src="#" alt="">
						<div class="productName"></div>
						<button class="buy">В КОРЗИНУ</button>

					</div>
					
					<div class="slide">
						<img src="#" alt="">
						<div class="productName"></div>
						<button class="buy">В КОРЗИНУ</button>

					</div>
					
					<div class="slide">
						<img src="#" alt="">
						<div class="productName"></div>
						<button class="buy">В КОРЗИНУ</button>

					</div>
					
					<div class="slide">
						<img src="#" alt="">
						<div class="productName"></div>
						<button class="buy">В КОРЗИНУ</button>

					</div>
					
					<div class="slide">
						<img src="#" alt="">
						<div class="productName"></div>
						<button class="buy">В КОРЗИНУ</button>

					</div>
					
					<div class="slide">
						<img src="#" alt="">
						<div class="productName"></div>
						<button class="buy">В КОРЗИНУ</button>

					</div>

				</div><!-- slider2 -->
			</div><!-- slider -->
			<button id="buttonTopMenuRight" class="buttonTopMenuRight"></button>
		</div><!-- sliderContainer -->





Код:
/* SLIDER POPULAR PRODUCT */


/* SLIDER POPULAR PRODUCT */
/* HEADER SLIDER */
.headerSliderContainer{
	display: flex;
	flex-direction: row;
	justify-content: center;
	align-items: center;
	width: 100%;
	height: auto;
	}

.headerSliderContainer p{
	width: 80.3%;
	text-align: center;
	font-size: 40px;
	color: #FFFFFF;
	background: #0112FF;
	border-top-right-radius: 15px;
	border-top-left-radius: 15px;
	}

/* SLIDER POPULAR PRODUCT */
/* SLIDER */
.sliderContainer{
	display: flex;
	flex-direction: row;
	justify-content: center;
	align-items: center;
	width: 100%;
	height: 300px;
	}

.slider{
	max-width: 80%;
	height: 300px;
	overflow: hidden;
	border: 2px outset #0112FF;
	border-radius: 15px;
	border-top-right-radius: 0;
	border-top-left-radius: 0;
	position: sticky;
	}

.slider2{
	display: flex;
	flex-direction: row;
	justify-content: flex-start;
	align-items: center;
	transition: all ease 0.4s;
	transform: none;
	}

.slide{
	width: 294px;
	height: 290px;
	margin: 3px;
	border: 2px outset #0112FF;
	border-radius: 10px;
	}



/* SLIDER POPULAR PRODUCT */
/* BUTTON */
.buttonTopMenuLeft, .buttonTopMenuRight{
	width: 70px;
	height: 71px;
	border: none;
	filter: brightness(40%);
	}

.buttonTopMenuLeft:hover, .buttonTopMenuRight:hover{
	filter: none;
	cursor: pointer;
	transition: filter ease-out 1s;
	}

.buttonTopMenuLeft{
	background: url('../images/sliderTopMenu/arrowLeft.png') no-repeat;
	margin-right: 3px;
	}

.buttonTopMenuRight{
	background: url('../images/sliderTopMenu/arrowRight.png') no-repeat;
	margin-left: 3px;
	}







Код:
// SLIDER TOP

	function Slider2WidthIF(){
		let slideWidth = document.getElementsByClassName('slide');
		let sliderAmout = slideWidth.length;
		let slider2Width = sliderAmout * 300 + 'px';
		
		if (width < 460) {
			slider2Width = sliderAmout * 200 + 'px';
		}

		function Slider2Width() {
			let slider2 = document.getElementById('slider2');
			slider2.style.width = slider2Width;
		}

		Slider2Width();

		document.getElementById('buttonTopMenuLeft').onclick = buttonTopMenuLeft;
		
		function buttonTopMenuLeft() {
			let slider2 = document.getElementById('slider2');
			
			let j = 0;
			
			

			for(let i = 1; i <= sliderAmout; i++) {
				j = j - 300;
				let k = j + 'px';
				slider2.style.transform = `translateX(${k})`;
				return slider2.style.transform; break; 
			}
		}

	}

Slider2WidthIF();


Возникла проблема. Для слайдера свойство left не работает. Нашел выход использовать свойство transform. Но возникла другая загвоздка: transform срабатывает только один раз. Пробовал привязать к нему счетчик
document.getElementById('buttonTopMenuLeft').onclick = buttonTopMenuLeft;
		
		function buttonTopMenuLeft() {
			let slider2 = document.getElementById('slider2');
			
			let j = 0;
			
			

			for(let i = 1; i <= sliderAmout; i++) {
				j = j - 300;
				let k = j + 'px';
				slider2.style.transform = `translateX(${k})`;
				return slider2.style.transform; break; 
			}
		}

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

Последний раз редактировалось bublik787, 21.05.2020 в 00:35.
Ответить с цитированием
  #2 (permalink)  
Старый 20.05.2020, 21:02
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

bublik787,
сделайте макет
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #3 (permalink)  
Старый 20.05.2020, 21:07
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

bublik787,
на всякий случай бесконечная карусель
Ответить с цитированием
  #4 (permalink)  
Старый 21.05.2020, 00:37
Новичок на форуме
Отправить личное сообщение для bublik787 Посмотреть профиль Найти все сообщения от bublik787
 
Регистрация: 20.05.2020
Сообщений: 2

спасибо попробую. Но в целом хотелось бы на будущее знать как выходить из подобной ситуации
Ответить с цитированием
  #5 (permalink)  
Старый 21.05.2020, 08:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

простейший слайдер кнопки управления
bublik787,
<!doctype html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
/* SLIDER POPULAR PRODUCT */
/* SLIDER POPULAR PRODUCT */
/* HEADER SLIDER */
.headerSliderContainer{
	display: flex;
	flex-direction: row;
	justify-content: center;
	align-items: center;
	width: 100%;
	height: auto;
	}
.headerSliderContainer p{
	width: 80.3%;
	text-align: center;
	font-size: 40px;
	color: #FFFFFF;
	background: #0112FF;
	border-top-right-radius: 15px;
	border-top-left-radius: 15px;
	}
/* SLIDER POPULAR PRODUCT */
/* SLIDER */
.sliderContainer{
	display: flex;
	flex-direction: row;
	justify-content: center;
	align-items: center;
	width: 100%;
	height: 300px;
	}
.slider{
	max-width: 80%;
	height: 300px;
	overflow: hidden;
	border: 2px outset #0112FF;
	border-radius: 15px;
	border-top-right-radius: 0;
	border-top-left-radius: 0;
	position: sticky;
    transition: 1s;
	}
.slider2{
	display: flex;
	flex-direction: row;
	justify-content: flex-start;
	align-items: center;
	transition: all ease 0.4s;
	transform: none;
	}
.slide{
	width: 294px;
	height: 290px;
	margin: 3px;
	border: 2px outset #0112FF;
	border-radius: 10px;
	}
/* SLIDER POPULAR PRODUCT */
/* BUTTON */
.buttonTopMenuLeft, .buttonTopMenuRight{
	width: 70px;
	height: 71px;
	border: none;
	filter: brightness(40%);
	}
.buttonTopMenuLeft:hover, .buttonTopMenuRight:hover{
	filter: none;
	cursor: pointer;
	transition: filter ease-out 1s;
	}
.buttonTopMenuLeft{
	background: url('../images/sliderTopMenu/arrowLeft.png') no-repeat;
	margin-right: 3px;
	}
.buttonTopMenuRight{
	background: url('../images/sliderTopMenu/arrowRight.png') no-repeat;
	margin-left: 3px;
	}
    </style>
</head>
<body>
<div class="headerSliderContainer">
	<p>ПОПУЛЯРНЫЕ ТОВАРЫ</p>
</div>
		<div class="sliderContainer">
			<button id="buttonTopMenuLeft" class="buttonTopMenuLeft">Left</button>
			<div id="slider" class="slider">
				<div id="slider2" class="slider2">
					<div class="slide">
						<img src="#" alt="">
						<div class="productName">1</div>
						<button class="buy">В КОРЗИНУ</button>
					</div>
					<div class="slide">
						<img src="#" alt="">
						<div class="productName">2</div>
						<button class="buy">В КОРЗИНУ</button>
					</div>
					<div class="slide">
						<img src="#" alt="">
						<div class="productName">3</div>
						<button class="buy">В КОРЗИНУ</button>
					</div>
					<div class="slide">
						<img src="#" alt="">
						<div class="productName">4</div>
						<button class="buy">В КОРЗИНУ</button>
					</div>
					<div class="slide">
						<img src="#" alt="">
						<div class="productName">5</div>
						<button class="buy">В КОРЗИНУ</button>
					</div>
					<div class="slide">
						<img src="#" alt="">
						<div class="productName">6</div>
						<button class="buy">В КОРЗИНУ</button>
					</div>
					<div class="slide">
						<img src="#" alt="">
						<div class="productName">7</div>
						<button class="buy">В КОРЗИНУ</button>
					</div>
					<div class="slide">
						<img src="#" alt="">
						<div class="productName">8</div>
						<button class="buy">В КОРЗИНУ</button>
					</div>
					<div class="slide">
						<img src="#" alt="">
						<div class="productName">9</div>
						<button class="buy">В КОРЗИНУ</button>
					</div>
					<div class="slide">
						<img src="#" alt="">
						<div class="productName">10</div>
						<button class="buy">В КОРЗИНУ</button>
					</div>
					<div class="slide">
						<img src="#" alt="">
						<div class="productName">11</div>
						<button class="buy">В КОРЗИНУ</button>
					</div>
					<div class="slide">
						<img src="#" alt="">
						<div class="productName">12</div>
						<button class="buy">В КОРЗИНУ</button>
					</div>
					<div class="slide">
						<img src="#" alt="">
						<div class="productName">13</div>
						<button class="buy">В КОРЗИНУ</button>
					</div>
					<div class="slide">
						<img src="#" alt="">
						<div class="productName">14</div>
						<button class="buy">В КОРЗИНУ</button>
					</div>
					<div class="slide">
						<img src="#" alt="">
						<div class="productName">15</div>
						<button class="buy">В КОРЗИНУ</button>
					</div>
				</div><!-- slider2 -->
			</div><!-- slider -->
			<button id="buttonTopMenuRight" class="buttonTopMenuRight">Right</button>
		</div><!-- sliderContainer -->
<script>
(function() {
let divs = document.getElementsByClassName('slide'), len = divs.length, index = 0, max = len - 1;
let slider = document.getElementById('slider2');
document.getElementById('buttonTopMenuLeft').onclick = moveLeft;
		function moveLeft() {
		        index = Math.min(++index, max);
                let left = divs[index].offsetLeft;
                let x = Math.min(left, slider.scrollWidth - slider.clientWidth);
                if(x != left) max = index;
				slider.style.transform = `translateX(${-x}px)`;
		}
document.getElementById('buttonTopMenuRight').onclick = moveRight;
		function moveRight() {
		        index = Math.max(--index, 0);
                let left = divs[index].offsetLeft;
				slider.style.transform = `translateX(${-left}px)`;
		}
window.onresize = function() {
   max = len - 1;
   index = 0
   slider.style.transform = `translateX(0px)`;
}
})()
</script>
</body>
</html>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CSS animation математический маятник Блондинка (X)HTML/CSS 33 20.03.2019 22:28
transform - управление через jQuery al456 jQuery 2 11.04.2017 10:12
Поиск и изменение чисел в строке Jluct Общие вопросы Javascript 8 09.04.2015 23:43
Слайдер с помощью CSS и jQuery - 1000 р. stixia007 jQuery 21 27.03.2013 22:44
Слайдер CSS + jQuery глюк Acreator57887 Javascript под браузер 13 28.06.2012 16:54