Как создать анимированное всплывающее модальное окно используя HTML CSS и JavaScript
Вёрстка модальных окон
Практически каждый сайт использует модальные окна для различных целей: отображение уведомлений, подтверждение действий, сбор информации и прочее. В этой главе мы рассмотрим два способа отображения модальных окон: новый и универсальный. Новые модальные окна Новые модальные окна имеют очень простой синтаксис HTML: <dialog open>Это модальное окно</dialog> Для отображения модального окна, необходимо добавить атрибут open К сожалению, обойтись совсем без JavaScript здесь невозможно, поэтому далее я приведу пример кода, который минимизирует ваше взаимодействие с JavaScript...
👨💻 Организация модальных окон Большая радость, если в проекте модальное окно является единственным компонентом, но как правило этот компонент является переиспользуемым. На примере можно обратить внимание, что у модальных окон как правило есть: заголовок, контент внутри body, кнопки закрыть и сохранить. Это общая структура, которая может относиться ко всем модальным окнам. Сначала организуем общее модальное окно index.js внутри компонента modals. // импорты зависимостей и других компонентов const modals = { adding: NewChannel, renaming: RenameChannel, removing: DeleteChannel, }; const ModalContainer = () => { const { t } = useTranslation(); const dispatch = useDispatch(); const currentChannelId = useSelector((state) => state.app.currentChannelId); const modalChannelId = useSelector((state) => state.app.modalChannelId); const { data: channels = [] } = useGetChannelsQuery(); const channelsNames = channels.map((channel) => channel.name); const channelNameSchema = Yup.object().shape({ channelName: Yup.string().notOneOf(channelsNames, t('form.errors.channelExists')).min(3, t('form.errors.range')).max(20, t('form.errors.range')) .required(t('form.errors.required')), }); const handleCloseModal = () => { dispatch(setChannelModal({ id: '', name: '', modalName: '' })); }; const showModal = useSelector((state) => state.app.showModal); const ModalComponent = modals[showModal]; if (!ModalComponent) { return null; } return ( <ModalComponent handleCloseModal={handleCloseModal} showModal={showModal} currentChannelId={currentChannelId} modalChannelId={modalChannelId} dispatch={dispatch} t={t} channelNameSchema={channelNameSchema} /> ); }; export default ModalContainer; Далее создается «дочерний» компонент NewChannel.jsx и мы через пропсы, бросаем нужные события, избавляясь от повторения кода в двух компонентах. const NewChannel = (props) => { const { handleCloseModal, showModal, dispatch, t, channelNameSchema, } = props; const [addChannel] = useAddChannelMutation(); // прочий код, который только нужен для создания нового канала } Мы можем бросать не только данные, но и компоненты. Поскольку в примере использовалось модальное окно бутстрапа, то нам не было необходимости еще отдельно организовывать UI для компонента. Рекомендация. Создайте модальное окно в одном файле, полностью определив в нем весь html и js. Подумайте, какие участки кода, могут быть переиспользуемые? Организуйте для них отдельный файл index.js и через пропсы бросайте в другие дочерние компоненты.