next.js 如何覆盖脉轮UI模态组件z索引值以将模态组件放置在React瓣叶图上

plupiseo  于 2023-02-22  发布在  React
关注(0)|答案(1)|浏览(120)

我试图在基于this article和使用脉轮Modal component的React瓣叶圆圈标记弹出窗口组件中创建一个自定义灯箱效果的图像。实现工作,但我遇到了z轴索引和脉轮用户界面的位置问题。我的目标是把灯箱放在我的所有其余内容的顶部,此时,由于相对定位,模态被放置在Map容器的部分下方。
据我所知,脉轮模态组件应该放置在所有内容之上,但是组件的默认z-索引相对于Leaflet层放置,因此呈现在Map容器的下面。使用文章中的代码和模态组件产生的结果接近我想要的。除了模态灯箱被放置在部分瓣叶图div下方,看起来不美观,关闭按钮被遮挡。
我想把lightbox div放在整个文档的顶部,但是我不知道如何覆盖Modal组件的默认值1400到2400,这样它就可以放在整个Map上。覆盖一个多部分组件有点棘手,而且看起来Modal的z索引值没有在Modal theme definition中指定。我使用Modal组件的lightbox如下:

import React, {useState} from 'react'
import { Modal, ModalContent, ModalBody, ModalCloseButton, Flex, ModalOverlay, ModalHeader, useDisclosure } from '@chakra-ui/react'

const LightBox = ({children, src, alt, Wrapper = 'div'}, zIndex=800) => {
    const { isOpen, onOpen, onClose } = useDisclosure()
    //const [ isOpen, setisOpen ] = useState(false)
    
    //const toggleIsOpen = () =>{
    //    setisOpen(!isOpen)
    //}

    return (
    <Wrapper
    onClick={onOpen}
    >

        {children}
        {isOpen ?
            <Modal isOpen={isOpen} onClose={onClose}>
                <ModalOverlay />
                <ModalContent zIndex={zIndex}>
                    <ModalHeader>
                        <ModalCloseButton />
                    </ModalHeader>
            <ModalBody>
            <Flex
             onClick={onClose}           
            
            >
                <img src={src}
                        alt={alt}
                        style={{
                            height: 'auto',
                            width: '100%'
                        }}
                    />
               </Flex> 
               </ModalBody>
               </ModalContent>
            </Modal>
        :null}
    </Wrapper>
    )
} 
export default LightBox

可以在this linksandbox上看到工作代码
更新:我已经尝试了同样的方法使用脉轮模态组件,遭受同样的z索引问题。模态是放在Map容器内,而不是在它的顶部,在内容排序方面。此外,模态不能关闭点击关闭按钮,这是部分模糊。我的CSS不是很好,但是我假设这是关于LeafletMap元素的相对定位的问题。使用Modal实现更新的代码可以是found here,但我没有链接到一个演示,因为实现和结果与我自己的尝试相似。
更新2:所以,我已经意识到我需要做的是通过扩展主题来覆盖脉轮模态的z-索引。这有点棘手,因为模态是一个多部分的组件,但不清楚模态z-索引值在哪里指定,或者如何覆盖它。我正在寻找答案,这将帮助我将值放置在2400或以上。

swvgeqrz

swvgeqrz1#

显然,在z指数和脉轮ui/React瓣叶中使用的z指数值之间存在一些混淆。

快速修复:导航栏右z索引

它是覆盖模态(默认z-index为1400)的导航栏(z-index为2000),如果你使用zIndex="sticky"作为导航栏,它也可以工作。

在脉轮UI中使用z索引

chakra-ui为你提供了一个最小的z-index集合(文档)来匹配你的大小写。你没有将StickyNav的z-index设置为2000,而是从列表中选择了“sticky”这个标记。一旦你开始使用带Overlay的Modals,它应该会像预期的那样工作。

const zIndices = {
  zIndices: {
    hide: -1,
    auto: 'auto',
    base: 0,
    docked: 10,
    dropdown: 1000,
    sticky: 1100,
    banner: 1200,
    overlay: 1300,
    modal: 1400,
    popover: 1500,
    skipLink: 1600,
    toast: 1700,
    tooltip: 1800,
  },
}

<StickyNav
  zIndex="sticky"

使用带有正确z轴的react瓣叶

react-leaflet(或leaflet库)使用它自己的一组z索引值(200到700)(文档)来布局Map和它上面的用户界面元素(标记等)。但是,显然,它也使用z索引1000作为左边的缩放元素。虽然chakra-ui默认值没有问题,但如果sticky是1000而不是1100,就可能有问题。

创建新的z轴堆叠上下文

在这种情况下,您可以创建一个新的堆叠上下文(mdn文档)。mdn还告诉您需要应用哪些条件。
在以下情况下,堆叠上下文由任何元素在文档中的任何位置形成:

  • 文档的根元素()。
  • 具有位置值绝对或相对以及z索引值不是auto的元素。
  • 元素的位置值是固定的或粘滞的(粘滞适用于所有移动的浏览器,但不适用于较旧的桌面浏览器)。
    *Flex容器的子元素,z索引值不是auto。
  • ...

你使用<main>display:flex(第四个例子),可以只设置chakra-ui中的子元素z-index为0或“base”,否则你可以设置子元素的位置为relative,z-index为0或“base”(第二个例子)。

相关问题