Как сделать Material-ui Modal прокручиваемым

Я создал Modal и поместил в него текст, описывающий мое приложение и то, как его использовать, но текст выходит за пределы Modal, поэтому верх и низ текста не видны. Я хотел бы сделать компонент прокручиваемым, чтобы мой текст не выходил за края страницы.

// The styling for the modal
const styles = theme => ({
    paper: {
        position: 'absolute',
        width: theme.spacing.unit * 130,
        backgroundColor: theme.palette.background.paper,
        boxShadow: theme.shadows[5],
        padding: theme.spacing.unit * 4,
    },
});


function getModalStyle() {
    const top = 50
    const left = 50

    return {
        top: `${top}%`,
        left: `${left}%`,
        transform: `translate(-${top}%, -${left}%)`,
        overflow: "scroll"
    };
}
// The actual modal
<Modal
    aria-labelledby = "simple-modal-title"
    aria-describedby = "simple-modal-description"
    open = {this.state.modalOpen}
    onClose = {this.handleModalClose}
>
    <div style = {getModalStyle()} className = {classes.paper}>
        <MyLongTextComponent/>
    </div>
</Modal>

Я бы хотел, чтобы функция прокрутки не зависела от фактической страницы за ней. Я не нашел большой помощи в Интернете, поэтому любые указатели были бы очень полезны! Кроме того, если Modal не подходит для использования в этой ситуации, сообщите мне. Я в меру новичок в React и material-ui, поэтому, если есть способ получше, я бы хотел узнать, как это сделать.

Будет лучше, если вы сможете создать демонстрацию stackblitz

Just code 27.12.2018 05:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
15
1
25 693
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вам повезет больше, если вы воспользуетесь компонентом Dialog. Modal - это конструкция нижнего уровня, которую использует Dialog. Вы можете найти примеры диалогов в разделе демонстрации компонентов.

Спасибо! Я начал с Backdrop и очень старался заставить его работать. Не понимал, что Dialog - это то, что я искал.

Victor Lazaro 11.03.2021 22:38
Ответ принят как подходящий

Для модального стиля вам нужно использовать overflow = scroll.

Ниже приведен пример кода для получения модального интерфейса материала с прокруткой. withStyles используется для применения стиля к модальному в этом примере.

Большое спасибо! Это привело меня к правильному пути решения проблемы.

Jahziel Villasana 28.12.2018 19:32

@JahzielVillasana Рад, что это привело вас к решению, но к вашему сведению, теперь я обновил документация для Modal, чтобы прояснить, что Диалог обычно является отправной точкой для модальных диалогов, а не модальных, чтобы вы не изобретали решения заново ( для таких вещей, как наличие прокручиваемого содержимого), которые уже решены заранее с помощью Dialog.

Ryan Cogswell 31.12.2018 04:08

Я знаю, что на этот вопрос уже был дан ответ, но я нашел проверенный ответ неполным.

Для создания правильного модального окна вы, скорее всего, захотите, чтобы он имел максимальную высоту и был разделен на 3 основных раздела:

  • Заголовок
  • Содержание
  • Нижний колонтитул (необязательно)

Если у вас длинный список элементов в содержимом (т.е. форма), установка overflow: 'scroll' на modal приведет к двум основным проблемам:

  • maxHeight будет применен только к контейнеру, в то время как остальная часть содержимого будет по-прежнему видна под ним.
  • Когда пользователь будет прокручивать, заголовок также будет прокручиваться вне поля зрения.

Пример, близкий к производственному, включающий только заголовок и контент, будет выглядеть следующим образом:

const styles = theme => ({
  modal:{
    position:'absolute',
    top:'10%',
    left:'10%',
    overflow:'hidden',
    height:'100%',
    maxHeight: 500,
    display:'block'
  },
  header: {
    padding: '12px 0',
    borderBottom: '1px solid darkgrey'
  },
  content: {
    padding: 12,
    overflow: 'scroll'
  }
});

const { classes } = this.props
<Modal open = {this.state.open}>
  <div className = {classes.modal}>
    <div className = {classes.heading}>
      <h4>Your Title here</h4>
    </div>

    <div className = {classes.content}>
      <Button size = "small" color = "primary" variant = "contained" onClick = {this.closeOrder}>
        Close
      </Button>

      {this.getPics()}
    </div>    
  </div>
</Modal>

Помимо лучшего форматирования, это решение также имеет два основных отличия, которые решают реальные проблемы, описанные выше:

  • Modal имеет overflow: hidden, скрывающий все за пределами своей коробки
  • Контент имеет overflow: scroll, который не увеличивает заголовок, и это то, что мы ищем

Надеюсь это поможет!

Для тех, кто ищет быстрый ответ на этот вопрос, вот решение, которое я нашел:

<Modal
                open = {open}
                onClose = {handleClose}
                aria-labelledby = "simple-modal-title"
                aria-describedby = "simple-modal-description"
                style = {{ overflow: 'scroll' }}
              >

       <div style = {
       zIndex: 10,
       position: absolute,}>
{/*your content here*/}
       </div>

</Modal>

Итак, всего 2 простых шага ...

  1. Сделать модальное переполнение прокручиваемым

    <Modal
                 style = {{ overflow: 'scroll' }}
               >
    
  2. Обновите стили для каждого прямого потомка модального окна. Вам необходимо добавить как минимум эти 2 атрибута:

    <div style = {
    zIndex: 10,
    position: absolute,}>
    

Затем вы можете использовать css для изменения положения содержимого со свойствами top или left или настроить контейнер по своему усмотрению. Для решения этой проблемы не нужно переключаться на компонент Dialog.

Другие вопросы по теме