mirror of https://gitee.com/antv-l7/antv-l7
feat: 气泡 Popup 支持设置自定义 className 和 style
This commit is contained in:
parent
6b7c52c07f
commit
d9295b680e
|
@ -1,4 +1,4 @@
|
||||||
import { GaodeMap, PointLayer, Popup, Scene } from '@antv/l7';
|
import { GaodeMap, PointLayer, Popup, Scene, Fullscreen } from '@antv/l7';
|
||||||
import { featureCollection, point } from '@turf/turf';
|
import { featureCollection, point } from '@turf/turf';
|
||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
// tslint:disable-next-line:no-duplicate-imports
|
// tslint:disable-next-line:no-duplicate-imports
|
||||||
|
@ -23,6 +23,8 @@ const Demo: FunctionComponent = () => {
|
||||||
const newPopup = new Popup({
|
const newPopup = new Popup({
|
||||||
closeOnClick: false,
|
closeOnClick: false,
|
||||||
closeOnEsc: true,
|
closeOnEsc: true,
|
||||||
|
followCursor: true,
|
||||||
|
offsets: [0, 10],
|
||||||
});
|
});
|
||||||
newPopup.setLnglat({
|
newPopup.setLnglat({
|
||||||
lng: 120.104697,
|
lng: 120.104697,
|
||||||
|
@ -41,6 +43,9 @@ const Demo: FunctionComponent = () => {
|
||||||
|
|
||||||
scene.addLayer(pointLayer);
|
scene.addLayer(pointLayer);
|
||||||
setPopup(newPopup);
|
setPopup(newPopup);
|
||||||
|
|
||||||
|
const fullscreen = new Fullscreen();
|
||||||
|
scene.addControl(fullscreen);
|
||||||
});
|
});
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|
|
@ -31,14 +31,14 @@
|
||||||
|
|
||||||
.l7-popup-close-button {
|
.l7-popup-close-button {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 2px;
|
top: 3px;
|
||||||
right: 2px;
|
right: 3px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
border: 0;
|
border: 0;
|
||||||
border-radius: 0 3px 0 0;
|
border-radius: 0 3px 0 0;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
font-size: 16px;
|
font-size: 14px;
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: rgba(0, 0, 0, 0.05);
|
background-color: rgba(0, 0, 0, 0.05);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,8 +16,22 @@ import {
|
||||||
} from '@antv/l7-utils';
|
} from '@antv/l7-utils';
|
||||||
import { EventEmitter } from 'eventemitter3';
|
import { EventEmitter } from 'eventemitter3';
|
||||||
import { Container } from 'inversify';
|
import { Container } from 'inversify';
|
||||||
|
import { debounce } from 'lodash';
|
||||||
|
|
||||||
export default class Popup extends EventEmitter implements IPopup {
|
export default class Popup extends EventEmitter implements IPopup {
|
||||||
|
/**
|
||||||
|
* 当前是否互斥气泡
|
||||||
|
*/
|
||||||
|
public get autoClose() {
|
||||||
|
return this.popupOption.autoClose;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前 Popup 是否为销毁
|
||||||
|
*/
|
||||||
|
public get isDestroy() {
|
||||||
|
return !this.mapsService;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* 配置
|
* 配置
|
||||||
* @protected
|
* @protected
|
||||||
|
@ -69,6 +83,18 @@ export default class Popup extends EventEmitter implements IPopup {
|
||||||
*/
|
*/
|
||||||
protected isShow: boolean = true;
|
protected isShow: boolean = true;
|
||||||
|
|
||||||
|
protected onMouseMove = debounce(
|
||||||
|
(e: MouseEvent) => {
|
||||||
|
const container = this.mapsService.getMapContainer();
|
||||||
|
const { left = 0, top = 0 } = container?.getBoundingClientRect() ?? {};
|
||||||
|
this.setPopupOffset(e.clientX - left, e.clientY - top);
|
||||||
|
},
|
||||||
|
16,
|
||||||
|
{
|
||||||
|
maxWait: 16,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
constructor(cfg?: Partial<IPopupOption>) {
|
constructor(cfg?: Partial<IPopupOption>) {
|
||||||
super();
|
super();
|
||||||
this.popupOption = {
|
this.popupOption = {
|
||||||
|
@ -78,14 +104,6 @@ export default class Popup extends EventEmitter implements IPopup {
|
||||||
bindAll(['update', 'onClickClose', 'remove'], this);
|
bindAll(['update', 'onClickClose', 'remove'], this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public get autoClose() {
|
|
||||||
return this.popupOption.autoClose;
|
|
||||||
}
|
|
||||||
|
|
||||||
public get isDestroy() {
|
|
||||||
return !this.mapsService;
|
|
||||||
}
|
|
||||||
|
|
||||||
public getIsShow() {
|
public getIsShow() {
|
||||||
return this.isShow;
|
return this.isShow;
|
||||||
}
|
}
|
||||||
|
@ -110,6 +128,12 @@ export default class Popup extends EventEmitter implements IPopup {
|
||||||
this.bindEscEvent();
|
this.bindEscEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.popupOption.followCursor) {
|
||||||
|
this.mapsService
|
||||||
|
.getContainer()
|
||||||
|
?.addEventListener('mousemove', this.onMouseMove);
|
||||||
|
}
|
||||||
|
|
||||||
this.emit('open');
|
this.emit('open');
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -135,6 +159,9 @@ export default class Popup extends EventEmitter implements IPopup {
|
||||||
this.mapsService.off('viewchange', this.update);
|
this.mapsService.off('viewchange', this.update);
|
||||||
this.mapsService.off('click', this.onClickClose);
|
this.mapsService.off('click', this.onClickClose);
|
||||||
window.removeEventListener('keypress', this.onKeyDown);
|
window.removeEventListener('keypress', this.onKeyDown);
|
||||||
|
this.mapsService
|
||||||
|
.getContainer()
|
||||||
|
?.removeEventListener('mousemove', this.onMouseMove);
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
delete this.mapsService;
|
delete this.mapsService;
|
||||||
}
|
}
|
||||||
|
@ -320,6 +347,7 @@ export default class Popup extends EventEmitter implements IPopup {
|
||||||
autoPan: false,
|
autoPan: false,
|
||||||
autoClose: true,
|
autoClose: true,
|
||||||
closeOnEsc: false,
|
closeOnEsc: false,
|
||||||
|
followCursor: false,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -382,13 +410,17 @@ export default class Popup extends EventEmitter implements IPopup {
|
||||||
* @protected
|
* @protected
|
||||||
*/
|
*/
|
||||||
protected updateLngLatPosition() {
|
protected updateLngLatPosition() {
|
||||||
if (!this.mapsService) {
|
if (!this.mapsService && this.popupOption.followCursor) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const { lng, lat } = this.lngLat;
|
const { lng, lat } = this.lngLat;
|
||||||
|
const { x, y } = this.mapsService.lngLatToContainer([lng, lat]);
|
||||||
|
this.setPopupOffset(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected setPopupOffset(left: number, top: number) {
|
||||||
const { offsets } = this.popupOption;
|
const { offsets } = this.popupOption;
|
||||||
const pos = this.mapsService.lngLatToContainer([lng, lat]);
|
this.container.style.left = left + offsets[0] + 'px';
|
||||||
this.container.style.left = pos.x + offsets[0] + 'px';
|
this.container.style.top = top - offsets[1] + 'px';
|
||||||
this.container.style.top = pos.y - offsets[1] + 'px';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ export interface IPopupOption {
|
||||||
stopPropagation: boolean;
|
stopPropagation: boolean;
|
||||||
autoPan: boolean;
|
autoPan: boolean;
|
||||||
autoClose: boolean;
|
autoClose: boolean;
|
||||||
|
followCursor: boolean;
|
||||||
className?: string;
|
className?: string;
|
||||||
style?: string;
|
style?: string;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue