Chrome 65'teki yeni olanaklar
CSS Paint API ("CSS Özel Boya" veya "Houdini'nin boyama işleti" olarak da bilinir) varsayılan olarak etkinleştirilmiştir. Bu nedir? Yapabilecekleriniz var mı? Peki, YouTube Create'in işleyişi nasıldır? O zaman okumaya devam edin...
CSS Paint API, bir CSS kodu her çalıştırıldığında programlı bir şekilde resim
mülk bir resim bekler. background-image
veya border-image
gibi mülkler
genellikle resim dosyası yüklemek için url()
veya yerleşik CSS ile kullanılır
linear-gradient()
gibi çalışır. Bunları kullanmak yerine artık
Boya iş ortağına referans vermek için paint(myPainter)
.
Boyama çalışma alanı yazma
myPainter
adlı bir boyama işçisi tanımlamak için bir CSS boyaması yüklememiz gerekiyor
Worklet dosyanıza CSS.paintWorklet.addModule('my-paint-worklet.js')
yazın. Bu
dosyasını kullanarak bir boya işleti sınıfı kaydetmek için registerPaint
işlevini kullanabiliriz:
class MyPainter {
paint(ctx, geometry, properties) {
// ...
}
}
registerPaint('myPainter', MyPainter);
paint()
geri çağırmasında ctx
öğesini tıpkı bir
<canvas>
itibarıyla CanvasRenderingContext2D
. Nasıl yapıldığını biliyorsanız
<canvas>
içine çiziyorsanız boyama işliğinde çizim yapabilirsiniz! geometry
bize şunu bildirir:
yüksekliğini ve genişliğine göre değişiklik gösterir. properties
Yapacağım
bu makalenin ilerleyen kısımlarında açıklayacağım.
Giriş örneği olarak, bir dama tahtası boyama çalışma alanı yazalım ve
<textarea>
öğesinin arka plan resmi olarak. (Bir metin alanı kullanıyorum çünkü
varsayılan olarak yeniden boyutlandırılabilir):
<!-- index.html -->
<!doctype html>
<style>
textarea {
background-image: paint(checkerboard);
}
</style>
<textarea></textarea>
<script>
CSS.paintWorklet.addModule('checkerboard.js');
</script>
// checkerboard.js
class CheckerboardPainter {
paint(ctx, geom, properties) {
// Use `ctx` as if it was a normal canvas
const colors = ['red', 'green', 'blue'];
const size = 32;
for(let y = 0; y < geom.height/size; y++) {
for(let x = 0; x < geom.width/size; x++) {
const color = colors[(x + y) % colors.length];
ctx.beginPath();
ctx.fillStyle = color;
ctx.rect(x * size, y * size, size, size);
ctx.fill();
}
}
}
}
// Register our class under a specific name
registerPaint('checkerboard', CheckerboardPainter);
Geçmişte <canvas>
kullandıysanız bu kod size tanıdık gelecektir. Görüntüleyin
canlı
demo
burayı tıklayın.
Burada yaygın olarak kullanılan bir arka plan resmi kullanmanın farkı, desenin kullanıcı metin alanını yeniden boyutlandırdığında istek üzerine yeniden çizilir. Bunun anlamı şudur: arka plan resmi de dahil her zaman olması gerektiği kadar yüksek yoğunluklu ekranlar için dengeleme alır.
Bu gerçekten çok güzel bir şey ama aynı zamanda oldukça durağan. Yeni bir e-posta mı yazacak, farklı boyutlarda, aynı deseni ve farklı boyutlarda kareler var mı? Yanıtım hayır.
İş akışınızı parametre haline getirme
Neyse ki, boyama iş akışı diğer CSS özelliklerine erişebilir.
properties
ek parametresi devreye girer. Sınıfa statik bir
inputProperties
özelliği için herhangi bir CSS mülkünde yapılan değişikliklere abone olabilirsiniz,
özel özellikler dahil. Değerler size
properties
parametresinden yararlanın.
<!-- index.html -->
<!doctype html>
<style>
textarea {
/* The paint worklet subscribes to changes of these custom properties. */
--checkerboard-spacing: 10;
--checkerboard-size: 32;
background-image: paint(checkerboard);
}
</style>
<textarea></textarea>
<script>
CSS.paintWorklet.addModule('checkerboard.js');
</script>
// checkerboard.js
class CheckerboardPainter {
// inputProperties returns a list of CSS properties that this paint function gets access to
static get inputProperties() { return ['--checkerboard-spacing', '--checkerboard-size']; }
paint(ctx, geom, properties) {
// Paint worklet uses CSS Typed OM to model the input values.
// As of now, they are mostly wrappers around strings,
// but will be augmented to hold more accessible data over time.
const size = parseInt(properties.get('--checkerboard-size').toString());
const spacing = parseInt(properties.get('--checkerboard-spacing').toString());
const colors = ['red', 'green', 'blue'];
for(let y = 0; y < geom.height/size; y++) {
for(let x = 0; x < geom.width/size; x++) {
ctx.fillStyle = colors[(x + y) % colors.length];
ctx.beginPath();
ctx.rect(x*(size + spacing), y*(size + spacing), size, size);
ctx.fill();
}
}
}
}
registerPaint('checkerboard', CheckerboardPainter);
Artık aynı kodu tüm farklı dama tahtaları için kullanabiliriz. Ama hatta Artık Geliştirici Araçları'na gidip değerlerle uğraşabiliriz. kadar kolaylaşır.
Boyama iş uygulamasını desteklemeyen tarayıcılar
Yazma sırasında yalnızca Chrome'da boyama iş uygulaması bulunuyordu. Oradayken diğer tüm tarayıcı tedarikçilerinden gelen olumlu sinyaller olmasına rağmen fazla bir ilerleme yok. Güncel bilgilerden haberdar olmak için Is Houdini More Ready? (Houdini Henüz Hazır mı?) başlıklı makaleyi inceleyin. gerekir. Bu arada, mutlaka test etmek için boya için destek olmasa bile kodunuzun çalışmaya devam etmesini sağlayacak geliştirme yapabilirsiniz. İşlerin beklendiği gibi çalışmasını sağlamak için kodunuzu şu iki yer vardır: CSS ve JS.
JS'deki boyama işliği desteği, CSS
nesnesi kontrol edilerek yapılabilir:
js
if ('paintWorklet' in CSS) {
CSS.paintWorklet.addModule('mystuff.js');
}
CSS tarafında iki seçeneğiniz vardır. @supports
aşağıdakileri kullanabilirsiniz:
@supports (background: paint(id)) {
/* ... */
}
Daha basit bir yöntem de CSS'nin geçersiz hale gelmesi ve bunun sonucunda bilinmeyen bir işlev içeriyorsa özellik bildiriminin tamamını yoksayar. Eğer bir özelliği iki kez belirtirsiniz: İlk önce boyama işsizi, sonra da ilerlemeyi artırırsınız:
textarea {
background-image: linear-gradient(0, red, blue);
background-image: paint(myGradient, red, blue);
}
Boya işçisi desteği olan tarayıcılarda
background-image
ilkinin üzerine yazacak. Desteklenmeyen tarayıcılarda
ikinci beyan geçersiz olduğu için silinecek.
yürürlükte kalmaya devam eder.
CSS Boya Polyfilli
Birçok kullanım alanında, CSS Boya Polyfilli, , modern tarayıcılara CSS Özel Boyama ve Boyama İş Akışı desteği ekler.
Kullanım alanları
Boya işçiliklerinin birçok kullanım alanı vardır. Bunların bazıları
diğerleri. Bunlardan biri, boyutu küçültmek için boya işçisi kullanmaktır.
bir e-posta alırsınız. Çoğu zaman öğeler sadece süslemeler oluşturmak için eklenir
kullanabilirsiniz. Örneğin, Materyal Tasarım Lite'taki düğme
uygulamak için ek 2 <span>
öğesi içerir.
arındırılmasını sağlar. Çok sayıda düğmeniz varsa bu sayı oldukça fazla olabilir.
mobil cihazlarda performansın düşmesine yol açabilir. Şu durumda:
boya iş akışını kullanarak dalga efektini uygulama
bunun yerine, 0 ek öğe ve yalnızca bir boyama işliğiniz olur.
Ayrıca, özelleştirilmesi çok daha kolay olan bir
parametre haline getirecektir.
Boya iş uygulamasını kullanmanın bir başka iyi tarafı da, çoğu senaryoda, çözümün boyutu, bayt cinsinden küçüktür. Tabii ki bir de sağlayan bir tekliftir. Boya kodunuz, kanvasın boyutu veya parametresi değişir. Kodunuz karmaşıksa ve uzun sürüyorsa tuhaf. Chrome, boya iş akışlarını ana iş parçacığının dışına taşımaya Hatta uzun süreli boya işçileri bile ana makinenin yanıt verme hızını ileti dizisi.
Bana göre en heyecan verici beklenti, boya iş akışının verimli bir şekilde bir tarayıcının henüz sahip olmadığı CSS özelliklerinin çoklu doldurma işlemi. Mesela şöyle bir örnek verebiliriz: kadar konik gradyanları çoklu dolduracak şekilde yerel olarak Chrome'a geliyorlar. Başka bir örnek: Bir CSS toplantısında artık birden çok kenarlık renginiz olabileceğine karar verdi. Bu toplantıda Devam ediyor. İş arkadaşım Ian Kilpatrick bu yeni CSS için çoklu dolgu yazdı davranışını daha iyi anlamanızı sağlar.
"Kalıpların" dışında düşünme
Çoğu kullanıcı arka plan resimleri ve kenarlık resimleri üzerine düşünmeye
hakkında bilgi edineceğiz. Boya işletimi için daha az sezgisel kullanımlardan biri
DOM öğelerinin rastgele şekillere sahip olmasını sağlamak için mask-image
. Örneğin bir
elmas:
mask-image
, öğenin boyutuyla aynı boyutta bir resim çeker.
maske resmi şeffaf, öğe de şeffaf. Maskenin bulunduğu bölgeler
resim opak, öğe opak.
Artık Chrome'da
Boya çalışma alanı bir süredir Chrome Canary'de bulunuyor. Chrome 65'te varsayılan olarak etkindir. Devam edin ve yeni olasılıkları deneyin sonra ne yaptığınızı gösterin. Daha fazla ilham almak için Vincent De Oliveira'nın koleksiyonuna göz atın.