отобразить div в верхней части карты ngx-mapboxgl - PullRequest
0 голосов
/ 16 марта 2019

Я впервые пытаюсь использовать ngx-mapbox-gl в приложении angular 7 и испытываю что-то странное с картой. Я хочу отобразить текст и кнопку в верхней части карты. Я следовал примеру письма, которое нашел в Интернете, но div не отображается. Если я закомментирую карту, там будет div вместе с кнопкой. С картой: enter image description here

и когда карта закомментирована: enter image description here

Вот компонент html:

<mat-card style="height:100vh;border 1px solid;margin 5px;padding: 5px">
  <mat-card-content style="height:100%;border 1px solid;margin 5px;padding: 5px">

<mgl-map
  [style]="mapStyle"
  [zoom]="_zoom"
  [center]="_center"
  (load)="loadMap($event)"
  (zoomEnd)="onZoom($event)"
>
  <mgl-control
      mglScale
      unit="imperial"
      position="top-right">
  </mgl-control>
  <p>some text</p>
</mgl-map>
<div style="border: 1px solid;background-color: white;height: 100px;width:100px">
  <p>this is some text to display</p>
  <button mat-button class="layers-button">Button</button>
</div>

</mat-card-content>
</mat-card>

и тс:

import { Component, OnInit, Input, Output, EventEmitter, OnChanges } from '@angular/core';
import { Subscription } from 'rxjs';
import { AppSettings } from '../../shared/app-settings'
import { AppSettingsService } from '../../services/app-settings.service';

import { LngLat, Map } from 'mapbox-gl';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.scss']
})
export class HomeComponent implements OnInit, OnChanges {
  private className: string;
  appSettings: AppSettings;
  appSettingsSub: Subscription;
  map: Map;
  mapStyle: string;
  _zoom: number;
  _center: LngLat;

  //refs
  _mapRef: Map;

  @Output()
  centerChange: EventEmitter<LngLat> =  new EventEmitter;

  @Input()
  set zoom(z: number) {
    console.log('in zoom event');
    this._zoom = z;
    if(this.index === 0) {
      this.zoomChange.emit(this._zoom);
    }
  }
  @Output()
  zoomChange : EventEmitter<number> = new EventEmitter;

  @Input()
  index: number;

  constructor(public appSettingsService: AppSettingsService) { }

  ngOnInit() {
    this.className = this.constructor.toString().match(/\w+/g)[1];
    this._zoom = 6;

    this.appSettingsSub =     this.appSettingsService.behaviorSubject.asObservable().subscribe(value => {
      this.appSettings = value;
      if ( this.appSettings.norCalMapCenter == true ) {
        this._center = new LngLat( -121.31209, 37.449904  );
      }
      else {
        this._center = new LngLat(  -116.363804, 33.749757  );
      }
      if (this.appSettings.theme === 'tracs-dark-theme') {
        this.mapStyle = 'mapbox://styles/mapbox/dark-v9';
      }
      else {
        this.mapStyle = 'mapbox://styles/mapbox/outdoors-v9';
      }
    });

  }
  ngOnChanges(changes) {
    if (!changes) {
      return;
    }
  }
  loadMap( map: Map) {
    this._mapRef = map;
    this._center = map.getCenter();
  }

  onZoom(e) {
    this._zoom = Math.round(this._mapRef.getZoom());
    console.log('zoom event zoom:', this._zoom);
  };
}

и css:

mgl-map {
  height : calc(100% - 64px);
  width: 100%;
  margin: 0;
  padding: 0;
}
.mapboxgl-canvas {
  margin: 0;
  padding: 0;
}
.mat-card {
  margin: 0;
  padding: 0;
}

Есть ли что-то, что нужно сделать со слоями или z-уровнями, чтобы отобразить что-то поверх карты?

1 Ответ

0 голосов
/ 16 марта 2019

Я думаю, что элемент остается за картой, поэтому все, что вам нужно сделать, это использовать position: absolute и добавить более высокий z-index к элементу наложения.

Вот код CSS:

.mgl-map-overlay {
   position: absolute;
   top: 10px;
   left: 10px;
   z-index: 1;
}

Я также создал простую демонстрацию по Stackblitz:

https://stackblitz.com/edit/angular-z5hv4g

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...