#javascript #css #reactjs
Вопрос:
Привет, я пытаюсь создать слайдер изображения, который можно перемещать с помощью кнопки next/prev. У меня также есть массив данных, которые будут отображаться на карте. Так что это мой код.
import React,{useState, useEffect} from 'react' import { ThirdContainer, SecondContainer, ButtonLeft, ButtonRight, ButtonTitle, Container, FirstRow, FirstTitle, SecondRow, SecondTitle, TitleContainer } from './FirstSectionStyled' const FirstSection = ({bgData}) =gt; { //functions const nextSLide = () =gt;{} const prevSlide = () =gt;{} return ( lt;Containergt; lt;ButtonLeft onClick={prevSLide}/gt; lt;SecondContainer id="scroller"gt; {bgData.map((data,index) =gt; ( lt;ThirdContainer key={data.id} backgroundImg = {data.backgroundImg}gt; lt;FirstRowgt; lt;TitleContainergt; lt;FirstTitlegt;{data.firstTitle}lt;/FirstTitlegt; lt;SecondTitlegt;{data.secondTitle}lt;/SecondTitlegt; lt;ButtonTitlegt;Buy Nowlt;/ButtonTitlegt; lt;/TitleContainergt; lt;/FirstRowgt; lt;SecondRowgt; lt;/SecondRowgt; lt;/ThirdContainergt; )) } lt;/SecondContainergt; lt;ButtonRight onClick={nextSLide} /gt; lt;/Containergt; ) } export default FirstSection
И это стилизованный компонент
export const SecondContainer = styled.div` height:100%; width: 100vw; overflow-x: auto; background: black; display : flex; ` export const ThirdContainer = styled.div` min-width: 100vw; display: grid; grid-template-rows: 70% 30%; background-image: linear-gradient(to bottom, rgb(21, 21, 21, 0.5), rgb(21, 21, 21, 0.2), rgb(21, 21, 21, 0.2), rgb(21, 21, 21, 0.4)), url(${(props) =gt; (props.backgroundImg)}); background-position: center center; background-repeat: no-repeat; background-size: cover; `
Проблема в том, как я могу заставить SecondContainer
прокручивать ось x на 100 Вт каждый раз, когда нажимается кнопка, чтобы она отображала следующую ThirdContainer
и создавала эффект слайдера изображения. Я также хочу, чтобы он плавно анимировался. Итак, есть идеи, как это решить? Спасибо тебе!
Комментарии:
1.
element.scrollTo(x-coord, y-coord)
используйтеscrollTo
функцию, прочитайте элемент с помощьюdocument.getByClassName(....)
2. как я могу заставить его прокручиваться на 100 Вт ? потому что это выдает ошибку, когда я вставляю 100 vw.
3. Вы не можете перейти к
vw
!. вам нужно найти ширину элемента с помощьюelement.innerWidth
, а затем прокрутите до этого значения внутренней ширины4. не могли бы вы, пожалуйста, объяснить мне, как это сделать? Как я могу получить значение ширины экрана и использовать его
scrollto
, потому что я хочу, чтобы он был отзывчивым. Извините, потому что я все еще новичок в этом.5. Опубликую это в ответе
Ответ №1:
Добавьте имя класса в свой контейнер
lt;ThirdContainer className='third-container' ....
import React,{useState, useEffect} from 'react' import { ThirdContainer, SecondContainer, ButtonLeft, ButtonRight, ButtonTitle, Container, FirstRow, FirstTitle, SecondRow, SecondTitle, TitleContainer } from './FirstSectionStyled' const FirstSection = ({bgData}) =gt; { //functions const nextSLide = (index) =gt;{ let ele = document. getElementsByClassName('third-container')[0] //replace 0 with current active slide index document.getElementByClassName('second-container').scrollTo(ele.offsetWidth) } const prevSlide = () =gt;{} return ( lt;Containergt; lt;ButtonLeft onClick={prevSLide}/gt; lt;SecondContainer className="second-container" id="scroller"gt; {bgData.map((data,index) =gt; ( lt;ThirdContainer className='third-container' key={data.id} backgroundImg = {data.backgroundImg}gt; lt;FirstRowgt; lt;TitleContainergt; lt;FirstTitlegt;{data.firstTitle}lt;/FirstTitlegt; lt;SecondTitlegt;{data.secondTitle}lt;/SecondTitlegt; lt;ButtonTitlegt;Buy Nowlt;/ButtonTitlegt; lt;/TitleContainergt; lt;/FirstRowgt; lt;SecondRowgt; lt;/SecondRowgt; lt;/ThirdContainergt; )) } lt;/SecondContainergt; lt;ButtonRight onClick={nextSLide} /gt; lt;/Containergt; ) } export default FirstSection
пожалуйста, обратите внимание, что это не тестируется в реальных условиях. этот метод может помочь вам его реализовать. если он все еще не работает, пожалуйста, опубликуйте свой код в slackBits и поделитесь ссылкой в комментариях
Комментарии:
1. @Woppy Не забудьте проголосовать и отметить ответ, если это окажется для вас полезным