CSS bölgeleri ve hariç tutmalarıyla web için dergiye benzer düzen

Christian Cantrell
Christian Cantrell

Giriş

Web, Adobe'nin büyük bir tecrübe ve uzmanlığa sahip olduğu son derece güçlü bir metin alanıdır. Bu nedenle, Adobe web'i ileriye taşımanın yollarını ararken web'in metin yeteneklerini daha da geliştirmek başlangıç için en iyi seçenek gibi göründü. Web genellikle metin için tek bir sütun ve dikey yön olduğunu varsayar. Metni grafiklerin etrafından akıtmak ve hatta CSS ile metni birden çok sütun halinde biçimlendirmek mümkün olsa da, web'de dergiye benzeyen bir düzen oluşturmak hâlâ çok zordur. Adobe, CSS Bölgeleri ve CSS Hariç Tutmaları sayesinde, masaüstü yayıncılığın gücünü modern tarayıcılara taşıma çabalarına öncülük etmektedir. Örneğin, aşağıdaki ekran görüntüsünde, CSS Hariç Tutmaları metnin dağın çevresi boyunca akması için kullanılmıştır:

CSS hariç tutmalarının işleyiş şekline örnek
CSS hariç tutmalarının işleyiş şekli örneği

Aşağıdaki ekran görüntüsünde yer alan dokümanda, metnin resimlerdeki şekillerin etrafından akıtılmasına olanak tanımak için CSS Hariç Tutmaları ve metni sütunlar halinde ve bir pull tırnağı etrafında biçimlendirmek için CSS Bölgeleri de kullanılmaktadır.

CSS bölgelerini kullanım örneği
CSS bölgelerini uygulamalı olarak gösteren örnek

CSS Bölgeleri

CSS Bölgeleri ile ilgili ayrıntılara girmeden önce, bölgelerin Google Chrome'da nasıl etkinleştirilebileceğinden bahsetmek istiyorum. CSS Bölgelerini etkinleştirdikten sonra, bu makalede referans verilen bazı örnekleri deneyebilir ve kendi örneklerinizi oluşturabilirsiniz.

Google Chrome'da CSS Bölgelerini Etkinleştirme

CSS Bölgeleri, Chrome'un 20 sürümünden (tam olarak gerekirse 20.0.1132.57 sürümü) chrome://flags arayüzü üzerinden etkinleştirilmektedir. CSS Bölgelerini etkinleştirmek için aşağıdaki adımları uygulayın:

  1. Chrome'da yeni bir sekme veya pencere açın.
  2. Konum çubuğuna chrome://flags yazın.
  3. Sayfada bul'u (control/command + f) kullanarak "deneysel Web Platformu özellikleri" bölümünü arayın.
  4. Etkinleştir bağlantısını tıklayın.
  5. Alt kısımdaki Şimdi Yeniden Başlat düğmesini tıklayın.

Chrome'un işaretleri hakkında daha fazla bilgi edinmek için Chrome İşaretleri Hakkında Her Şey başlıklı blog yayınıma bakın.

Tarayıcınızı yeniden başlattıktan sonra CSS Bölgeleri ile denemeler yapmaya başlayabilirsiniz.

CSS Bölgelerine Genel Bakış

CSS Bölgeleri, anlamsal olarak işaretlenmiş metin bloğunun otomatik olarak "kutulara" (şu anda öğeler) akmasına olanak tanır. Aşağıdaki diyagramda metin (akış) ile kutuların (metnin aktığı bölgeler) ayrılması gösterilmektedir:

İçerik, tanımlanan bölgelere gider
İçerik, tanımlanan bölgelere aktarılır

CSS Bölgelerinin gerçek bir kullanım alanına göz atalım. Adobe'de geliştirici olmanın yanı sıra bilim kurgu yazarıyım. Çalışmamı Creative Commons lisansı kapsamında çevrimiçi olarak sık sık yayınlıyorum ve maksimum sayıda cihazda ve tarayıcıda çalışabilmesi için sıklıkla şuna benzer son derece basit bir biçim kullanıyorum:

Stilsiz İnsanlara Ait Eski Proje Örneği
Stilsiz İnsana Ait Proje Örneği

CSS Bölgelerini kullanarak hem görsel açıdan daha ilgi çekici hem de çok daha işlevsel bir deneyim oluşturabildim. Böylece gezinmek ve okumak daha rahattı:

