Konu Başlıkları
Yükleniyor...

Frames Neden Terk Edildi ve Aynı Hata Nerede Geri Geliyor

Frames'ten SPA'ya: Adresle Ekranın Aynı Şeyi Söylemesi

Frames'i savunan kimse kalmadı, o tartışma kapandı. İlginç olan neden kapandığı: sorun çerçevelerin görüntüsü değildi, adres çubuğundaki şeyle ekrandaki şeyin birbirinden kopmasıydı. Bu kopukluk web'den silinmedi, sadece kılık değiştirdi.

Frameset tam olarak ne yapıyordu

Bir frameset belgesi kendi içinde içerik taşımayan bir iskeletti; ekranı bölmelere ayırır, her bölmeye ayrı bir HTML dosyası yüklerdi. Menü bir dosyada, içerik başka bir dosyada dururdu ve kullanıcı menüden bir bağlantıya tıkladığında yalnızca içerik bölmesi yenilenirdi. 1990'ların sonunda bu gerçekten pratikti: menüyü tek yerde güncelliyordunuz, her sayfa geçişinde tekrar indirilmiyordu.

Kaybedilen şey: adresle ekranın aynı şeyi söylemesi

Tarayıcının adres çubuğu frameset belgesini gösteriyordu, bölmelerin içinde ne olduğunu değil. Kullanıcı yirmi tıklama sonra işine yarayan bir sayfaya ulaştığında adres hâlâ ilk hâlindeydi. Pratikte olanlar:

  • Yer imine eklenen adres, kullanıcıyı gördüğü ekrana değil sitenin giriş kurgusuna geri getirirdi.
  • Paylaşılan bağlantı karşı tarafta başka bir şey açardı, ki bir içeriğin dolaşıma girmesinin önündeki en sert engel budur.
  • Yazdırma çoğu zaman yalnızca odaktaki bölmeyi basardı.
  • Arama motoru bölmedeki belgeyi tek başına indeksliyor, sonuçtan gelen kullanıcı menüsüz ve bağlamsız bir sayfaya düşüyordu.

Geri tuşu ayrı bir dert. Her bölme yüklemesi geçmişe ayrı bir kayıt olarak giriyordu, dolayısıyla siteden çıkmak isteyen kullanıcı geri tuşuna onlarca kez basıyor, çıkamayınca sekmeyi kapatıyordu. Kullanıcı bunu araştırmada "site beni bırakmıyor" diye anlatır, geçmiş yığını diye değil.

Erişilebilirlik tarafında olan

Ekran okuyucu için frameset tek bir sayfa değil, aynı anda açık birkaç belgeydi. Kullanıcı belgeler arasında ayrıca gezinmek zorunda kalıyor, çerçevelerin başlığı yoksa (çoğu zaman yoktu) "frame 1", "frame 2" gibi hiçbir şey anlatmayan etiketlerle karşılaşıyordu. Klavyeyle gezinen biri içinse odak sırası bölme sınırlarında kopuyordu, çünkü sıra artık tek bir belgenin sırası değildi.

Aynı hata, yeni kılıkta

Frames'in yerine önerilen şey genelde tek sayfa uygulaması oluyor. Peki ya bu öneri aynı hatayı taşıyorsa? Geçmiş yönetimini ihmal eden bir arayüz tam olarak frameset'in yaptığını yapar: ekran değişir, adres yerinde kalır. Filtreleri seçersiniz, listeyi daraltırsınız, sayfayı yenilersiniz, her şey başa döner. Teknoloji değişti, kullanıcının yaşadığı şey aynı.

Testi iki dakika sürüyor. Arayüzde anlamlı bir duruma gelin, adresi kopyalayın, gizli sekmede açın. Aynı ekran gelmiyorsa uygulamanız paylaşılabilir değildir. İkinci test: aynı yerde geri tuşuna bir kez basın, kullanıcının "bir adım geri" saydığı yere mi gidiyorsunuz, yoksa on beş ara duruma mı? Her ufak durum değişikliğinde geçmişe kayıt eklemek (çok yaygın bir varsayılan, bana fazla cömert geliyor) geri tuşunu frameset dönemindeki hâline döndürür.

Bir durumun adrese yazılıp yazılmayacağının ölçüsü şu: kullanıcı oraya geri dönmek ister mi? Filtre, sekme, arama sorgusu evet. Açılır menünün açık olması, hover durumu, yarım kalan animasyon hayır. pushState ile replaceState arasındaki fark tam olarak bu soruyu cevaplıyor, biri geçmişe yeni kayıt ekler, diğeri mevcut kaydı günceller. Arayüz kararını verirken bu ikisinden hangisine denk düştüğünü söyleyemiyorsanız karar henüz verilmemiş demektir.

Iframe neden hâlâ ayakta

Iframe farklı bir işi çözüyor: sayfanın kendisi olmak yerine sayfanın içinde bir konuk barındırıyor. Harita, video, ödeme formu, dışarıdan gelen bir widget. Adres çubuğu ana belgeyi gösterdiği için yukarıdaki kopukluk oluşmuyor, zaten iframe içindeki durum kullanıcının geri dönmek isteyeceği bir durum değil.

Kullanacaksanız her iframe'e anlamlı bir title verin; ekran okuyucu kullanıcısının elindeki tek tanımlayıcı odur ve boş bırakıldığında kullanıcı içeri ne olduğunu bilmeden giriyor. Dış kaynaklı içeriği sandbox ile sınırlamak tercih değil varsayılan olmalı. Ekranın altında kalan gömülü içerikte loading="lazy" ilk yükleme süresini gözle görülür biçimde kısaltır.

Site navigasyonunu iframe'e koymak ise frameset'i elle yeniden kurmaktır. O yol denendi, sonucu belli.