#reactjs #react-leaflet
#reactjs #react-листовка
Вопрос:
Действительно пытался не публиковать это, поскольку я видел похожие вопросы, но я не могу ничего отобразить в библиотеке листовок react после прочтения в Интернете.
Следующие фрагменты кода показывают разметку для карты и наложение, которое я пытаюсь создать.
Большое спасибо, любая помощь приветствуется.
Глядя на другие вопросы онлайн, люди ссылаются на то, чтобы сделать положение контейнера Map: абсолютным и установить z-индекс равным 400 , что, похоже, не имеет значения для меня с разметкой ниже.
Разметка карты
<Map
zoomControl={false}
doubleClickZoom= {false}
closePopupOnClick= {false}
dragging= {false}
zoomSnap= {false}
zoomDelta= {false}
trackResize= {false}
scrollWheelZoom= {false}
touchZoom={false}
className="map"
worldCopyJump={true}
center={position}
zoom={this.state.zoom}>
<TileLayer
attribution="amp;amp;copy <a href=amp;quot;http://osm.org/copyrightamp;quot;>OpenStreetMap</a> contributors and Chat location by Iconika from the Noun Project"
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
{this.state.pins.map(pin => (
<Marker
onClick={() => this.showPanel(pin)}
key={pin._id}
position={[pin.latitude, pin.longitude]}
icon={pinIcon}>
</Marker>
))}
</Map>
Наложение разметки
<div ref={ref => this.el = ref}>
<button onClick={() => this.setState({ isPaneOpen: true })}>Click me to open right pane!</button>
<SlidingPane
className='some-custom-class'
overlayClassName='some-custom-overlay-class'
isOpen={ this.state.isPaneOpen }
title='Hey, it is optional pane title. I can be React component too.'
subtitle='Optional subtitle.'
onRequestClose={ () => {
// triggered on "<" on left top click or on outside click
this.setState({ isPaneOpen: false });
} }>
<div className="container-fluid padding">
</div>
</SlidingPane>
Обновить
Теперь я переместил наложение в функцию, показанную ниже
function MyOverLay(props) {
return <SlidingPane
className='some-custom-class'
overlayClassName='some-custom-overlay-class'
isOpen={ props.isPaneOpen }
title='Book here
</SlidingPane>
}
Изменение в разметке показано ниже
Новая разметка
<div>
<MyOverLay isPaneOpen={this.state.isPaneOpen} />
<div className="container-fluid padding">
<div className="row padding">
<div className="col-lg-8">
<Map zoomControl={false}
doubleClickZoom= {false}
closePopupOnClick= {false}
dragging= {false}
zoomSnap= {false}
zoomDelta= {false}
trackResize= {false}
scrollWheelZoom= {false}
touchZoom={false}
className="map"
worldCopyJump={true}
center={position}
zoom="13">
<TileLayer url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" />
<Marker
position={[10, -10]}
icon={messageIcon}>
</Marker>
</Map>
</div>
Ответ №1:
это идеальный ответ
.leaflet-control { z-index: 0 !important}
.leaflet-pane { z-index: 0 !important}
.leaflet-top, .leaflet-bottom {z-index: 0 !important}
Ответ №2:
Единственное решение, о котором я могу думать, — это использование портала React. Это особенность React, которая может добавлять компонент вне «корневого» компонента внутри элемента body. Учитывая, что дочерние элементы в нижней части родительского элемента имеют более высокий индекс стекирования, чем элементы в верхней части, он может «наложить» любой компонент внутри корневого компонента. Попробуйте обернуть свой компонент следующим образом:
import React from 'react';
import ReactDOM from 'react-dom';
const OverlayComponent = () => {
return ReactDOM.createPortal(
<MyComponent />,
document.body
);
};
Комментарии:
1. Имеет смысл, но мне придется немного почитать, поскольку я изучаю react, поэтому я не уверен, куда это поместить
2. Я обновил свой вопрос своей попыткой, хотя MyOverLay по-прежнему отображается за картой.
3. Проблема определенно в плитках, если у меня просто есть элемент <map>, но удалить тег <TileLayer>, мое наложение работает.
4. Думаю, я понял это с помощью CSS, позвольте мне проверить
Ответ №3:
только что была такая же проблема. Для тех, кто все еще ищет ответ — Самый высокий z-индекс в leaflet-react предназначен для кнопок масштабирования и равен
.leaflet-top, .leaflet-bottom
{
position: absolute;
z-index: 1000;
pointer-events: none;
}
итак, если вы перейдете выше, вы можете отобразить элемент перед картой.
Приветствия
Ответ №4:
Удалось заставить его работать, управляя значениями z-индекса в CSS для всех панелей, которые карта отображает на странице. Опция zIndex, доступная на TileLayer, похоже, не работает для меня, но следующее решило проблему. Заметил — тестировал это только в Chrome.
div.map.leaflet-container.leaflet-touch.leaflet-retina.leaflet-fade-anim {
/*border: 5px solid red;*/
z-index: 1;
}
div.slide-pane__content {
/*border: 5px solid black;*/
z-index: 100;
}
div.ReactModal__Content.ReactModal__Content--after-open.slide-pane.slide-pane_from_right.some-custom-class {
/*border: 5px solid orange;*/
z-index: 100;
}
div.slide-pane__header {
/*border: 5px solid orange;*/
z-index: 100;
}
div.ReactModal__Overlay.ReactModal__Overlay--after-open.slide-pane__overlay.some-custom-overlay-class {
/*border: 5px solid blue;*/
z-index: 100;
}