Bölgeyi gösteren eski insan projesi
Bölgeleri İçeren, İnsanlara Yönelik Eski Proje.

Gösterim amacıyla, bu prototipte CSS Bölgelerini gösterme özelliğini ekledim. Aşağıdaki ekran görüntüsünde, bölgelerin bir grafiği çevreleyen sütunlar ve ortada bir alıntı tırnak işareti gibi bir görünüm verecek şekilde nasıl düzenlendiği gösterilmektedir:

Bölgeleri gösteren eski insan projesi
Bölgeleri gösteren, insanlara ait eski proje

Burada bu prototiple deneme yapabilirsiniz (ayrıca kaynak kodunu görüntüleyebilirsiniz). Gezinmek için ok tuşlarını kullanın ve bölgeleri görmek için Esc tuşuna basın. Daha önceki prototipleri de burada bulabilirsiniz.

Adlandırılmış Akış Oluşturma

Bir metin bloğunun bölgeler arasında akışını sağlamak için gereken CSS son derece basittir. Aşağıdaki snippet, "content" kimlikli bir div öğesine "article" adlı adlandırılmış bir akışı ve aynı "article" adlı akışı, "region" sınıfına sahip tüm öğelere atar. Sonuçta, "content" öğesi içinde yer alan metin, "region" (bölge) sınıfına sahip herhangi bir öğenin içinden otomatik olarak geçer.

<!DOCTYPE html>
<html>
<head>
    <style>
    #content {
        { % mixin flow-into: article; % }
    }

    .region {
        { % mixin flow-from: article; % }
        box-sizing: border-box;
        position: absolute;
        width: 200px;
        height: 200px;
        padding: 10px;
    }

    #box-a {
        border: 1px solid red;
        top: 10px;
        left: 10px;
    }

    #box-b {
        border: 1px solid green;
        top: 210px;
        left: 210px;
    }

    #box-c {
        border: 1px solid blue;
        top: 410px;
        left: 410px;
    }
    </style>
</head>
<body>
    <div id="box-a" class="region"></div>
    <div id="box-b" class="region"></div>
    <div id="box-c" class="region"></div>
    <div id="content">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent eleifend dapibus felis, a consectetur nisl aliquam at. Aliquam quam augue, molestie a scelerisque nec, accumsan non metus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin cursus euismod nisi, a egestas sem rhoncus eget. Mauris non tortor arcu. Pellentesque in odio at leo volutpat consequat....
    </div>
</body>
</html>

Sonuç şöyle görünür:

Yukarıdaki kodun sonucu
Yukarıdaki kodun sonucu

"İçerik" div öğesinin içindeki metnin, sunuluş hakkında herhangi bir bilgi içermediğini unutmayın. Başka bir deyişle, farklı bölgelerden geçerken bile tamamen anlamsal olarak korunabilir. Ayrıca, bölgeler sadece öğeler olduğundan, diğer öğeler gibi CSS kullanılarak konumlandırılır ve boyutlandırılırlar. Dolayısıyla, duyarlı tasarım ilkeleriyle mükemmel şekilde uyumludurlar. Öğeleri adlandırılmış bir akışın parçası olarak tanımlamak, belirtilen metnin bunların içinden otomatik olarak geçmesi anlamına gelir.

CSS Nesne Modeli

