Website Popup'ları

Angular'da 4 Farklı Yöntemle Popup Nasıl Oluşturulur? (2026 Rehberi)

Angular popup, sayfanın üstünde bir katmanda gösterilen bir bileşendir. Angular 22'de popup oluşturmak için standalone bir bileşeni Angular Material'ın MatDialog, Ng-bootstrap'ın NgbModal ya da PrimeNG'nin p-dialog bileşeniyle açın, bir butondan tetikleyin ve sonucu bir signal'e alın. Pazarlama popup'ı içinse Popupsmart'ın embed kodunu index.html dosyasına yapıştırın.

Yapay zekâ özetigenel özet

Angular popup, bir katman (overlay) içinde gösterilen bir bileşendir. Rehber, Angular 22'de dört yolla popup oluşturuyor (Angular Material MatDialog, Ng-bootstrap NgbModal, PrimeNG p-dialog ve kodsuz Popupsmart embed kodu) ve yerel dialog öğesiyle bir sürüm ekliyor. Ekim 2026'da derlenip çalıştırılan kod, sürüm notları, yaygın hatalar ve erişilebilirlik kuralları içerir.

PaylaşFacebookXLinkedInPinterest

Makale bilgileri

tarafından yazıldı.
Ece Sanan
tarafından incelendi.
Mert Özeren
Yayınlandı
3 Kasım 2023
Güncellendi
2 Ekim 2026
Bölümler
15
Kaynaklar
4 kaynak

26 dk okuma

Editöryal standartlarımızHer yazıyı nasıl araştırır, kaynaklandırır ve güncelleriz.
İçindekiler26 dk okuma
  1. Angular'da popup nedir?
  2. Angular'da popup oluşturmanın 4 yolu
  3. 1. Adım: Angular Material (MatDialog) ile popup oluşturun
    1. Adım 1.1: Angular Material'ı kurun
    2. Adım 1.2: Popup bileşenini oluşturun
    3. Adım 1.3: Popup içeriğini tanımlayın
    4. Adım 1.4: Popup servisini oluşturun
    5. Adım 1.5: popup.service.ts dosyasını düzenleyin
    6. Adım 1.6: Servisi bileşeninizde kullanın
    7. Adım 1.7: Her bileşenin kullandığını import edin (NgModule gerekmez)
    8. Adım 1.8: Popup'ınızı çalıştırın
    9. Adım 1.9: Modal yerine bildirim mi lazım?
  4. 2. Adım: Ng-bootstrap (NgbModal) ile popup oluşturun
    1. Adım 2.1: Ng-bootstrap'ı kurun
    2. Adım 2.2: Popup içerik bileşenini oluşturun
    3. Adım 2.3: NgbModule import'unu atlayın
    4. Adım 2.4: Popup şablonunu ekleyin
    5. Adım 2.5: Tetikleyici butonu oluşturun ve modal servisini bağlayın
    6. Adım 2.6: Popup'ınızı çalıştırın
  5. 3. Adım: PrimeNG (p-dialog) ile popup oluşturun
    1. Adım 3.1: PrimeNG'yi ve temalarını kurun
    2. Adım 3.2: Temayı kaydedin
    3. Adım 3.3: p-dialog bileşenini ekleyin
    4. Adım 3.4: Popup içerik bileşenini oluşturun
    5. Adım 3.5: DialogService ile açın
    6. Adım 3.6: Popup'ınızı çalıştırın
  6. 4. Adım: Popupsmart ile kodsuz popup oluşturun
    1. Adım 4.1: Hesap açın
    2. Adım 4.2: Şablon seçin
    3. Adım 4.3: Metni, tasarımı ve tetikleyicileri özelleştirin
    4. Adım 4.4: Embed kodunu Angular projenize ekleyin
    5. Adım 4.5: Yayınlayın ve test edin
    6. Adım 4.6: Bir Angular butonundan açın (isteğe bağlı)
  7. Popup'ları neden Angular ile oluşturmalısınız?
  8. Dört yöntem nasıl karşılaştırılır?
  9. Kütüphane olmadan Angular popup'ı nasıl oluşturulur?
  10. SaaS uygulamanız için doğru popup yöntemini nasıl seçersiniz?
  11. 2026'da kaçınılması gereken en yaygın Angular popup hataları nelerdir?
  12. Angular popup'larında erişilebilirlik nasıl sağlanır?
  13. İlk Angular popup'ınızı bu hafta yayına alın
  14. Sıkça Sorulan Sorular
    1. Angular'da popup'lar için özel animasyonlar oluşturabilir miyim?
    2. Angular'da modal diyalog ile popup arasındaki fark nedir?
    3. Angular'da bildirim veya uyarı popup'ı nasıl gösterilir?
    4. Angular'da popup kullanıcı etkileşimlerini nasıl takip edebilirim?
    5. 2026'da SaaS uygulamaları için en iyi Angular popup kütüphanesi hangisi?
    6. Angular'da butona tıklayınca açılan popup form nasıl oluşturulur?
  15. Bunlara göz atın

Angular 2026'da 22. sürümde (Ekim 2026'da kontrol ettiğimizde 22.2) ve Angular 19'dan bu yana popup oluşturma biçimi epey değişti: standalone bileşenler, signal'ler, @if kontrol akışı, zone.js'siz değişiklik algılama ve yeni @Service() dekoratörü. Temel soru ise aynı: uygulamanızda bir modal, toast, tooltip ya da yan panel gerektiğinde hangi kütüphaneye uzanacaksınız? Bu rehber, gerçek bir uygulamada iş gören dört yolu tam kod, sürüm notları ve aralarındaki ödünleşimlerle anlatıyor. Aşağıdaki her kod parçası 2 Ekim 2026'da sıfırdan kurulmuş bir Angular 22 projesinde ng build ile derlendi ve çalıştırıldı.

Angular'da 4 Farklı Yöntemle Popup Nasıl Oluşturulur? (2026 Rehberi)

Başlamadan önce ihtiyacınız olanlar:

• Angular CLI 22 (npm install -g @angular/cli). Yeni Angular 22 projeleri varsayılan olarak standalone ve zone.js'siz kuruluyor; aşağıdaki her yöntem ikisiyle de çalışıyor.

• Node.js 22.22.3 veya sonrası ya da 24.15 veya sonrası. Angular 22 CLI daha eski sürümlerde çalışmayı reddediyor; bu örnekleri hazırlarken Node 24.10'u reddetti.

• TypeScript ve Angular bileşenleri hakkında temel bilgi (1-3. yöntemler için); 4. yöntem için gerekmez

• Seviye: Kodlu yöntemler için başlangıç-orta seviye; Popupsmart için başlangıç

Kısa özet: öğreneceğiniz dört yöntem:

1. Angular Material (MatDialog): Angular ekibinin geliştirdiği, Google'ın resmi bileşen kütüphanesi. Material Design kullanan kurumsal uygulamalar için en uygunu.

2. Ng-bootstrap (NgbModal): Bootstrap işaretlemesi üzerine kurulu yerel Angular bileşenleri. Tasarım sisteminiz Bootstrap tabanlıysa en uygunu.

3. PrimeNG (p-dialog): PrimeNG'nin kendi sayımıyla 90+ bileşenli, zengin özellikli bir arayüz paketi. Duyarlı, animasyonlu ve temaya dayalı popup'lar için en uygunu.

4. Popupsmart (kodsuz embed): Script etiketiyle eklenen, barındırılan bir popup oluşturucu. Pazarlama kampanyaları, MVP prototipleri ve bileşen ağacınıza bağlı olmayan her şey için en uygunu.

Angular'da popup nedir?

Angular'da popup, dikkat çekmek, kullanıcıdan bilgi almak ya da bir mesaj göstermek için sayfanın üstünde beliren küçük bir katman penceredir. Framework'ün kendine ait, stili hazır bir "popup" öğesi yok. Bunun yerine bir bileşen kütüphanesine (Material, Ng-bootstrap, PrimeNG), @angular/cdk/dialog içindeki stilsiz CDK Dialog'a ya da bir signal ile yönetilen tarayıcının yerel <dialog> öğesine başvurursunuz.

