Исправлено меню пользовательского интерфейса материала

#reactjs #material-ui

#reactjs #материал-пользовательский интерфейс

Вопрос:

Мне интересно, есть ли возможность добавить фиксированный элемент меню в меню? Я хотел бы использовать один из элементов меню для отображения заголовка. Также, если есть другие решения, я тоже готов их попробовать.

Вот структура:

 <Menu>
    <MenuItem className={classes.header}>This is header</MenuItem>
    <MenuItem>Item</MenuItem>
    <MenuItem>Item</MenuItem>
    <MenuItem>Item</MenuItem>
</Menu>
 

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

 header: {
   position: 'fixed',
},
 

РЕДАКТИРОВАТЬ: чтобы немного прояснить, что я ищу. У GitHub такое же меню:

введите описание изображения здесь

Комментарии:

1. Для меня это действительно не имеет никакого смысла. фиксированная позиция означает «Не двигаться, когда пользователь прокручивает или что-то в этом роде» Как это будет применяться к элементам меню? Вы имеете в виду «Показать его перед (поверх) любой другой вещи»?

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

3. вы хотите, чтобы это выглядело как таблица?

4. ОК. теперь это имеет больше смысла. Я думаю, что прокручивать Menu — не очень хорошая идея. Но по какой-либо причине; это может лучше всего подойти для вашего использования. Но попробуйте использовать другие виджеты, если ваше меню такое длинное.

5. Я добавил изображение в исходное сообщение, чтобы очистить то, что я ищу

Ответ №1:

Вы можете использовать position sticky , но вам также нужно будет «настроить» z-index из-за этой проблемы:
проблема с переполнением

итак, вы можете сделать что-то подобное (на основе примера пользовательского интерфейса material):

 import React from "react";
import IconButton from "@material-ui/core/IconButton";
import Menu from "@material-ui/core/Menu";
import MenuItem from "@material-ui/core/MenuItem";
import { makeStyles } from "@material-ui/core/styles";
import MoreVertIcon from "@material-ui/icons/MoreVert";

import { Paper, TextField } from "@material-ui/core";
const useStyles = makeStyles({
  header: {
    position: "sticky",
    top: 0,
    backgroundColor: "white",
     zIndex: 2
  },
  search: {
    marginBottom: "5px",
    
  },
  card: {
    width: "100%"
  }
});

const options = [
  "None",
  "Atria",
  "Callisto",
  "Dione",
  "Ganymede",
  "Hangouts Call",
  "Luna",
  "Oberon",
  "Phobos",
  "Pyxis",
  "Sedna",
  "Titania",
  "Triton",
  "Umbriel"
];

const ITEM_HEIGHT = 48;

export default function LongMenu() {
  const [anchorEl, setAnchorEl] = React.useState(null);
  const open = Boolean(anchorEl);
  const classes = useStyles();
  const handleClick = (event) => {
    setAnchorEl(event.currentTarget);
  };

  const handleClose = () => {
    setAnchorEl(null);
  };

  return (
    <div>
      <IconButton
        aria-label="more"
        aria-controls="long-menu"
        aria-haspopup="true"
        onClick={handleClick}
      >
        <MoreVertIcon />
      </IconButton>
      <Menu
        elevation={1}
        className={classes.menu}
        id="long-menu"
        anchorEl={anchorEl}
        keepMounted
        open={open}
        onClose={handleClose}
        PaperProps={{
          style: {
            maxHeight: ITEM_HEIGHT * 4.5,
            width: "800px",
            backgroundColor: "white"
          }
        }}
      >
        <div className={classes.header}>
          <Paper className={classes.card} elevation={3}>
            <TextField
              className={classes.search}
              label={"search filter"}
              variant={"outlined"}
            ></TextField>
          </Paper>
        </div>
        {options.map((option) => (
          <MenuItem
            key={option}
            selected={option === "Pyxis"}
            onClick={handleClose}
          >
            {option}
          </MenuItem>
        ))}
      </Menu>
    </div>
  );
}

 

вот ссылка на песочницу
это результат после добавления z-индекса:
с z-индексом

Комментарии:

1. Спасибо, этот работает просто идеально. Сначала я попытался установить z-index в пункт меню, но по какой-то причине это не решило проблему.

2. попробуйте разные числа для z-index. как низкие, так и высокие значения.