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

Я хочу придать всплывающему окну material-ui следующую форму, показанную на изображении.

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

Я создал рабочую демонстрацию всплывающего окна, используя реакцию, и поделился ссылкой для редактирования. Любая помощь ? => Рабочая демонстрация

Я тоже делюсь кодом здесь, но было бы хорошо, если бы рабочая демонстрация stackblitz использовалась для редактирования:

import React, { Component } from 'react';
import Popover, {PopoverAnimationVertical} from 'material-ui/Popover';
import Menu from 'material-ui/Menu';
import MenuItem from 'material-ui/MenuItem';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import { render } from 'react-dom';
import Hello from './Hello';
import './style.css';

const PopoverStyle = {
    top: '50px'
};

class App extends Component {

  constructor(props) {
        super(props);
        this.state = { pop_open: false };
    }

  handleProfileDropDown(e) {
        e.preventDefault();
        this.setState({
            pop_open: !this.state.pop_open,
            anchorEl: e.currentTarget,
        });
    }

    handleRequestClose() {
        this.setState({
            pop_open: false,
        });
    };

  render() {
    return (
      <div>
      <MuiThemeProvider>
        <button type="submit" name={this.state.name} onClick={this.handleProfileDropDown.bind(this)} >My Customized PopOver</button>
        <Popover
                      open={this.state.pop_open}
                      anchorEl={this.state.anchorEl}
                      className="popover_class"
                      style={PopoverStyle}
                      anchorOrigin={{horizontal: 'left', vertical: 'bottom'}}
                      targetOrigin={{horizontal: 'left', vertical: 'top'}}
                      onRequestClose={this.handleRequestClose.bind(this)}
                      animation={PopoverAnimationVertical}
                    >
                      <Menu>
                        <MenuItem primaryText="Content" />
                        <MenuItem primaryText="My Profile" />
                        <MenuItem primaryText="Settings" />
                        <MenuItem primaryText="Logout" />
                      </Menu>
                    </Popover>
            </MuiThemeProvider>
      </div>
    );
  }
}

render(<App />, document.getElementById('root'));

person Subhojit    schedule 27.04.2018    source источник


Ответы (2)


Попробуйте добавить это в свой css файл

.popover_class{
  margin-top: 10px;
  border: 1px solid black;
}
.popover_class::before{
  content: '';
  position: absolute;
  top: -20px;
  right: 5px;
  border-bottom: 10px solid black;
  border-right: 10px solid transparent;
  border-left: 10px solid transparent;
  border-top: 10px solid transparent;
  z-index: 10;
}
person Alberto    schedule 27.04.2018
comment
Большое спасибо. Работает нормально. Не могли бы вы сказать мне еще одну вещь, когда я применяю top: 50px к .popover_class, почему он не переопределяет встроенные стили корневого элемента, где указано top < b> 42.0469px (обнаружено при проверке элемента) - person Subhojit; 27.04.2018
comment
popover - это компонент с position: fixed, поэтому для того, чтобы соответствовать вашему компоненту, он не может иметь фиксированного значения top. Если вы укажете компоненту top: 50px, он всегда будет отображаться в одном и том же месте. Я предполагаю, что material-ui вычисляет это для вас в зависимости от того, где размещен ваш компонент. - person Alberto; 27.04.2018
comment
Но даже если я даю position: absolute в .popover_class, он все равно не применяется и не переопределяется. Должен быть какой-то фактор, не так ли? можно ли переопределить с помощью внешнего CSS? - person Subhojit; 27.04.2018
comment
Спасибо, я получил свой ответ. Я забыл попробовать ! Важную вещь: P - person Subhojit; 27.04.2018
comment
Как это сделать, когда я использую модуль css ?? - person Himanshu Tariyal; 04.12.2020

добавить этот стиль в стиль css. Вам нужно только настроить некоторые поля и цвета.

.popover_class:after {
content:"";
position: absolute;
right: 4px;
top: -5px;
width: 0;`
height: 0;
border-style: solid;
border-width: 0 8px 8px 8px;
border-color: transparent transparent green transparent;
z-index:9998;
}
person benn98    schedule 27.04.2018
comment
Большое спасибо. @Andrea Я уже получил ответ :) - person Subhojit; 27.04.2018
comment
Можете ли вы сказать мне еще одну вещь, когда я применяю top: 50px к .popover_class, почему он не переопределяет встроенные стили корневого элемента, где top дается 42.0469px (обнаружено при проверке элемента) - person Subhojit; 27.04.2018
comment
вероятно, потому что style.css - это внешний файл, а в иерархии css он ниже, чем встроенный css (это cssinjs, но это то же самое), который использует material-ui. Попробуйте сделать это top: 50px !important;! Важно, потому что он поднимается до иерархии - person benn98; 27.04.2018
comment
да @Andrea, ты прав. Большое спасибо. Сомнения развеялись. Я забыл попробовать эту штуку. - person Subhojit; 27.04.2018