"Popup" kelimesi geniş bir anlam taşır. Pratikte her Angular uygulamasında karşılaşacağınız altı yaygın popup türünü kapsar:

Modal diyaloglar. Kullanıcı bir işlem yapana kadar sayfanın geri kalanını kilitleyen, arka plan katmanlı tam bir katman. Angular Material'ın MatDialog servisi bunun bilinen örneğidir.

Angular Material 22.2.1 dokümantasyonunda MatDialog genel bakış sayfası, bir diyalog örneği ve open() çağrısıyla
material.angular.dev, MatDialog genel bakış (sürüm 22.2.1), Ekim 2026'da alınan ekran görüntüsü.

Toast'lar ve snackbar'lar. İçeri kayan, tek bir bilgi verip kaybolan kısa mesajlar. Bunlar için MatSnackBar kullanın: sayfayı kilitlemezler ve kendiliğinden kapanırlar.

Tooltip'ler. Fareyle üzerine gelindiğinde ya da odaklanıldığında görünen küçük etiket. matTooltip ile ya da @if ve bir mouseenter bağlamasıyla elle yapılır.

Angular Material 22.2.1 dokümantasyonunda tooltip genel bakış sayfası, temel tooltip örneği ve konumlandırma seçenekleriyle
material.angular.dev, tooltip genel bakış (sürüm 22.2.1), Ekim 2026'da alınan ekran görüntüsü.

Açılır menüler. Tıklanınca bağlı bir liste açan tetikleyici. @for ile özel bileşenlerle, Material'ın mat-menu bileşeniyle ya da Ng-bootstrap'taki ngbDropdown direktifiyle yapılır.

Akordeonlar. Angular direktifleri ve durum değişkenleriyle yönetilen açılıp kapanan paneller.