CSS Nesne Modeli veya CSSOM, CSS ile çalışmak için JavaScript API'lerini tanımlar. CSS bölgeleriyle ilgili yeni API'lerin listesi aşağıda verilmiştir:

  • document.webkitGetNamedFlows(): Dokümanda bulunan adlandırılmış akışların koleksiyonunu döndüren bir işlev.
  • document.webkitGetNamedFlows().namedItem("article"): Belirli bir adlandırılmış akışa başvuru döndüren işlev. Bağımsız değişken, flow-into ve from-from CSS özelliklerinin değeri olarak belirtilen ada karşılık gelir. Yukarıdaki kod snippet'inde belirtilen adlandırılmış akışa bir referans almak için "article" dizesini girersiniz.
  • WebKitNamedFlow: Adlandırılmış bir floe'nun aşağıdaki özellik ve işlevlere sahip nesne gösterimi:
    • firstEmptyRegionIndex: Adlandırılan akışla ilişkili ilk boş bölgenin dizinine işaret eden bir tam sayı değeri. Bölge koleksiyonunu nasıl edineceğinizi öğrenmek için aşağıdaki getRegions() konusuna bakın.
    • name: Akışın adını içeren bir dize değeri.
    • overset: Aşağıdaki durumda olan bir boole özelliği:
      • Adlandırılan akışın içeriği ilişkili bölgelere sığdığında false
      • İçerik sığmadığında ve içeriğin daha fazla bölgede barındırılması gerektiğinde true.
    • getContent(): Adlandırılmış akışa akan düğümlere başvuruları içeren bir koleksiyon döndüren işlev.
    • getRegions(): Adlandırılmış akışın içeriğini barındıran bölgelere başvurular içeren bir koleksiyon döndüren işlev.
    • getRegionsByContentNode(node): Belirtilen düğümü içeren bölgeye bir başvuru döndüren işlev. Bu, özellikle adlandırılmış bağlayıcılar gibi öğeler içeren bölgeleri bulmak için faydalıdır.
  • webkitregionoversetchange etkinliği. Bu etkinlik, ilişkili içeriğin düzeni herhangi bir nedenle (içerik eklendiğinde veya kaldırıldığında, yazı tipi boyutu değiştiğinde, bölgenin şekli değiştiğinde vb.) WebkitNamedFlow tetiklenir.ve bir bölgenin webkitRegionOverset özelliğinin değişmesine neden olur. Bu etkinlik, yaklaşık düzen değişikliklerini dinlemek için yararlıdır. Bu, önemli bir şeyin gerçekleştiğini ve düzenin dikkat edilmesi gerekebileceğini gösterir. Örneğin: Daha fazla bölge gerekli, bazı bölgeler boş olabilir vb.
  • webkitregionfragmentchange etkinliği. Bu düzenlemenin yapıldığı tarihte uygulanmamıştır. Bu etkinlik, ilişkilendirilmiş içeriğin düzeni webkitregionoversetchange ile benzer ancak webkitRegionOverset özelliklerindeki herhangi bir değişikliklerden bağımsız olarak herhangi bir nedenle her değiştiğinde bir WebkitNamedFlow etkinliğinde tetiklenir. Bu etkinlik, adlandırılmış akışın tüm düzenini etkilemek zorunda olmayan ayrıntılı düzen değişikliklerini dinlemek için yararlıdır. Örneğin: İçerik bir bölgeden diğerine taşınır ancak genel içerik tüm bölgelere sığmaya devam eder.
  • Element.webkitRegionOverset: Öğeler, flow-from CSS mülkü atandığında bölgelere dönüşür. Bu öğeler, adlandırılmış bir akışın parçasılarsa akıştaki içeriğin bölgede taşıp taşmadığını gösteren bir webkitRegionOverset özelliğine sahiptir. webkitRegionOverset değerleri:
    • Bölgenin barındırabileceğinden daha fazla içerik varsa "overflow"
    • içerik, bölge bitiminden önce duruyorsa "fit"
    • İçerik bölgeye ulaşmadıysa "boş"

CSSOM'nin birincil kullanımlarından biri, webkitregionoversetchange etkinliklerini dinlemek ve değişen miktarlardaki metne uyum sağlamak için dinamik olarak bölge eklemek veya kaldırmaktır. Örneğin, biçimlendirilecek metin miktarı öngörülemiyorsa (örneğin kullanıcı tarafından oluşturulmuş), tarayıcı penceresi yeniden boyutlandırıldıysa veya yazı tipi boyutu değişirse, akıştaki değişikliğe uyum sağlamak için bölge eklemek veya kaldırmak gerekebilir. Buna ek olarak, içeriğinizi sayfalar halinde düzenlemek istiyorsanız, bölgelerin yanı sıra DOM'yi dinamik olarak değiştirecek bir mekanizmaya ihtiyacınız olacaktır.

Aşağıdaki JavaScript kod snippet'i, gerektiğinde bölgeleri dinamik olarak eklemek için CSSOM'nin kullanımını göstermektedir. Kolaylık sağlaması açısından, bu komutun bölgeleri kaldırma veya bölgelerin boyut ve konumlarını tanımlamayla ilgili olmadığını, yalnızca gösterim amaçlı olduğunu unutmayın.

