Введение Струтура компонента Состояние компонента Реализация Ссылки

Slider Comments

Слайдер с комментариями это тот же слайдер, но вместо фотографий используем текстовую информацию. Обычно так визуализируют на сайтах комментарии или какую либо информацию. Прочитать подробнее о slider.

Структура компонента

Структура компонента так же похожа на структуру slider. Однако вместо фотографий представлены параграфы с заголовками. Расположение элементов управления также отличается. Видимое состояние так же опирается на meatballs. Вот как выглядит этот слайдер.

Структура слайдера

Реализация

Для начала в папке с компонентами создаём новую папку O_SliderComments, в неё кладём файлы jsx и css, в которых будем создавать и стилизовать компонент. Затем описываем функционал слайдера с компонентами. Получаем следующий код.

import React, { PureComponent } from 'react'
import Q_MeatBall from '../../quarks/Q_MeatBall/Q_MeatBall.jsx'
import './O_SliderComments.css'
import '../../quarks/Q_Icon.css'

export default class O_SliderComments extends PureComponent {
  constructor(props) {
    super(props)

    this.state = {
      slides: props.slides,
      activeIndex: 0
    }
  }

  updateIndex = (newIndex) => {
    if (newIndex < 0) {
      newIndex = this.state.slides.length - 1
    } else if (newIndex >= this.state.slides.length) {
      newIndex = 0
    }

    this.setState((prevState) => ({
      ...prevState,
      activeIndex: newIndex
    }))
  }

  render() {
    const { activeIndex, slides } = this.state

    return (
      <div className="O_SliderComment">
        <div className="W_SliderCommentContent">
          <div className="Q_Icon arrow-left" onClick={() => this.updateIndex(activeIndex - 1)}></div>

          <div className="W_SliderCommentOpenFrame">
            <div className="C_SliderCommentRail" style={{ transform: `translateX(-${activeIndex * 600}px)` }}>
              {slides.map(({ title, content }) => (
                <div key={title} className="W_SliderCommentText">
                  <h3>{title}</h3>
                  <p>{content}</p>
                </div>
              ))}
            </div>
          </div>

          <div className="Q_Icon arrow-right" onClick={() => this.updateIndex(activeIndex + 1)}></div>
        </div>

        <div className="W_SliderCommentsStatus">
          {slides.map((img, index) => (
            <Q_MeatBall key={index} selected={index === activeIndex} />
          ))}
        </div>
      </div>
    )
  }
}

Теперь задаём стили для компонента. Код выглядит так.

.O_SliderComment {
  position: relative;
  width: 740px;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}

.O_SliderComment .W_SliderCommentContent {
  width: 100%;
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.O_SliderComment .W_SliderCommentOpenFrame {
  width: 600px;
  display: flex;
  overflow: hidden;
  transform: translate3d(0, 0, 0);
}

.O_SliderComment .C_SliderCommentRail {
  display: flex;
  transition: transform 0.3s;
}

.O_SliderComment .W_SliderCommentText {
  width: 600px;
  text-align: center;
  color: #495151;
}

.O_SliderComment .W_SliderCommentText p {
  font-size: 16px;
  line-height: 140%;
  font-weight: 200;
}

.O_SliderComment .W_SliderCommentText h3 {
  font-size: 20px;
  font-weight: 600;
}

.O_SliderComment .W_SliderCommentsStatus {
  display: flex;
  margin: 20px auto;
}

.O_SliderComment .Q_Icon {
  width: 35px;
  height: 35px;
}

Вместо картинок выводим текстовую информацию. Заполняем массив и выводим компонент в файле сборщика. Выглядит он у нас так slider comments.

import React from 'react'
import ReactDOM from 'react-dom'
import O_SliderComments from '../../components/organisms/O_SliderComments/O_SliderComments.jsx'

const slides = [
  {
    title: 'Авокадо',
    content:
      'Завтрак с авокадо - самый вкусный завтрак.
      Кто не любит этот фрукт, тот просто не ел его правильно!
      Мое любимое авокадо, которое помогает мне не хандрить.'
  },
  {
  title: 'Киви',
  content:
    'Фрукт этот это просто кладезь витаминов и микроэлементов,
    содержит в себе и кальций и магний и железо и калий,
    так же богат витаминами такими как йод, фосфор
    и цинк, а так же витамины группы В,C, PP, E и A.'
  }
]

document.addEventListener('DOMContentLoaded', () => {
  ReactDOM.render(
    <O_SliderComments slides={slides} />,
    document.body
  )
})

Получаем следующий результат:

Структура слайдера

Также для тебя ссылки на Figma с дизайн системой и GitHub с библиотекой компонентов.

Составляющие

В этот компонент часто выводятся следующие компоненты.