Правильное продвижение холста с помощью постоянных ящиков пользовательского интерфейса материала

У меня есть приложение с двумя расширяемыми панелями инструментов. Левая панель инструментов работает так, как задумано, но мне не удалось заставить правую панель инструментов правильно подталкивать контент. См. Код ниже.

Я скопировал точный код отсюда - см. Постоянные ящики: https://material-ui.com/demos/drawers/

KeyboardListener отображается: none, а элемент SceneCanvas имеет следующий стиль:

root: {
    height: '100%',
    width: '100%',
    position: 'relative',
    zIndex: 0,
    lineHeight: 0,
    cursor: 'crosshair',
}

Желаемая функциональность заключается в том, чтобы левая и правая панели инструментов проталкивали содержимое внутрь и изменяли размер холста и содержимого холста. И советы или идеи были бы очень признательны!

import React from 'react';
import classNames from 'classnames';
import { withStyles } from '@material-ui/core/styles';
import Drawer from '@material-ui/core/Drawer';
import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar';
import List from '@material-ui/core/List';
import MenuItem from '@material-ui/core/MenuItem';
import Typography from '@material-ui/core/Typography';
import TextField from '@material-ui/core/TextField';
import Divider from '@material-ui/core/Divider';
import IconButton from '@material-ui/core/IconButton';
import MenuIcon from '@material-ui/icons/Menu';
import ChevronLeftIcon from '@material-ui/icons/ChevronLeft';
import ChevronRightIcon from '@material-ui/icons/ChevronRight';
import SceneCanvas from '../../three/SceneCanvas';
import KeyboardListener from '../KeyboardListener';

const drawerWidth = 240;

const styles = theme => ({
  root: {
    flexGrow: 1,
  },
  appFrame: {
    height: 430,
    zIndex: 1,
    overflow: 'hidden',
    position: 'relative',
    display: 'flex',
    width: '100%',
  },
  appBar: {
    position: 'absolute',
    transition: theme.transitions.create(['margin', 'width'], {
      easing: theme.transitions.easing.sharp,
      duration: theme.transitions.duration.leavingScreen,
    }),
  },
  appBarShift: {
    width: `calc(100% - ${drawerWidth}px)`,
    transition: theme.transitions.create(['margin', 'width'], {
      easing: theme.transitions.easing.easeOut,
      duration: theme.transitions.duration.enteringScreen,
    }),
  },
  'appBarShift-left': {
    marginLeft: drawerWidth,
  },
  'appBarShift-right': {
    marginRight: drawerWidth,
  },
  menuButton: {
    marginLeft: 12,
    marginRight: 20,
  },
  hide: {
    display: 'none',
  },
  drawerPaper: {
    position: 'relative',
    width: drawerWidth,
  },
  drawerHeader: {
    display: 'flex',
    alignItems: 'center',
    justifyContent: 'flex-end',
    padding: '0 8px',
    ...theme.mixins.toolbar,
  },
  content: {
    flexGrow: 1,
    backgroundColor: theme.palette.background.default,
    padding: theme.spacing.unit * 3,
    transition: theme.transitions.create('margin', {
      easing: theme.transitions.easing.sharp,
      duration: theme.transitions.duration.leavingScreen,
    }),
  },
  'content-left': {
    marginLeft: -drawerWidth,
  },
  'content-right': {
    marginRight: -drawerWidth,
  },
  contentShift: {
    transition: theme.transitions.create('margin', {
      easing: theme.transitions.easing.easeOut,
      duration: theme.transitions.duration.enteringScreen,
    }),
  },
  'contentShift-left': {
    marginLeft: 0,
  },
  'contentShift-right': {
    marginRight: 0,
  },
});

class Header extends React.Component {
  state = {
    open: false,
    anchor: 'left',
  };

  handleDrawerOpen = () => {
    this.setState({ open: true });
  };

  handleDrawerClose = () => {
    this.setState({ open: false });
  };

  handleChangeEventAnchor = (event) => {
    this.setState({
      anchor: event.target.value,
    });
  };

  render() {
    const { classes, theme } = this.props;
    const { anchor, open } = this.state;

    const drawer = (
      <Drawer
        variant = "persistent"
        anchor = {anchor}
        open = {open}
        classes = {{
          paper: classes.drawerPaper,
        }}
      >
        <div className = {classes.drawerHeader}>
          <IconButton onClick = {this.handleDrawerClose}>
            {theme.direction === 'rtl' ? <ChevronRightIcon /> : <ChevronLeftIcon />}
          </IconButton>
        </div>
        <Divider />
        <List>Testing</List>
        <Divider />
        <List>Testing</List>
      </Drawer>
    );

    let before = null;
    let after = null;

    if (anchor === 'left') {
      before = drawer;
    } else {
      after = drawer;
    }

    return (
      <div className = {classes.root}>
        <TextField
          id = "persistent-anchor"
          select
          label = "Anchor"
          value = {anchor}
          onChange = {this.handleChangeEventAnchor}
          margin = "normal"
        >
          <MenuItem value = "left">left</MenuItem>
          <MenuItem value = "right">right</MenuItem>
        </TextField>
        <div className = {classes.appFrame}>
          <AppBar
            className = {classNames(classes.appBar, {
              [classes.appBarShift]: open,
              [classes[`appBarShift-${anchor}`]]: open,
            })}
          >
            <Toolbar disableGutters = {!open}>
              <IconButton
                color = "inherit"
                aria-label = "open drawer"
                onClick = {this.handleDrawerOpen}
                className = {classNames(classes.menuButton, open && classes.hide)}
              >
                <MenuIcon />
              </IconButton>
              <Typography variant = "title" color = "inherit" noWrap>
                Persistent drawer
              </Typography>
            </Toolbar>
          </AppBar>
          {before}
          <main
            className = {classNames(classes.content, classes[`content-${anchor}`], {
              [classes.contentShift]: open,
              [classes[`contentShift-${anchor}`]]: open,
            })}
          >
            <div className = {classes.drawerHeader} />
            <KeyboardListener />
            <SceneCanvas />
          </main>
          {after}
        </div>
      </div>
    );
  }
}

export default withStyles(styles, { withTheme: true })(Header);

Левая панель инструментов работает правильно

Правильное продвижение холста с помощью постоянных ящиков пользовательского интерфейса материала

Правая панель инструментов ломается

Правильное продвижение холста с помощью постоянных ящиков пользовательского интерфейса материала

Желаемая функция Правильное продвижение холста с помощью постоянных ящиков пользовательского интерфейса материала

Правильное продвижение холста с помощью постоянных ящиков пользовательского интерфейса материала

Правильное продвижение холста с помощью постоянных ящиков пользовательского интерфейса материала

Правильное продвижение холста с помощью постоянных ящиков пользовательского интерфейса материала

Каким образом вы можете заставить этот фрагмент где-нибудь работать? Или вы открыты только для примера css?

Serg Chernata 13.09.2018 19:37

@SergChernata Это был самый простой способ показать проблему. Мы нашли решение, но оно не было связано с приведенным выше кодом. Я посмотрю, сможем ли мы опубликовать решение здесь.

Seth Duncan 13.09.2018 21:29

Полагаю, проблема в отрицательной марже? Может, стоит установить правильную ширину холста вместо отрицательных полей?

Marson Mao 13.12.2018 11:39

Возможно, вы сможете использовать отступы для компенсации отрицательных полей? Вот как это звучит при использовании компонента Grid (который также использует отрицательные поля)

user9903 22.12.2018 23:04
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
7
4
5 102
0

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