var flow = document.webkitGetNamedFlows().namedItem("article")
flow.addEventListener("webkitregionoversetchange", onLayoutUpdate);

function onLayoutUpdate(event) {
    var flow = event.target;
    
    // The content does not fit
    if (flow.overset === true) {
    addRegion();
    } else {
    regionLayoutComplete();
    }
}

function addRegion() {
    var region = document.createElement("div");
    region.style = "flow-from: article";
    document.body.appendChild(region);
}

function regionLayoutComplete() {
    // Finish up your layout.
}

CSS Bölgeleri örnekleri sayfasında daha fazla demo bulabilirsiniz.

CSS Sayfa Şablonları

CSSOM'den yararlanmak muhtemelen sayfalama ve duyarlı düzen gibi özellikleri uygulamanın en güçlü ve esnek yoludur. Ancak Adobe, metin ve masaüstü yayıncılık araçlarıyla tasarımcıların ve geliştiricilerin nispeten genel sayfa oluşturma özellikleri elde etmenin daha kolay bir yolunu isteyeceğini anlayacak kadar uzun süredir çalışıyor. Bu nedenle, sayfa oluşturma davranışının tamamen bildirime dayalı olarak tanımlanmasını sağlayan CSS Sayfa Şablonları adlı bir teklif üzerinde çalışıyoruz.

CSS Sayfa Şablonları'nın yaygın bir kullanım örneğini inceleyelim. Aşağıdaki kod snippet'i, adlandırılmış iki akış oluşturmak için CSS kullanımını gösterir: "makale akışı" ve "zaman çizelgesi-akış." Buna ek olarak, içinde iki akışın yer alacağı "birleşik makaleler" adlı üçüncü bir seçici tanımlar. overflow-style özelliğinin "birleşik makaleler" seçicisinin içine eklenmesi, içeriğin x ekseninde otomatik olarak veya yatay olarak sayfalandırılması gerektiğini belirtir:

<style>
    #article {
    { % mixin flow-into: article-flow; % }
    }

    #timeline {
    { % mixin flow-into: timeline-flow; % }
    }

    #combined-articles {
    overflow-style: paged-x;
    }
</style>

Akışlar tanımlandığına ve istenen taşma davranışı belirtildiğine göre artık sayfa şablonunun kendisini oluşturabiliriz:

@template {
    @slot left {
    width: 35%;
    float: left;
    { % mixin flow-from: article-flow; % }
    }

    @slot time {
    width: 25%;
    float: left;
    { % mixin flow-from: timeline-flow; % }
    }

    @slot right {
    width: 35%;
    float: left;
    { % mixin flow-from: article-flow; % }
    }
}

Sayfa şablonları, yeni "at" söz dizimi kullanılarak tanımlanır. Yukarıdaki kod snippet'inde, her biri bir sütuna karşılık gelen üç alan tanımlarız. "Makale akışı"ndan gelen metin, soldaki ve sağdaki sütunlardan geçer. "Zaman çizelgesi akışındaki" metin ise ortadaki sütunu doldurur. Sonuç şunun gibi görünebilir:

Sayfa şablonu örneği
Sayfa şablonu örneği

Makale metninin (sol ve sağ taraftaki sütunlardaki metin) İngilizce, ortadaki zaman çizelgesinin ise Almanca olduğuna dikkat edin. Ayrıca doküman, herhangi bir JavaScript koduna gerek kalmadan yatay olarak sayfalar halinde görüntülenir. CSS'de her şey bildirime dayalı bir şekilde gerçekleştirildi.

CSS Sayfa Şablonları hâlâ bir teklif olsa da bunlarla denemeler yapmanıza olanak tanımak için JavaScript "şim" (polyfill) kullanan bir prototipimiz bulunmaktadır.

CSS Bölgeleri hakkında genel olarak daha fazla bilgi edinmek için html.adobe.com adresindeki CSS Bölgeleri sayfasını inceleyin.

CSS Hariç Tutmaları

Gerçek dergi benzeri bir düzen oluşturmak için metnin bölgeler arasında akışı sağlayabilmek yeterli değildir. Yüksek kaliteli ve görsel olarak ilgi çekici masaüstü yayıncılığın kritik bir öğesi, anormal grafikler ve şekillerin etrafında veya içinde metin akışı sağlayabilme yeteneğidir. CSS hariç tutmaları, web'e bu düzeyde üretim kalitesi getiriyor.