Yan paneller (drawer'lar). Ekranın kenarından kayarak açılan paneller; genellikle bir Angular rotasına ya da Material'ın MatSidenav bileşenine bağlanır.

Gerçek bir Angular uygulaması çoğu zaman bunların birkaçını bir arada kullanır. Kütüphane kullanmanın amacı tutarlı davranış elde etmektir: klavye kullanımını, ARIA rollerini ve animasyon zamanlamasını her bileşen için yeniden kurmazsınız.

Angular'da popup oluşturmanın 4 yolu

Angular Material 22.2.1 bileşen kataloğu: autocomplete, badge, bottom sheet, button, button toggle ve card kartları
material.angular.dev bileşen kataloğu (sürüm 22.2.1), Ekim 2026'da alınan ekran görüntüsü.

Aşağıdaki dört adım adım yöntem aynı işi yapar (bir diyalog açmak, içerik göstermek, tıklamayla kapatmak) ve bunu Angular Material, Ng-bootstrap, PrimeNG ve kodsuz Popupsmart embed koduyla yapar. Her kod örneği, katı şablon denetimi açık, sıfırdan kurulmuş bir Angular 22.2 projesinde derlediğimiz dosyanın aynısıdır. Ardından her popup'ı başsız (headless) bir Chromium tarayıcıda açtık, Esc ile ve bir butonla kapattık.

Teknoloji yığınınıza ve seviyenize uyanı seçin. Sıfırdan bir Angular paneli kuruyorsanız Material en güvenli varsayılandır. Ön yüzünüz zaten Bootstrap temalıysa Ng-bootstrap sizi yeniden tema giydirmekten kurtarır. Kutudan çıktığı gibi zengin animasyon ve tema istiyorsanız PrimeNG üçü içinde en kapsamlısıdır. Popup bir kampanya ya da test sayfası içinse ve sürece bir geliştirici katmak istemiyorsanız, kodsuz seçenek her CLI kurulumundan hızlıdır.

1. Adım: Angular Material (MatDialog) ile popup oluşturun

Angular Material, Google'ın resmi bileşen kütüphanesidir. MatDialog, bir bileşen ve bir servise bölünmüş yaklaşık 30 satır kodla erişilebilir bir modal verir (odak tuzağı, arka plan katmanı, Esc ile kapatma, ARIA rolleri). Material Design token'ları kullanan her uygulamada başvurulacak yöntem budur.

Kütüphane kapsamı. Angular Material 22.2 (Ekim 2026'da kontrol edildi) Angular 22 gerektiriyor. Sürümleri Angular'ınkini takip ediyor; Angular 21 kullanıyorsanız @angular/material@21 kurun. open() çağrısı eski rehberlerdekiyle aynı görünüyor. Değişen, çevresindeki bağlantılar: standalone import'lar, constructor yerine inject() ve sonuç için bir signal.

Adım 1.1: Angular Material'ı kurun

Proje kök dizininde terminali açın ve şunu çalıştırın:

ng add @angular/material

Schematic, Material ile CDK'yı kurar, mat.theme() kullanan bir Material 3 temasını src/material-theme.scss dosyasına yazar ve Roboto ile Material Symbols fontlarını index.html dosyasına ekler. Artık animasyonlarla ilgili soru sormuyor: Material 22, @angular/animations paketini hiç kullanmıyor.

Adım 1.2: Popup bileşenini oluşturun

Diyalog bileşeninin iskeletini CLI ile oluşturun:

ng generate component popup

Angular 22'de bu komut src/app/popup/popup.ts, popup.html ve popup.css dosyalarını ve Popup adında standalone bir sınıf oluşturur. Yeni CLI sürümleri artık .component son ekini eklemiyor.

Adım 1.3: Popup içeriğini tanımlayın

popup.html dosyasını açın ve hazır şablonu Material diyalog şablonuyla değiştirin:

<h2 mat-dialog-title>Popup Dialog</h2>
<mat-dialog-content>
  <p>This is a popup dialog created using Angular Material.</p>
</mat-dialog-content>
<mat-dialog-actions align="end">
  <button matButton [mat-dialog-close]="false">Close</button>
  <button matButton="filled" [mat-dialog-close]="true">OK</button>
</mat-dialog-actions>

mat-dialog-title diyaloğa erişilebilir adını verir, [mat-dialog-close] ise diyaloğu bağladığınız değerle kapatır. Ardından şablonun kullandığı direktifleri popup.ts içinde listeleyin:

import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import {
  MatDialogActions,
  MatDialogClose,
  MatDialogContent,
  MatDialogTitle,
} from '@angular/material/dialog';

@Component({
  selector: 'app-popup',
  imports: [MatButtonModule, MatDialogTitle, MatDialogContent, MatDialogActions, MatDialogClose],
  templateUrl: './popup.html',
})
export class Popup {}

Adım 1.4: Popup servisini oluşturun

Bir servis, açma ve kapatma mantığını bileşenlerinizin dışında tutar ve diyaloğu yeniden kullanılabilir yapar:

ng generate service popup/popup --type=service

--type=service olmadan Angular 22 CLI dosyayı popup.ts, sınıfı da Popup olarak adlandırır; bu da bileşenle çakışır.

Adım 1.5: popup.service.ts dosyasını düzenleyin

MatDialog servisini servise bağlayın:

import { Service, inject } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { Popup } from './popup';

@Service()
export class PopupService {
  private readonly dialog = inject(MatDialog);

  openPopup() {
    return this.dialog.open<Popup, void, boolean>(Popup, { width: '400px' });
  }
}

Angular servis rehberine göre @Service() Angular 22 ile geldi ve @Injectable({ providedIn: 'root' }) için bir kısayol. Angular 21 veya öncesinde onun yerine @Injectable({ providedIn: 'root' }) kullanın.

Adım 1.6: Servisi bileşeninizde kullanın

src/app/app.ts dosyasını, popup'ı açan ve sonucu gösteren bir butonla değiştirin:

import { Component, inject, signal } from '@angular/core';
import { PopupService } from './popup/popup.service';

@Component({
  selector: 'app-root',
  template: `
    <button type="button" (click)="openPopup()">Open Popup</button>
    @if (answer() !== undefined) {
      <p>The dialog closed with: {{ answer() }}</p>
    }
  `,
})
export class App {
  private readonly popupService = inject(PopupService);
  protected readonly answer = signal<boolean | undefined>(undefined);

  openPopup() {
    this.popupService
      .openPopup()
      .afterClosed()
      .subscribe((result) => this.answer.set(result));
  }
}

Sonuç bir signal'e yazıldığı için uygulama zone.js olmadan çalışsa da şablon güncellenir. afterClosed() bir değer yaydıktan sonra kendiliğinden tamamlanır, bu yüzden bu aboneliği temizlemeniz gerekmez.

Adım 1.7: Her bileşenin kullandığını import edin (NgModule gerekmez)

Standalone bileşenler, şablonlarının kullandığı şeyleri kendileri import eder. Popup buton modülünü ve dört diyalog direktifini listeler; App hiçbir şey import etmez, çünkü MatDialog kökten inject edilebilir. Uygulamanız hâlâ NgModule kullanıyorsa MatDialogModule öğesini modülün import'larına ekleyin ya da geçiş için ng generate @angular/core:standalone komutunu çalıştırın.

Adım 1.8: Popup'ınızı çalıştırın

Geliştirme sunucusunu ng serve ile başlatın ve butona tıklayın. Diyalog açılmalı, odak içeri geçmeli ve Esc'ye basınca ya da arka plana tıklayınca kapanmalı.

Çalıştığını şuradan anlarsınız: sayfa yarı saydam bir arka planla kararır, diyalog yumuşak bir geçişle ortada belirir, odak içindeki ilk odaklanabilir öğeye atlar ve Esc'ye basınca diyalog kapanıp odak tetikleyici butona geri döner. OK'e tıklamak The dialog closed with: true yazdırır; Esc ile kapatınca sonuç undefined kalır.

Adım 1.9: Modal yerine bildirim mi lazım?

Kısa ve sayfayı kilitlemeyen bir mesaj için MatSnackBar inject edin:

import { Component, inject } from '@angular/core';
import { MatSnackBar } from '@angular/material/snack-bar';

@Component({
  selector: 'app-save-button',
  template: `<button type="button" (click)="save()">Save</button>`,
})
export class SaveButton {
  private readonly snackBar = inject(MatSnackBar);

  save() {
    this.snackBar.open('Changes saved', 'Undo', { duration: 4000 });
  }
}

Snackbar dört saniye sonra kaybolur ve Material mesajı CDK'nın LiveAnnouncer servisi üzerinden ekran okuyuculara iletir.

Bu hatalara dikkat edin:

• Eski animasyon tavsiyesine uymak: Angular 20 öncesinde yazılan rehberler Material için BrowserAnimationsModule veya provideAnimations() import etmenizi söyler. Material 22'nin ikisine de ihtiyacı yok: diyalog CSS ile, açılırken 150 ms, kapanırken 75 ms süren bir animasyon oynatır. Diyalog hiç animasyonsuz açılıyorsa önce cihaz ayarlarına bakın, çünkü prefers-reduced-motion açık olduğunda Material animasyonlarını kapatıyor.

• Direktif import'larını unutmak: Diyalog direktiflerini kullanan şablonun bileşeni onları import etmeli. [mat-dialog-close] gibi bir bağlama derlemeyi "Can't bind to 'mat-dialog-close'" hatasıyla durdurur, ama mat-dialog-title gibi düz bir öznitelik sessizce yok sayılır; diyalog hata vermeden erişilebilir adını kaybeder.

• Tema CSS'ini atlamak: ng add komutu angular.json dosyasını kendiliğinden güncelleyemediyse diyalog Material stilleri olmadan açılır ve stilsiz bir <div> gibi görünür. src/material-theme.scss dosyasını ya da @angular/material/prebuilt-themes/azure-blue.css gibi hazır bir temayı styles dizisine ekleyin.

Bilgi
İpucu: Veriyi open(Popup, { data: { ... } }) ile gönderin ve popup içinde inject(MAT_DIALOG_DATA) ile okuyun. Çağrıyı open<Popup, Data, Result>() şeklinde tiplemek, Adım 1.5'teki gibi, afterClosed() metodunun beklediğiniz sonuç tipini döndürmesini sağlar.

2. Adım: Ng-bootstrap (NgbModal) ile popup oluşturun

Ng-bootstrap ana sayfası, sürüm 21.0.0: Bootstrap 5 CSS ile sıfırdan yazılmış Angular bileşenleri, ng add ile kurulum
ng-bootstrap.github.io ana sayfası (v21.0.0), Ekim 2026'da alınan ekran görüntüsü.

Tasarım sisteminiz zaten Bootstrap temalıysa Ng-bootstrap, Material'dan daha temiz bir seçimdir. Bootstrap 5 işaretlemesine uyan yerel Angular direktifleri sunar, böylece popup yeniden tema giydirmeden uygulamanızın geri kalanıyla aynı görünür. NgbModal servisi, kütüphanenin diyalog yapı taşıdır. Aynı modalı Angular olmadan Bootstrap popup rehberimizde anlattık.

Kütüphane kapsamı. Ng-bootstrap 21 Angular 22'yi destekliyor; v20 Angular 21'i, v19 Angular 20'yi, v18 de Angular 19'u destekliyor (npm üzerinde Ekim 2026'da kontrol edildi). Angular sürümünüze uyan ana sürümü sabitleyin, yoksa kurulum bir peer-dependency hatasıyla durur.

Adım 2.1: Ng-bootstrap'ı kurun

Bootstrap CSS import'larını CLI'ın halletmesi için ng add kullanın:

ng add @ng-bootstrap/ng-bootstrap

Bu komut Bootstrap'ı, Ng-bootstrap modülünü ve @angular/localize paketini (bir peer bağımlılığı) kurar, CSS referansını angular.json dosyasına ekler ve Ng-bootstrap'ın provider'larını app.config.ts içine kaydeder.

Adım 2.2: Popup içerik bileşenini oluşturun

Material akışındaki düzenin aynısı: önce bir bileşen iskeleti oluşturun. Modal bu bileşeni içinde gösterecek:

ng generate component popup-content

Adım 2.3: NgbModule import'unu atlayın

Eski rehberler NgbModule öğesini bir NgModule'ün import'larına ekler. Standalone bir uygulamada modallar için import edilecek bir şey yok: NgbModal, inject ettiğiniz kök düzeyde bir servis ve provider'ları ng add zaten kaydetti. NgModule tabanlı bir uygulamayı sürdürüyorsanız NgbModalModule öğesini ana modülde import edin.

Adım 2.4: Popup şablonunu ekleyin

popup-content.ts dosyasını, Bootstrap'ın modal işaretlemesini kullanan bir bileşenle değiştirin:

import { Component, inject } from '@angular/core';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';

@Component({
  selector: 'app-popup-content',
  template: `
    <div class="modal-header">
      <h2 class="modal-title fs-5" id="popup-title">Popup Content</h2>
      <button type="button" class="btn-close" aria-label="Close" (click)="activeModal.dismiss('close')"></button>
    </div>
    <div class="modal-body">
      <p>This is the content of the popup.</p>
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-secondary" (click)="activeModal.dismiss('cancel')">Cancel</button>
      <button type="button" class="btn btn-primary" (click)="activeModal.close('confirmed')">Confirm</button>
    </div>
  `,
})
export class PopupContent {
  protected readonly activeModal = inject(NgbActiveModal);
}

NgbActiveModal, içeriğin modalı bir sonuçla kapatmak (close) ya da bir gerekçeyle iptal etmek (dismiss) için kullandığı tutamaçtır. Başlığın id değeri, açan tarafın ariaLabelledBy olarak ilettiği değerdir.

Adım 2.5: Tetikleyici butonu oluşturun ve modal servisini bağlayın

Kök şablonunuza açma işleyicisini çağıran bir buton ekleyin, NgbModal inject edin ve popup bileşeninin referansıyla open() çağırın:

import { Component, inject, signal } from '@angular/core';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { PopupContent } from './popup-content/popup-content';

@Component({
  selector: 'app-root',
  template: `
    <button type="button" class="btn btn-primary" (click)="openPopup()">Click me</button>
    <p>Last result: {{ lastResult() }}</p>
  `,
})
export class App {
  private readonly modalService = inject(NgbModal);
  protected readonly lastResult = signal('none yet');

  openPopup() {
    const modalRef = this.modalService.open(PopupContent, { ariaLabelledBy: 'popup-title' });
    modalRef.result.then(
      (result) => this.lastResult.set(`closed: ${result}`),
      (reason) => this.lastResult.set(`dismissed: ${reason}`),
    );
  }
}

Adım 2.6: Popup'ınızı çalıştırın

Geliştirme sunucusunu başlatın:

ng serve

Çalıştığını şuradan anlarsınız: butona tıklayınca modal, Bootstrap'ın standart geçiş animasyonuyla görünür, arka plan sayfayı karartır, arka plana tıklamak ya da Esc'ye basmak modalı kapatır ve odağı butona geri verir. Sayfada ardından dismissed: 1 (1, ModalDismissReasons.ESC değeridir) ya da Confirm'den sonra closed: confirmed yazar.

Bu hatalara dikkat edin:

• Uyumsuz Bootstrap CSS sürümü: Projeniz zaten Bootstrap 4 import ediyorsa ve Ng-bootstrap Bootstrap 5 kurarsa grid sınıfları çakışır ve modalın konumu kayar. Tek bir Bootstrap ana sürümü seçin ve diğerini angular.json dosyasından kaldırın.

• open() fonksiyonunu metin şablonuyla çağırmak: NgbModal.open() hem bileşen referanslarını hem TemplateRef kabul eder. Bir metin (string) HTML olarak değil düz metin olarak gösterilir. Her zaman import ettiğiniz bileşen sınıfını ya da viewChild() ile okunan bir #ref şablonunu verin.

• ariaLabelledBy seçeneğini atlamak: Bu seçenek olmadan modal penceresinin role="dialog" rolü olur ama erişilebilir bir adı olmaz; ekran okuyucu yalnızca "dialog" der. Başlığa bir id verin ve bunu open() seçeneklerinde iletin.

Bilgi
İpucu: Onay/iptal akışlarında modalRef.result bir Promise döndürür: modalRef.close(value) çağrıldığında çözülür, modalRef.dismiss(reason) çağrıldığında ya da kullanıcı Esc'ye bastığında reddedilir. Çağrıyı .then(...).catch(...) ile sarın ya da Adım 2.5'teki gibi iki geri çağırmayı da verin; ek bağlantı yazmadan temiz bir iki butonlu onay diyaloğunuz olur.

3. Adım: PrimeNG (p-dialog) ile popup oluşturun

PrimeNG Dialog dokümantasyon sayfası: DialogModule import'u ve p-dialog kullanım örneği
primeng.dev, Dialog dokümantasyonu (PrimeNG 22), Ekim 2026'da alınan ekran görüntüsü.

PrimeNG, dokümantasyon sitesinde 90+ bileşen listeliyor ve üç kodlu kütüphane içinde animasyon ve tema tarafı en olgun olanı. p-dialog bileşeni (ve dinamik diyaloglar için ilgili DialogService) basit bir modaldan, özel başlık ve altbilgili, sürüklenebilir, yeniden boyutlandırılabilir, birden fazla örnekli diyaloglara kadar her şeyi karşılar.

Kütüphane kapsamı. PrimeNG'nin ana sürümü Angular'ınkiyle eşleşiyor: PrimeNG 22.1 Angular 22'yi (22.1'den itibaren), v21 Angular 21'i, v20 Angular 20'yi destekliyor. Tema modeli de değişti: Aura, Lara ve Nora gibi hazır temalar artık ayrı @primeuix/themes paketinde geliyor ve eski primeng/resources/themes/... CSS dosyaları PrimeNG 22'de yok.

Adım 3.1: PrimeNG'yi ve temalarını kurun

npm install primeng @primeuix/themes

PrimeIcons (primeicons), pi pi-* ikon sınıfları için ayrı ve isteğe bağlı bir paket.

Adım 3.2: Temayı kaydedin

src/app/app.config.ts dosyasına hazır bir temayla providePrimeNG() ekleyin:

import { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core';
import { provideRouter } from '@angular/router';
import { providePrimeNG } from 'primeng/config';
import Aura from '@primeuix/themes/aura';
import { routes } from './app.routes';

export const appConfig: ApplicationConfig = {
  providers: [
    provideBrowserGlobalErrorListeners(),
    provideRouter(routes),
    providePrimeNG({ theme: { preset: Aura } }),
  ],
};

PrimeNG 22'nin provideAnimationsAsync() çağrısına da ihtiyacı yok: bileşenlerinin hiçbiri @angular/animations import etmiyor ve test uygulamamız diyaloglarını bu paket kurulu değilken çalıştırdı.

Adım 3.3: p-dialog bileşenini ekleyin

DialogModule import edin ve diyaloğun görünürlüğünü bir signal'e bağlayın:

import { Component, signal } from '@angular/core';
import { ButtonModule } from 'primeng/button';
import { DialogModule } from 'primeng/dialog';

@Component({
  selector: 'app-root',
  imports: [ButtonModule, DialogModule],
  template: `
    <button #trigger type="button" (click)="visible.set(true)">Show Popup</button>
    <p-dialog
      header="Popup Content"
      [(visible)]="visible"
      [modal]="true"
      [style]="{ width: '25rem' }"
      (onHide)="trigger.focus()"
    >
      <label for="popup-name">Enter your information:</label>
      <input id="popup-name" type="text" placeholder="Name" />
      <p-button label="Close" (onClick)="visible.set(false)" />
    </p-dialog>
  `,
})
export class App {
  protected readonly visible = signal(false);
}

PrimeNG 22'de visible bir model signal olduğundan [(visible)] doğrudan bir signal() değerine bağlanır. Esc ve diyaloğun kapatma ikonu onu yeniden false yapar. (onHide) satırı önemli: testimizde PrimeNG 22 odağı diyaloğun içine taşıdı, ama diyalog kapanınca odağı sayfanın gövdesine (body) bıraktı; bu yüzden örnek odağı butona kendisi geri veriyor.

Adım 3.4: Popup içerik bileşenini oluşturun

Koddan açtığınız diyaloglar için diyalog içeriğini tutan bir bileşen tanımlayın (popup-content.ts):

import { Component, inject } from '@angular/core';
import { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog';

@Component({
  selector: 'app-popup-content',
  template: `
    <label for="dd-name">Enter your information, {{ config.data?.greeting }}:</label>
    <input #name id="dd-name" type="text" placeholder="Name" />
    <button type="button" (click)="ref.close(name.value)">Save</button>
  `,
})
export class PopupContent {
  protected readonly ref = inject(DynamicDialogRef);
  protected readonly config = inject(DynamicDialogConfig);
}

Adım 3.5: DialogService ile açın

Yanındaki bir kapsayıcı bileşende (popup-host.ts), primeng/dynamicdialog paketinden DialogService inject edin ve popup'ı yapılandırmayla açın:

import { Component, inject, signal } from '@angular/core';
import { DialogService } from 'primeng/dynamicdialog';
import { PopupContent } from './popup-content';

@Component({
  selector: 'app-popup-host',
  providers: [DialogService],
  template: `
    <button #trigger type="button" (click)="showPopup(trigger)">Show Popup</button>
    @if (savedName()) {
      <p>Saved: {{ savedName() }}</p>
    }
  `,
})
export class PopupHost {
  private readonly dialogService = inject(DialogService);
  protected readonly savedName = signal('');

  showPopup(trigger: HTMLButtonElement) {
    const ref = this.dialogService.open(PopupContent, {
      header: 'Popup Title',
      width: '70%',
      modal: true,
      closable: true,
      contentStyle: { 'max-height': '500px', overflow: 'auto' },
      data: { greeting: 'friend' },
    });

    ref?.onClose.subscribe((name?: string) => {
      if (name) this.savedName.set(name);
      trigger.focus();
    });
  }
}

PrimeNG 22'de open(), DynamicDialogRef | null döndürüyor; ?. bu yüzden var. Dinamik diyaloglar closable: true ayarlamadığınız sürece kapatma ikonu göstermez ve onClose, diyalog kapandıktan kısa süre sonra tamamlanır. trigger.focus() çağrısı, Adım 3.3'teki nedenle odağı butona geri verir.

Adım 3.6: Popup'ınızı çalıştırın

ng serve

Çalıştığını şuradan anlarsınız: diyalog Aura temasının başlık çubuğuyla açılır, odak içeri geçer, Esc diyaloğu kapatır ve odağı Show Popup butonuna geri koyar. Dinamik sürümde bir isim yazıp Save'e basınca diyalog kapanır ve yazdığınız isim Saved: ile gösterilir.

Bu hatalara dikkat edin:

• PrimeNG 17 dönemi rehberlerdeki eski tema yolları: Eski eğitimler angular.json dosyasına node_modules/primeng/resources/themes/saga-blue/theme.css ekler. Bu klasör PrimeNG 22'de yok; onun yerine providePrimeNG() içinde hazır bir tema ayarlayın.

• DialogService'i providers dizisi olmadan kullanmaya çalışmak: DialogService, MatDialog gibi kök düzeyde bir servis değil. Kapsayıcı bileşenin providers dizisine eklemeniz gerekir, yoksa "NullInjectorError: No provider for DialogService" hatası alırsınız.

• BrowserAnimationsModule'ü alışkanlıkla tutmak: Bir şeyi bozmaz, ama PrimeNG 22'nin ona ihtiyacı yok; @angular/animations paketini dışarıda bırakmak, kullanımdan kaldırılmış bu paketi bundle'ınızdan da çıkarır.

Bilgi
İpucu: DialogService.open() çağrınızı, data yapılandırma seçeneğiyle diyalog bileşenine güçlü tipli veri aktaran bir yardımcı fonksiyonla sarın. PrimeNG'nin DynamicDialogConfig nesnesi bu veriyi popup içinde DI üzerinden sunar; bu, input'ları global bir olay veriyolundan geçirmekten çok daha iyidir.

Üç kodlu kütüphanede de (Material, Ng-bootstrap, PrimeNG) adımlar aynı kalıbı izler: kütüphaneyi kurun, popup'ı standalone bir bileşen olarak yazın, bir tıklama işleyicisinden açın ve sonucu bir signal'e alın. Farklar stil varsayılanlarında ve API'nin size hazır verdiği ek özelliklerdedir.

Her kütüphanede Angular popup'ı için dört adım: kütüphaneyi kurun, popup bileşenini yazın, tıklamayla açın, sonucu bir signal'e alın
Angular 22'de Angular Material, Ng-bootstrap ve PrimeNG için aynı dört adım.

4. Adım: Popupsmart ile kodsuz popup oluşturun

Angular web sitesi için Popupsmart'ta popup oluşturma adımı: görsel düzenleyici ve şablon seçimi

Popup bileşen ağacınıza bağlı değilse (örneğin bir pazarlama sayfasındaki bülten kaydı, bir kampanya için indirim banner'ı ya da hızlı bir MVP testi), kodsuz bir popup oluşturucu bir kütüphane kurup servis yazmaktan daha hızlıdır. Popupsmart kodsuz bir popup oluşturucudur: popup'ı görsel düzenleyicisinde hazırlar, Angular uygulamanızın index.html dosyasına tek bir script etiketi yapıştırırsınız.

Önemli bir uyarı: popup'ın Angular bileşen yaşam döngüsüne katılması, servislerle durum paylaşması ya da içinde Angular bileşenleri göstermesi gerekiyorsa bu yöntem MatDialog, NgbModal veya p-dialog yerine geçmez. Veri katmanınıza bağlı uygulama içi modallar için yukarıdaki üç kodlu yöntemden birini kullanın.

Adım 4.1: Hesap açın

Platformda bir hesap oluşturun. Ayda 5K sayfa gösterimini kapsayan ücretsiz bir plan var; prototipler ve küçük kampanyalar için yeterli.

Adım 4.2: Şablon seçin

Hedefe uyan bir popup şablonu seçin: e-posta toplama, indirim teklifi, çıkış niyetiyle geri kazanma ya da geri bildirim anketi.

Adım 4.3: Metni, tasarımı ve tetikleyicileri özelleştirin

Başlığı, gövde metnini, buton yazısını, renkleri ve kuralları (sayfa hedefleme, çıkış niyeti, zaman gecikmesi, kaydırma derinliği) görsel düzenleyicide değiştirin; kurallar kampanyanın Segment bölümünde. Kampanyayı kaydedin.

Adım 4.4: Embed kodunu Angular projenize ekleyin

Panelin sol çubuğunda Embed Kodu'na tıklayın ve kodu kopyalayın. src/index.html dosyasında kapanan </body> etiketinin hemen önüne yapıştırın, ardından alan adınızı ekleyip doğrulayın; Popupsmart yardım merkezindeki embed kodu rehberi adımları gösteriyor.

Adım 4.5: Yayınlayın ve test edin

Panelde yayınla'ya basın, Angular geliştirme sunucunuzu yeniden yükleyin ve popup'ı belirlediğiniz kurallarla tetikleyin (örneğin sayfanın %50'sine kaydırarak).

Adım 4.6: Bir Angular butonundan açın (isteğe bağlı)

Kampanyanın Segment bölümünde Kullanıcı Davranışı altındaki Tıklamaya Duyarlı Hedefleme'yi açın, oluşturduğu koddaki kampanya kimliğini kopyalayın ve bir tıklama işleyicisinden window.ps.show() çağırın:

import { Component } from '@angular/core';

declare global {
  interface Window {
    ps?: { show(options: { id: number }): void };
  }
}

// Copy the campaign id from the snippet Popupsmart generates under On-Click Targeting.
const CAMPAIGN_ID = 12345;

@Component({
  selector: 'app-newsletter-button',
  template: `<button type="button" (click)="openCampaign()">Get the newsletter</button>`,
})
export class NewsletterButton {
  openCampaign() {
    window.ps?.show({ id: CAMPAIGN_ID });
  }
}

İsteğe bağlı zincirleme (?.), embed kodu yüklenmeden önce butonun hata vermemesini sağlar. Popupsmart'ın yardım merkezi, show() çağrısını başka bir sayfaya giden bağlantılarda ya da butonlarda kullanmamanızı öneriyor.

Çalıştığını şuradan anlarsınız: popup, konsolda hata olmadan Angular uygulamanızın üstünde görünür ve Popupsmart panelindeki kampanyanın Analitik sayfası popup görüntülemelerini saymaya başlar.

Bir yapay zekâ kodlama ajanıyla çalışıyorsanız, Popupsmart'ın MCP sunucusu ve CLI aracı ajanın uygulamanın arayüzünde yapılan her şeyi yapmasını sağlar: şablondan popup oluşturmak, hedefleme ve tetikleyicileri ayarlamak, entegrasyonları bağlamak ve yayınlamak. Bu, ücretsiz plan dahil her planda geçerli.

Bu hatalara dikkat edin:

• Script'i bir bileşen şablonuna yapıştırmak: Angular, bileşen şablonlarındaki <script> etiketlerini temizler ve bunlar çalışmaz. Script'i index.html dosyasına (Angular kökünün dışına) koyun, normal şekilde yüklenir.

• Angular bileşen yaşam döngüsü kancalarını beklemek: Popup, Angular uygulamanızdan ayrı bir DOM ağacında yaşar. Ona viewChild() ile ulaşamazsınız, o da Angular servislerini doğrudan okuyamaz. Lead'lerin kendi backend'inize gelmesi gerekiyorsa onları Popupsmart'ın webhook entegrasyonuyla gönderin.

• Sayfa düzeyinde hedeflemeyi unutmak: URL kuralı olmadan popup, yönetim sayfalarınız dahil her rotada açılır. Yol tabanlı hedeflemeyi kampanyanın Segment bölümünde URL Hedefleme altında ayarlayın. Angular router URL'yi sayfa yüklemeden değiştirdiği için kuralı yalnızca sayfayı yenileyerek değil, uygulama içinde gezinerek de test edin.

Not
Hızlı bilgi: SaaS uygulamalarında pazarlama sayfaları (ana sayfa, fiyatlandırma, blog) için Popupsmart'ı, oturum açılmış uygulama kabuğu için MatDialog veya NgbModal bileşenini kullanın. Pazarlama için bir araç, ürün için başka bir araç: Angular bundle'ınız da küçük kalır. Bu kalıbı butona tıklayınca açılan popup'lar rehberimizde daha ayrıntılı anlattık; anlatılanlar Angular şablonlarına da kolayca uyar.

Popup'ları neden Angular ile oluşturmalısınız?

Bir kütüphane seçtikten sonra işin çoğunu Angular'ın yapısı halleder. Geliştiricilerin elle yazılmış bir vanilla JS modalı yerine Angular'ı seçmesinin birkaç somut nedeni:

• Bileşen tabanlı mimari: Popup da standalone bir bileşendir; aynı diyaloğu farklı rotalarda farklı girdilerle yeniden kullanabilirsiniz.

• Signal'ler: Popup'ın açık olup olmadığı ve sonucu bir signal() içinde durur; şablon, zone.js olsa da olmasa da değiştiklerinde yeniden çizilir.

• Çift yönlü veri bağlama: Popup içindeki formlar, DOM'u elle okumadan üst bileşenin durumuyla eşit kalır.

• Bağımlılık enjeksiyonu: MatDialog, NgbModal ve DialogService gibi servisler global tekil nesneler olmadan inject edilir, taklit edilir (mock) ve test edilir.

• Reaktif formlar: Yerleşik doğrulama, tipli formlar (v14'ten beri) ve asenkron doğrulayıcılar bir popup şablonuna kolayca eklenir.

• Test edilebilirlik: Angular'ın TestBed aracı ve Material'ın MatDialogHarness sınıfı diyalogları tek başına kurup kullanmanızı sağlar; odak tuzağı ve ARIA hataları yayına çıkmadan yakalanır.

Diğer framework'lerdeki karşılıkları benzer ama her birinin kendine has tuhaflıkları var. Aynı kalıbı PHP ile popup ve Vue modal popup'ları rehberlerimizde de anlattık; yaşam döngüsü kancaları framework'ler arasında epey farklı olduğu için bir framework'ten diğerine taşımak gerçek bir iş.

Dört yöntem nasıl karşılaştırılır?

Dört yöntem en çok kurulma, popup'ı açma ve sonucun geri gelme biçiminde ayrışıyor. Aşağıdaki tablo dört yöntemi aynı eksenlerde, Ekim 2026'da Angular 22 ile kontrol ederek karşılaştırıyor:

Angular Material Ng-bootstrap PrimeNG Popupsmart
Angular 22 için sürüm @angular/material 22.2 @ng-bootstrap/ng-bootstrap 21.0 primeng 22.1 Hepsi (script etiketi)
Kurulum ng add @angular/material ng add @ng-bootstrap/ng-bootstrap npm install primeng @primeuix/themes index.html içinde embed kodu
Popup'ı açma inject(MatDialog).open(Popup) inject(NgbModal).open(PopupContent) [(visible)] signal veya DialogService.open() Hedefleme kuralları veya window.ps.show()
Sonucu alma afterClosed() Observable result Promise onClose Observable Analitik sayfasında lead'ler
@angular/animations gerekir mi Hayır Hayır Hayır Hayır
En uygun olduğu yer Material Design kullanan uygulamalar Bootstrap temalı uygulamalar Çok sayıda bileşen ve hazır tema isteyen uygulamalar Deploy gerektirmeden düzenlenen pazarlama popup'ları

Kütüphane olmadan Angular popup'ı nasıl oluşturulur?

Bir bileşene tarayıcının yerel <dialog> öğesini koyup üzerinde showModal() çağırarak hiçbir kütüphane kullanmadan Angular popup'ı oluşturabilirsiniz. Arka plan katmanını, Esc ile kapatmayı, arka plandaki içeriğin etkisizleşmesini ve odağın geri dönmesini tarayıcı halleder; sonucu şablona bir signal taşır:

import { Component, ElementRef, signal, viewChild } from '@angular/core';

@Component({
  selector: 'app-native-popup',
  template: `
    <button type="button" (click)="open()">Open popup</button>

    <dialog #dialog aria-labelledby="native-popup-title" (close)="choice.set(dialog.returnValue)">
      <h2 id="native-popup-title">Get our Angular tips</h2>
      <p>One email a week. Press Esc or choose an option to close.</p>
      <form method="dialog">
        <button value="no">No thanks</button>
        <button value="yes">Subscribe</button>
      </form>
    </dialog>

    @if (choice()) {
      <p>You chose: {{ choice() }}</p>
    }
  `,
})
export class NativePopup {
  private readonly dialog = viewChild.required<ElementRef<HTMLDialogElement>>('dialog');
  protected readonly choice = signal('');

  open() {
    this.choice.set('');
    this.dialog().nativeElement.showModal();
  }
}

<form method="dialog">, diyaloğu kapatır ve returnValue değerini basılan butonun değerine eşitler; içeride tıklama işleyicisine gerek kalmaz. Testimizde Esc diyaloğu kapattı ve odak, ek kod olmadan Open popup butonuna döndü. MDN'nin dialog öğesi başvurusu davranışın geri kalanını listeliyor. Başka türlü bileşen kütüphanesine ihtiyaç duymayan bir uygulamada basit bir onay ya da kayıt popup'ı için doğru seçim bu.

Bir popup'ı ya da toast'ı kütüphane olmadan canlandırmak için animate.enter ve animate.leave kullanın. Angular 20.2, @angular/animations paketini bunların lehine kullanımdan kaldırdı; Angular'ın giriş ve çıkış animasyonları rehberinin anlattığı gibi bunlar, öğe eklenince bir CSS sınıfı ekler ve öğeyi kaldırmadan önce animasyonunun bitmesini bekler:

import { Component, signal } from '@angular/core';

@Component({
  selector: 'app-toast',
  template: `
    <button type="button" (click)="show.set(!show())">Toggle toast</button>
    @if (show()) {
      <div class="toast" role="status" animate.enter="toast-in" animate.leave="toast-out">
        Changes saved
      </div>
    }
  `,
  styles: `
    .toast-in { animation: slide-in 200ms cubic-bezier(0.23, 1, 0.32, 1); }
    .toast-out { animation: slide-in 150ms cubic-bezier(0.23, 1, 0.32, 1) reverse; }
    @keyframes slide-in {
      from { opacity: 0; transform: translateY(8px); }
      to { opacity: 1; transform: translateY(0); }
    }
    @media (prefers-reduced-motion: reduce) {
      .toast-in, .toast-out { animation: none; }
    }
  `,
})
export class Toast {
  protected readonly show = signal(false);
}

role="status" toast'ı odağı taşımadan bir durum mesajı olarak işaretler; duyurunun kesin olması gerekiyorsa MatSnackBar ya da CDK'nın LiveAnnouncer servisi daha güvenli seçimdir. Reduced-motion sorgusu, daha az hareket isteyen kullanıcılar için kaydırmayı kapatır.

SaaS uygulamanız için doğru popup yöntemini nasıl seçersiniz?

Doğru yöntem üç soruya bağlı: onu kim yapıyor, popup'ın içinde ne var ve uygulamanın neresinde duruyor. Bu kısa karar akışını izleyin, fazla tahmin yürütmeden dört gruptan birine yerleşirsiniz.

1. Angular Material'ı seçin, eğer: uygulamanız zaten Material Design token'ları kullanıyorsa, tasarım sisteminiz Material tipografisine ve bileşenlerine dayanıyorsa ya da kutudan çıktığı gibi en öngörülebilir erişilebilirliği istiyorsanız. Angular ekibi geliştiriyor ve sürümleri Angular'ınkilerle aynı anda çıkıyor. Ödünleşim: temalar keskin kararlar içeriyor ve belli bir noktadan sonra onları özelleştirmek framework'le savaşmaya dönüşüyor.

2. Ng-bootstrap'ı seçin, eğer: ön yüzünüz zaten Bootstrap temalıysa, ekibiniz Bootstrap CSS sınıflarına Material'ın tema sisteminden daha alışkınsa ya da onay/iptal diyalogları için küçük bir kurulum istiyorsanız. Ödünleşim: animasyon ve tema seçenekleri Material ve PrimeNG'den daha sınırlı.

3. PrimeNG'yi seçin, eğer: diyalog dışında 90+ bileşene (veri tabloları, grafikler, takvimler) ihtiyacınız varsa, tek satırlık ayarla değiştirebileceğiniz hazır temalar istiyorsanız ya da ek bağlantı yazmadan sürüklenebilir, yeniden boyutlandırılabilir diyaloglar gerekiyorsa. Ödünleşim: tema motoru v17 ile v22 arasında değişti, bu yüzden eski rehberler çalışmıyor.

4. Popupsmart'ı seçin, eğer: popup bir pazarlama ya da açılış sayfasındaysa, popup'ı mühendis olmayan biri (pazarlama, büyüme, içerik ekibi) düzenleyecekse ya da prototip hazırlıyor ve kurulumu tamamen atlamak istiyorsanız. Ödünleşim: Angular'ın yaşam döngüsünün dışında yaşar ve servislerinizi okuyamaz.

Tipik bir SaaS ürününde pratik cevap bir ayrımdır: uygulama içi modallar (silme onayları, ayar diyalogları, ödeme akışları) için bir Angular kütüphanesi, pazarlama yüzeyi (bülten kaydı, ücretsiz deneme hatırlatmaları, çıkış niyeti) için kodsuz bir araç. Tek araçla ikisini birden yapmaya çalışmak, ekiplerin aynı işi yeniden yaptığı yerdir.

2026'da kaçınılması gereken en yaygın Angular popup hataları nelerdir?

Dört yöntemin hepsinde aynı birkaç hata canlı kodda tekrar tekrar çıkıyor. Hiçbiri büyük değil, ama her biri kullanıcı deneyimini ya da erişilebilirliği sessizce bozuyor; test ekibiniz de bunları çoğu zaman bir kullanıcı şikâyeti gelene kadar fark etmiyor.

1. Yapışkan başlıklar ve alt menülerle z-index çakışmaları. Material diyaloglarını tutan CDK overlay kapsayıcısı z-index: 1000 değerinde duruyor, Bootstrap 5.3 modalı 1055'e (arka plan 1050) koyuyor, PrimeNG'nin modal katmanı ise 1100'den başlıyor. Yapışkan menünüzün z-index değeri daha yüksekse diyalog onun arkasında açılır ve hiç açılmamış gibi görünür. Çözüm: stil dosyanızda z-index değerlerini topluca gözden geçirin ya da CDK overlay kapsayıcısının z-index değerini (.cdk-overlay-container) geçersiz kılın.

2. Dinamik içerikte bozulan odak. MatDialog açıldığında odağı ilk sekmeyle ulaşılabilir öğeye taşır (autoFocus: 'first-tabbable'). İçerik asenkron yükleniyorsa (sonradan yüklenen form alanları, asenkron veri çekme) odaklanacak bir şey henüz olmayabilir. Çözüm: diyalog kapsayıcısına odaklanmak için autoFocus: 'dialog' ayarlayın ya da yükleme durumunu odaklanabilir bir öğeyle gösterin.

3. Diyalog içindeki aboneliklerden bellek sızıntıları. Material'daki afterClosed() ve PrimeNG'deki onClose kendiliğinden tamamlanır, Ng-bootstrap'ın result değeri de bir Promise'tir; yani bunlara tek bir abonelik sızıntı yapmaz. Popup bileşeninin içinde uzun ömürlü akışlara (bir store, rota parametreleri, bir interval) açtığınız abonelikler ise sızıntı yapar. Çözüm: onları takeUntilDestroyed() üzerinden geçirin ya da signal kullanın.

4. Özel diyaloglarda ARIA rollerini atlamak. Popup'ınızı @if ve bir <div> ile kendiniz yazıyorsanız role="dialog", aria-modal="true", aria-labelledby, bir odak tuzağı ve Esc kullanımını kendiniz eklemeniz gerekir. Bunlar olmadan ekran okuyucu kullananlar diyaloğun dışına düşer. showModal() ile açılan yerel <dialog> öğesi modal durumunu, Esc'yi ve odağın geri dönmesini sizin yerinize halleder.

5. Yavaş cihazlarda takılan animasyonlar. MatDialog varsayılan olarak 150 ms'de açılır, 75 ms'de kapanır (enterAnimationDuration ve exitAnimationDuration bunu değiştirir) ve prefers-reduced-motion ayarlayan kullanıcılar için animasyonları kapatır. Hareketi animate.enter ile kendiniz yazıyorsanız aynı reduced-motion kuralını kendiniz ekleyin ve girişleri kısa tutun.

6. Standalone bileşen geçişini unutmak. Standalone bileşenler Angular 19'da varsayılan oldu; yeni Angular 22 projeleri ayrıca @if/@for kontrol akışını kullanıyor ve zone.js olmadan çalışıyor. NgModule dönemi rehberlerinden gelen kod bir modül içinde hâlâ çalışır, ama standalone bir uygulamada her bileşen şablonunun kullandığını kendisi import eder. Diyalog API'leri pek değişmedi; değişen, onları nereden import ettiğiniz. Angular iki geçişi de hazır sunuyor: ng generate @angular/core:standalone ve ng generate @angular/core:control-flow.

7. Popup'ı yalnızca masaüstüne göre boyutlandırmak. 28.674 kampanyayı kapsayan, Ocak 2024 ile Eylül 2026 arasındaki Popupsmart 2026 popup kıyaslamasına göre popup gösterimlerinin %63'ü mobilde gerçekleşiyor. 600 px'e ya da width: '70%' değerine sabitlenmiş bir diyalog telefonda pek yer bırakmaz. Material diyaloglarına bir maxWidth verin, PrimeNG'nin breakpoints seçeneğini kullanın, popup'ı 375 px'te kontrol edin ve yerleşim için mobil popup tasarım rehberimize bakın.

Angular popup'larında erişilebilirlik nasıl sağlanır?

W3C'nin 2023'te yayımladığı WCAG 2.2, Web İçeriği Erişilebilirlik Yönergeleri'nin güncel sürümüdür. Popup'larda özellikle beş şeyin doğru olması gerekir:

• ARIA öznitelikleri: role="dialog", diyalog başlığının kimliğini gösteren aria-labelledby ve aria-modal="true" kullanın. Ng-bootstrap ve PrimeNG üçünü de sizin yerinize ekler. Angular Material ise varsayılan olarak aria-modal değerini false bırakır ve sayfanın geri kalanını ekran okuyuculardan aria-hidden ile gizler; denetiminiz bu özniteliği istiyorsa diyalog ayarlarında ariaModal: true yapın. Özel popup'larda bunların hepsini elle yapmanız gerekir.

• Klavyeyle gezinme: Tab ve Shift+Tab yalnızca diyalog içindeki odaklanabilir öğeler arasında dolaşmalı. Esc diyaloğu kapatmalı. Enter (birincil butonda) onaylamalı.

• Odak yönetimi: Diyalog açıldığında odak ilk etkileşimli öğeye geçer. Kapandığında odak tetikleyici butona döner. Angular 22 test uygulamamızda Material'ın diyaloğu, Ng-bootstrap'ın modalı ve yerel <dialog> öğesi ikisini de yaptı. PrimeNG 22'nin diyalogları odağı içeri taşıdı ama kapanırken sayfanın gövdesinde bıraktı; yukarıdaki PrimeNG örneklerinin tetikleyicide focus() çağırmasının nedeni bu.

• Kolay bulunan bir kapatma kontrolü: Popupsmart'ın 2026 kıyaslamasında popup'ı kapatan ziyaretçilerin %71'i bunu popup göründükten sonraki 5 saniye içinde yapıyor. Kapatma butonuna görünür bir etiket ya da bir aria-label verin, insanların aradığı yere koyun ve Esc'nin çalıştığından emin olun.

Popupsmart'ın 2026 popup kıyaslamasında popup'ı kapatan ziyaretçilerin %71'i bunu popup göründükten sonraki 5 saniye içinde yapıyor
Popupsmart popup kıyaslaması 2026: 28.674 kampanya, Ocak 2024 - Eylül 2026.

• Ekran okuyucu testi: Windows'ta NVDA, macOS'ta VoiceOver ile test edin. İkisi de diyalog açıldığında başlığı ve odaklanılan öğeyi seslendirmeli.

Dikkat
Sık yapılan hata: Bir kütüphanenin popup'ı kendi başına erişilebilir yaptığını varsaymak. Material, Ng-bootstrap ve PrimeNG odağı ve rolleri halleder, ama erişilebilir ad hâlâ sizin işaretlemenizden gelir: eksik bir mat-dialog-title, ariaLabelledBy ya da header, ekran okuyucu kullananları adı olmayan bir diyalogla baş başa bırakır.

Erişilebilirlik isteğe bağlı değil. ARIA rollerini ya da odak yönetimini atlamak klavye ve ekran okuyucu kullananları dışarıda bırakır; bu varsayımsal değil, gerçek bir maliyet. Daha ayrıntılı bir kontrol listesi gerekiyorsa W3C'nin diyaloglar için ARIA Authoring Practices rehberi başvurulacak kaynaktır.

İlk Angular popup'ınızı bu hafta yayına alın

Artık dört çalışan seçeneğiniz var: Angular Material'ın MatDialog servisi, Ng-bootstrap'ın NgbModal servisi, PrimeNG'nin p-dialog bileşeni ve Popupsmart'ın kodsuz embed kodu; kütüphane istemediğiniz durumlar için de yerel <dialog> öğesi. Yukarıdaki karar akışına göre birini seçin (Material uygulamaları için Material, Bootstrap uygulamaları için Ng-bootstrap, animasyon ağırlıklı kullanımlar için PrimeNG, mühendislik dışı işler için Popupsmart) ve kurulumu bir sonraki geliştirme oturumunuzun ilk on dakikasında yapın.

İpucu
Ana fikir: Angular 22'de bu rehberdeki her popup kütüphanesi @angular/animations olmadan, standalone bileşenlerle ve sonucu tutan bir signal ile çalışıyor. Bir eğitim hâlâ bir NgModule ve BrowserAnimationsModule ile başlıyorsa, eski bir Angular için yazılmıştır.

Ekibiniz hangi kütüphanede standartlaşacağını tartışırken kodsuz yoldan başlamak isterseniz app.popupsmart.com adresinden kaydolun, bir şablon seçin, embed kodunu index.html dosyasına yapıştırın; öğle yemeğinden önce Angular geliştirme sunucunuzda çalışan bir popup'ınız olur. Kodlu yöntemler, popup'ın kalmaya değer olduğunu doğrulayana kadar bekleyebilir.

Sıkça Sorulan Sorular

Angular'da popup'lar için özel animasyonlar oluşturabilir miyim?

Evet. Angular 20.2 ve sonrasında popup öğesini bir @if bloğuna koyun, üzerine animate.enter ve animate.leave ekleyin ve hareketi @keyframes içeren CSS sınıflarıyla tanımlayın. Angular, öğeyi DOM'dan kaldırmadan önce çıkış animasyonunun bitmesini bekler. Eski @angular/animations paketi hâlâ çalışıyor ama kullanımdan kaldırıldı. Animasyon kodu yazmak istemiyorsanız Popupsmart'ın stil panelinde bir açılış efekti ayarı var ve popup'lara Lottie animasyonu ekleyebiliyorsunuz.

Angular'da modal diyalog ile popup arasındaki fark nedir?

İki terim çoğu zaman eş anlamlı kullanılır, ama gerçek bir fark var. Modal diyalog sayfanın geri kalanını kilitler: onu kapatana kadar dışındaki hiçbir şeyle etkileşime giremezsiniz. Popup ise daha geniş bir kategoridir; tooltip'ler, açılır menüler, snackbar'lar ve küçük yüzen paneller gibi sayfayı kilitlemeyen kalıpları da kapsar. Angular'da MatDialog, NgbModal ve p-dialog varsayılan olarak modal çalışır. Modal olmayan bir diyalog için Material'da hasBackdrop: false, Ng-bootstrap'ta backdrop: false ayarlayın.

Angular'da bildirim veya uyarı popup'ı nasıl gösterilir?

Kısa bir bildirim için Angular Material'ın MatSnackBar servisini kullanın: inject edip open('Changes saved', 'Undo', { duration: 4000 }) çağırın. Sayfayı kilitlemez ve ekran okuyucular mesajı seslendirir. Cevap gerektiren bir uyarı için, örneğin silme onayı ya da oturum zaman aşımı, bunun yerine bir modal kullanın: MatDialog, NgbModal veya yerel dialog öğesi. Tarayıcının window.alert() fonksiyonu da çalışır ama ona stil veremezsiniz.

Angular'da popup kullanıcı etkileşimlerini nasıl takip edebilirim?

İki yol var. Kendi kurduğunuz yolda diyaloğunuzun açılma, kapanma ve form gönderme olaylarına dinleyici bağlar, bu olayları Google Analytics 4 veya Plausible gibi bir web sitesi analiz aracına gönderirsiniz. Kısa yol ise Popupsmart gibi takibi hazır gelen bir popup oluşturucu kullanmak: popup görüntülemeleri, lead'ler, etkileşimler ve dönüşüm oranı, tek satır analiz kodu yazmadan Analitik sayfasında görünür. Aynı yaklaşım her teknolojide işe yarar; Python web uygulamalarında popup rehberimizde de aynısını anlattık.

2026'da SaaS uygulamaları için en iyi Angular popup kütüphanesi hangisi?

Sıfırdan başlıyorsanız en güvenilir varsayılan Angular Material: onu Angular ekibi geliştiriyor, erişilebilirliği sağlam ve sürümleri Angular'ın sürümlerini takip ediyor. Ön yüzünüz zaten Bootstrap ise Ng-bootstrap yeniden tema giydirme zahmetini ortadan kaldırır. PrimeNG bileşen çeşitliliğinde öne çıkar. Pazarlama sayfası popup'ları için kodsuz bir araç, bu üçünden herhangi birini kurmaktan daha hızlıdır. Herkes için tek bir en iyi yok; seçim mevcut teknoloji yığınınıza bağlı.

Angular'da butona tıklayınca açılan popup form nasıl oluşturulur?

Tetikleyici butona bir tıklama işleyicisi bağlayın, diyalog servisini (MatDialog, NgbModal veya DialogService) inject edin ve reaktif form içeren bir bileşen açın. Gönderilen değeri Material'da afterClosed(), Ng-bootstrap'ta result, PrimeNG'de onClose üzerinden okuyun. Formu kısa tutun: Popupsmart'ın 2026 kıyaslamasında bir veya iki alan isteyen popup'lar %0,88 ve %0,94 dönüştürüyor, üç alanda bu oran %0,56 (medyan kampanya; çarkıfelek ve diğer oyunlaştırılmış popup'lar ayrı sayıldı).

Bunlara göz atın

• React ile Popup Nasıl Oluşturulur

• Vue Modal ve Popup Nasıl Oluşturulur

• Modal Popup Nasıl Oluşturulur

• PHP ile Sitenize Popup Nasıl Eklenir

Ece Sanan

Content Marketing Specialist

Tüm yazılar

Popupsmart'ın İçerik Pazarlama Uzmanlarından biriyim. İçerik üretmediğim zamanlarda beni mental olarak kendimi beslemeye çalışırken görebilirsiniz. Growth marketing çalışmaları yapmadığım anlarda yoga yapıyor ve kedilerimle vakit geçiriyorum 🧘🏻 😸 İçerik dünyasına 2013 yılında şiirlere merak salarak dahil oldum. O zamanlar şiirlerin herkesin zihninde nasıl farklı resimler yaratabildiğine şaşırmıştım. Sonra, pazarlamaya olan ilgim nöropazarlamayla alevlendi. Bu yüzden yazmaya başladım ve o zamandan beri hiç durmadım. Bugün yazmaya olan sevgimi ve nöropazarlamaya olan ilgimi, insanları gerçekten birbirine bağlayan içerikler oluşturmaya odaklandığım Popupsmart'taki işime yansıtıyorum.

tarafından incelendi. Mert Özeren