Aşağıdaki ekran görüntüsü bir CSS Hariç Tutmaları prototipine aittir ve büyük bir kaya oluşumunun konturuyla eşleşen bir yolun çevresinde dinamik olarak akan metin göstermektedir:

CSS hariç tutmalarının işleyiş şekline örnek
CSS hariç tutmalarının işleyiş şekli örneği

Bunun tersi, bir sonraki ekran görüntüsünde gösterilmiştir: Düzensiz biçimli poligonların içine akan metin:

Düzensiz şekilli poligonlara akan metin
Düzenli olmayan poligonlara akan metin

Rastgele şekillerin etrafında veya içinde metin akışı yapabilmenin ilk adımı, gerekli algoritmaları geliştirmek ve optimize etmektir. Adobe, şu anda doğrudan WebKit'e katkıda bulunacak uygulamalar üzerinde çalışmaktadır. Bu algoritmalar optimize edildikten sonra, geri kalan CSS Hariç Tutmaları'nın temelini oluşturur.

CSS Hariç Tutmaları hakkında daha fazla bilgi için html.adobe.com adresindeki CSS Hariç Tutmaları sayfasını, Adobe'nin CSS Hariç Tutmaları için temel teknolojiye yönelik çalışmalarına daha ayrıntılı bir bakış için de Hans Muller'ın Yatay Kutu: CSS Hariç Tutmaları için Poligon Kesişimi başlıklı blog yayınına bakın.

CSS Bölgelerinin ve CSS Hariç Tutmalarının Mevcut Durumu

CSS Bölgeleri ve CSS Hariç Tutmaları hakkında herkese açık olarak ilk kez Google I/O 2011'deki Adobe Geliştirici Kapsülündeydim. O zamanlar kendi özel prototip tarayıcımızda demolar gösteriyordum. Algılanan karşılama son derece coşkuluydu ancak izleyiciler benim gösterdiğim işlevlerden hiçbirinin henüz hiçbir büyük tarayıcıda sunulmadığını fark ettiğinde gözle görülür bir hayal kırıklığı yaşadı.

Bu yıl (2012) yine Google I/O'ya katıldım. Bu kez Google'dan iş arkadaşım Vincent Hardy ve Alex Danilo ile birlikte sunuculuk yaptım (sunuyu buradan izleyebilirsiniz). Yalnızca bir yıl sonra, CSS Bölgeleri spesifikasyonunun yaklaşık% 80'i WebKit'e uygulandı ve Google Chrome'un en yeni sürümünde kullanıma sunuldu (CSS Bölgelerinin şu anda chrome://flags aracılığıyla etkinleştirilmesi gerektiğini unutmayın). CSS Bölgeleri için ön destek, Android için Chrome'da bile uygulanmaya başladı:

Android için Chrome&#39;daki bölgeler
Android için Chrome'daki bölgeler

Ayrıca, hem CSS Bölgeleri hem de CSS Hariç Tutmaları Internet Explorer 10 önizlemesinde uygulanır ve şu anda Mozilla'nın Firefox için 2012 yol haritasındadır. Safari'nin bir sonraki ana sürümü, CSS Bölgeleri spesifikasyonunun büyük kısmını destekler. Sonraki güncellemeler ise kalanını da içermelidir.

Aşağıda, Nisan 2011'de W3C'ye sunduğumuz ilk tekliften bu yana CSS Bölgeleri ve CSS Hariç Tutmaları konusunda kaydettiğimiz ilerlemenin ayrıntılı bir zaman çizelgesi verilmiştir:

Bölge ve Hariç Tutma İlerleme Durumu
Bölge ve Hariç Tutma İlerleme Durumu

Sonuç

Adobe; metin, yazı tipi ve genel olarak InTasarım gibi araçlarla masaüstü yayıncılık konusunda büyük bir deneyime sahiptir. Web zaten metin için çok güçlü bir platform olsa da, metin sunumunu daha da ileri taşımak için bilgimizi ve deneyimimizi kullanmak istiyoruz. CSS Bölgeleri ve CSS Hariç Tutmaları, içeriğin anlamsal yapıda kalmasını sağlarken dergi benzeri bir düzen ve sonuç olarak çok daha etkileyici bir web'i de mümkün kılıyor.