CSS Flexbox'ta neden “haklı göster maddeleri” ve “haklı göster” özellikleri yoktur?


677

Esnek bir kabın ana eksenini ve çapraz eksenini düşünün:

resim açıklamasını buraya girin                                                                                                                                                    Kaynak: W3C

Esnek öğeleri ana eksen boyunca hizalamak için bir özellik vardır:

Esnek öğeleri çapraz eksen boyunca hizalamak için üç özellik vardır:

Yukarıdaki görüntüde, ana eksen yatay ve çapraz eksen dikeydir. Bunlar bir esnek kabın varsayılan yönleridir.

Bununla birlikte, bu yönler flex-directionmülkle kolayca değiştirilebilir .

/* main axis is horizontal, cross axis is vertical */
flex-direction: row;
flex-direction: row-reverse;

/* main axis is vertical, cross axis is horizontal */    
flex-direction: column;
flex-direction: column-reverse;

(Çapraz eksen her zaman ana eksene diktir.)

Eksenlerin nasıl çalıştığını tarif etmemdeki amacım, her iki yönde de özel bir şey olmadığıdır. Ana eksen, çapraz eksen, ikisi de önem açısından eşittir flex-directionve ileri geri geçişi kolaylaştırır.

Öyleyse çapraz eksen neden iki ek hizalama özelliği alıyor?

Ana eksen için neden tek bir mülkte birleştirilir align-contentve align-itemsbirleştirilir?

Ana eksen neden bir justify-selfözellik almıyor ?


Bu özelliklerin yararlı olacağı senaryolar:

  • esnek kabın köşesine esnek bir eşya yerleştirme
    #box3 { align-self: flex-end; justify-self: flex-end; }

  • bir grup esnek öğeyi sağa hizala ( justify-content: flex-end) ancak ilk öğeyi sola hizala ( justify-self: flex-start)

    Bir grup gezinme öğesi ve bir logo içeren bir başlık bölümü düşünün. İle justify-selflogo nav ürün sağında kalırken sola hizalanmış ve farklı ekran boyutlarına sorunsuz her şey ayarlanabilece¤inden ( "esner") olabilir.

  • üç esnek öğeden oluşan bir satırda, orta öğeyi kabın ortasına ( justify-content: center) yapıştırın ve bitişik öğeleri kap kenarlarına ( justify-self: flex-startve justify-self: flex-end) hizalayın .

    Bitişik öğeler farklı genişliklere sahipse, değerler space-aroundve space-betweenon justify-contentözelliğinin orta öğeyi kap etrafında ortalamayacağını unutmayın.

jsFiddle sürümü


Bu yazı gibi, hiç söz yoktur justify-selfya justify-itemsiçinde FlexBox spec .

Bununla birlikte, W3C'nin tüm kutu modellerinde kullanılmak üzere ortak bir hizalama özellikleri seti oluşturmak için tamamlanmamış önerisi olan CSS Kutusu Hizalama Modülünde , aşağıdakiler vardır:

resim açıklamasını buraya girin                                                                                                                                                    Kaynak: W3C

Bunu fark edeceksiniz justify-selfve justify-itemsdüşünülüyor ... ama flexbox için değil .


Ana soruyu tekrarlayarak bitireceğim:

Neden "bloklama ögeleri" ve "bloklama-kendi kendine" özellikleri yoktur?


4
justify-selfEsnek bir ürün için nasıl çalışmayı beklersiniz ? Etrafında dağıtmak için ekstra alana sahip a, b, c, d öğeleriniz olduğunu ve esnek kabın olduğunu varsayalım justify-content: space-between, böylece | abcd | justify-self: centerOradaki 'b' öğesine örneğin `` justify-self: flex-end`'i eklemek ne anlama gelir ? Nereye gitmesini beklersiniz? (Buradaki yanıtlardan birinde bazı demolar görüyorum, ancak genel olarak işe yarayacağına dair net bir yol göremiyorum.)
dholbert

(Alternatif olarak: varsayalım justify-content: flex-start, bu yüzden öğeler başlangıçta | abcd | gibi kalabalıktır. justify-self: [anything]'B' öğesini oraya
koyarsanız ne yapmasını beklersiniz

1
@dholbert, şunu yazdınız: Esnek bir ürün için nasıl justify-selfçalışmayı beklersiniz ? autoEsnek kalemler üzerinde zaten marjlardan çok farklı değil diyebilirim . İkinci örneğinizde, justify-self: flex-endd öğesinde onu uzak kenara taşır. Bu, kendi içinde, automarjların zaten yapabileceği harika bir özellik olurdu . Bir gösteri ile bir cevap gönderdim.
Michael Benjamin

2
Çoğunlukla burada daha fazla kullanım durumu görüyorum ve kullanım durumları harika - ama zor bit, bunu gerçek şekilde nasıl giydiğini justify-contentve justify-selfbelirtildiği gibi, böylece çatışma içeren vakalar (sorduğum senaryolar gibi) açıkça ve mantıklı bir şekilde tanımlanmıştır. Burada cevabımda belirttiğim gibi , değerden bağımsız olarak boyutlandırılan daha büyük bir kutudaki{justify|align}-self öğeleri hizalamakla ilgilidir - ve ana eksende, esnek bir öğenin hizalanması için böyle bir kutu yoktur. {justify|align}-self
dholbert

1
RE "otomatik marjlardan farklı değil" - Aslında , (ortaya koyduğum senaryolar gibi) çatıştıkları durumlarda nasıl hayal ettiğinizi justify-selfve justify-contentetkileşime gireceğinizi soruyordum . Otomatik kenar boşlukları hiçbir şekilde etkileşime girmezjustify-content - justify-contentkullanma şansı elde etmeden önce tüm ambalaj alanını çalarlar . Dolayısıyla, otomatik marjlar bunun nasıl çalışacağı konusunda gerçekten iyi bir analog değildir.
dholbert

Yanıtlar:


1252

Esnek Öğeleri Ana Eksen Boyunca Hizalama Yöntemleri

Soruda belirtildiği gibi:

Esnek öğeleri ana eksen boyunca hizalamak için bir özellik vardır: justify-content

Çapraz eksen boyunca hizalamak esnek öğeler için orada üç özellikler şunlardır: align-content, align-itemsvealign-self .

Soru daha sonra şunu sorar:

Neden hayır justify-itemsve justify-selfözellikler var?

Bir cevap şunlar olabilir: Çünkü gerekli değiller.

FlexBox özellikleri sağlar iki ana eksen boyunca esnek ürün hizalanması için yöntemler:

  1. justify-contentAnahtar kelime özelliğinin ve
  2. auto marjlar

haklı-content

justify-contentMülkiyet hizalar esnek kabın ana eksen boyunca öğeleri esnetin.

Esnek konteynere uygulanır, ancak sadece esnek maddeleri etkiler.

Beş hizalama seçeneği vardır:

  • flex-start ~ Esnek eşyalar hattın başına doğru paketlenir.

    resim açıklamasını buraya girin

  • flex-end ~ Esnek eşyalar hattın sonuna doğru paketlenir.

    resim açıklamasını buraya girin

  • center ~ Esnek eşyalar hattın merkezine doğru paketlenir.

    resim açıklamasını buraya girin

  • space-between• Esnek öğeler, ilk öğe kabın bir kenarına ve son öğe karşı kenara hizalanacak şekilde eşit aralıklarla yerleştirilir. İlk ve son öğeye kullandığı kenarları bağlıdır flex-directionve yazma modunda ( ltrveya rtl).

    resim açıklamasını buraya girin

  • space-around~ space-betweenHer iki uçtaki yarım boyutlu boşluklar hariç.

    resim açıklamasını buraya girin


Otomatik Kenar Boşlukları

İle automarjlar , esnek ürün, merkezli uzak aralıklı veya alt gruba paketlenmiş olabilir.

justify-contentEsnek konteynere uygulananın aksine , automarjlar esnek ürünlere gider.

Belirtilen yönde tüm boş alanları tüketerek çalışırlar.


Esnek öğe grubunu sağa, ancak ilk öğe sola hizala

Sorudan senaryo:

  • bir grup esnek öğeyi sağa hizala ( justify-content: flex-end) ancak ilk öğeyi sola hizala ( justify-self: flex-start)

    Bir grup gezinme öğesi ve bir logo içeren bir başlık bölümü düşünün. İle justify-selflogo nav ürün sağında kalırken sola hizalanmış ve farklı ekran boyutlarına sorunsuz her şey ayarlanabilece¤inden ( "esner") olabilir.

resim açıklamasını buraya girin

resim açıklamasını buraya girin


Diğer faydalı senaryolar:

resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin


Köşeye esnek bir öğe yerleştirin

Sorudan senaryo:

  • köşeye esnek bir eşya yerleştirme .box { align-self: flex-end; justify-self: flex-end; }

resim açıklamasını buraya girin


Esnek bir öğeyi dikey ve yatay olarak ortalayın

resim açıklamasını buraya girin

margin: autoBir alternatif olan justify-content: centerve align-items: center.

Esnek kaptaki bu kod yerine:

.container {
    justify-content: center;
    align-items: center;
}

Bunu flex öğesinde kullanabilirsiniz:

.box56 {
    margin: auto;
}

Bu alternatif, kabı taşan esnek bir öğeyi ortalarken yararlıdır .


Bir esnek öğeyi ortalayın ve ikinci bir esnek öğeyi ilk ve kenar arasında ortalayın

Esnek bir kap, boş alanları dağıtarak esnek öğeleri hizalar.

Bu nedenle, eşit bir denge oluşturmak için, bir orta öğenin yanında tek bir öğeyle birlikte ortalanabilmesi için bir karşı denge sunulmalıdır.

Aşağıdaki örneklerde, "gerçek" öğeleri (kutu 63 ve 66) dengelemek için görünmez üçüncü esnek kalemler (kutular 61 ve 68) tanıtılmaktadır.

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Tabii ki, bu yöntem anlambilim açısından harika bir şey değildir.

Alternatif olarak, gerçek bir DOM öğesi yerine bir sözde öğe kullanabilirsiniz. Veya mutlak konumlandırma kullanabilirsiniz. Üç yöntemin tümü burada ele alınmıştır: Esnek öğeleri ortala ve alta hizala

NOT: Yukarıdaki örnekler, yalnızca en dıştaki öğeler eşit yükseklik / genişlik olduğunda gerçek merkezleme açısından çalışır. Esnek öğeler farklı uzunluklarda olduğunda, bir sonraki örneğe bakın.


Bitişik öğelerin boyutu değiştiğinde esnek bir öğeyi ortalayın

Sorudan senaryo:

  • üç esnek öğeden oluşan bir satırda, orta öğeyi kabın ortasına ( justify-content: center) yapıştırın ve bitişik öğeleri kap kenarlarına ( justify-self: flex-startve justify-self: flex-end) hizalayın .

    Değerleri bu Not space-aroundve space-betweenüzerinde justify-contentbitişik öğeleri farklı genişlikleri (varsa mülkiyet orta öğeyi tutmayacaktır konteyner ile ilgili olarak merkezli demo bakınız ).

Belirtildiği gibi, tüm esnek öğeler eşit genişliğe veya yüksekliğe (bağlı olarak flex-direction) sahip olmadıkça , orta öğe tam olarak ortalanamaz. Bu sorun, bir justify-selfmülk için güçlü bir durum oluşturur (elbette görevi yerine getirmek için tasarlanmıştır).

İşte bu sorunu çözmek için iki yöntem:

Çözüm # 1: Mutlak Konumlandırma

Flexbox spec esnek öğelerin mutlak konumlandırılmasını sağlar . Bu, orta öğenin kardeşlerinin boyutundan bağımsız olarak mükemmel bir şekilde merkezlenmesini sağlar.

Kesinlikle konumlandırılmış tüm öğeler gibi, öğelerin de belge akışından kaldırıldığını unutmayın . Bu, kapta yer kaplamaz ve kardeşlerini üst üste binebilecekleri anlamına gelir.

Aşağıdaki örneklerde, orta öğe mutlak konumlandırma ile ortalanmıştır ve dış öğeler akış halinde kalır. Ancak aynı düzen ters yönde de elde edilebilir: Orta öğeyi justify-content: centerdış öğelerle ortalayın ve kesinlikle konumlandırın.

resim açıklamasını buraya girin

Çözüm # 2: İç içe Esnek Konteynerler (mutlak konumlandırma yok)

.container {
  display: flex;
}
.box {
  flex: 1;
  display: flex;
  justify-content: center;
}
.box71 > span { margin-right: auto; }
.box73 > span { margin-left: auto;  }

/* non-essential */
.box {
  align-items: center;
  border: 1px solid #ccc;
  background-color: lightgreen;
  height: 40px;
}
<div class="container">
  <div class="box box71"><span>71 short</span></div>
  <div class="box box72"><span>72 centered</span></div>
  <div class="box box73"><span>73 loooooooooooooooong</span></div>
</div>

Şöyle çalışır:

  • Üst düzey div ( .container) esnek bir kaptır.
  • Her alt div ( .box) şimdi esnek bir öğedir.
  • Her .boxmadde flex: 1konteyner alanını eşit dağıtmak için verilmiştir .
  • Şimdi öğeler sıradaki tüm alanı tüketiyor ve eşit genişlikte.
  • Her öğeyi (iç içe) esnek bir kap yapın ve ekleyin justify-content: center.
  • Şimdi her spanöğe ortalanmış bir esnek öğedir.
  • autoDış spantarafları sola ve sağa kaydırmak için esnek kenar boşluklarını kullanın .

Ayrıca, yalnızca kenar boşluklarını kaldırabilir justify-contentve kullanabilirsiniz auto.

Ancak justify-contentburada çalışabilir, çünkü autokenar boşlukları her zaman önceliğe sahiptir. Spec'ten:

8.1. auto Kenar boşluklarıyla hizalama

İle hizalanabilmektedir önce justify-contentve align-selfherhangi bir pozitif serbest alanının boyutunun otomatik kenar dağıtılır.


justify-content: space-same (kavram)

justify-contentBir dakika geri dönersek, bir seçenek daha için bir fikir.

  • space-same~ Bir hibrit space-betweenve space-around. Esnek öğeler eşit aralıklarla yerleştirilir (gibi space-between), her iki uçta yarım boyutlu boşluklar (gibi ) dışında her iki uçta space-aroundda tam boyutlu boşluklar bulunur.

Bu düzen esnek kap üzerinde ::beforeve ::aftersözde elemanlarla elde edilebilir .

resim açıklamasını buraya girin

(kredi: kod için @oriol ve etiket için @crl )

GÜNCELLEME: Tarayıcılar space-evenly, yukarıda belirtilenleri gerçekleştirmeye başlamışlardır . Ayrıntılar için bu gönderiye bakın: Esnek öğeler arasında eşit boşluk


PLAYGROUND (yukarıdaki tüm örnekler için kod içerir)


1
Kapakları Yukarıdaki yanıtın ana ekseni , justify-contentve automarjlar. Madalyonun diğer tarafında İçin - çapraz eksen , align-items, align-selfve align-content- bu yayını bakın: stackoverflow.com/q/42613359/3597276
Michael Benjamin

4
@MarkW, justify-selfmülk için dava açıyorsunuz ... autokenar boşlukları yardımcı olur, ancak justify-self: centerideal olur. Sunulan sorunu çözmenin yolu, karşı tarafta görünmez yinelenen öğeler oluşturmak olacaktır. Cevabımı burada görebilirsiniz: stackoverflow.com/q/38948102/3597276
Michael Benjamin

5
Sizin space-samekavram şimdi gerçek şeydir. Deniyor space-evenly, ancak yalnızca şu anda Firefox tarafından desteklenen: developer.mozilla.org/en-US/docs/Web/CSS/justify-content
benface

1
@benface, Evet, haklısın. Bunu işaret ettiğiniz için teşekkürler. Aslında space-evenlydiğer cevaplarda yazıyorum : stackoverflow.com/q/45134400/3597276
Michael Benjamin

1
Aslında, space-evenly oldu ama sadece Izgara düzeni için, Chrome 57-60 desteklenen. Düzeltilen bir hataydı ve Chrome 61'den bu yana Flexbox için de destekleniyor. Ayrıca, sözde elemanları olmadan taklit yolu vardır: .item { margin-right: auto } .item:first-child { margin-left: auto }.
Ilya Streltsyn

155

Bunun bir cevap olmadığını biliyorum, ama bu konunun değerine katkıda bulunmak istiyorum. justify-selfFlexbox'ı gerçekten esnek hale getirmek için serbest bırakabilirlerse harika olurdu .

Eksene göre, eksen üzerinde birden fazla öğe olduğunda, justify-selfdavranmanın en mantıklı yolu, kendisini aşağıda gösterildiği gibi en yakın komşularına (veya kenarına) hizalamaktır.

Umarım W3C bunu fark eder ve en azından dikkate alır. =)

resim açıklamasını buraya girin

Bu şekilde, sol ve sağ kutunun boyutundan bağımsız olarak gerçekten ortalanmış bir öğeye sahip olabilirsiniz. Kutulardan biri orta kutunun noktasına ulaştığında dağıtılacak yer kalmayıncaya kadar itecektir.

resim açıklamasını buraya girin

Harika düzenler yapmanın kolaylığı sonsuzdur, bu "karmaşık" örneğe bir göz atın.

resim açıklamasını buraya girin


12
@ Bu inanılmaz! Bunu hazırlamak için zaman ayırdığınız için teşekkür ederiz. Umarım umursamıyorsun ama buraya gönderdim: discourse.wicg.io/t/flexbox-justify-self-property/1146
Zaqx

1
@Zaqx, daha fazla pozlama daha iyi. Cidden bu gerçeği yapmanın bir yolunu bulacaklarını umuyorum, bu konuda ellerimi kirletmek isterdim.
Mark

1
Merhaba Mark, @Zaqx, bu cevapta belirtilen bazı kullanım durumlarını kapsayabilecek bir cevap gönderdim. Ben hala bir çok şey gerek kalmadan ana eksende yapılabileceğini keşfettim justify-selfve justify-items.
Michael Benjamin

3
@Michael_B Flexbox hakkında daha fazla şey öğrendiğinize ve notlarınızı bir yanıt olarak biçimlendirmek için zaman ayırdığınıza teşekkür ederiz. Margin: auto gerçekten harika (flexbox spec'in 2009 ve 2012 sürümlerini uygulayan tarayıcıların, bir üretim sitesinde kullanma yeteneğini önemli ölçüde azaltan eşdeğer bir özelliği olmadığını göreceksiniz). Bununla birlikte, kenar boşluğu: auto özelliğini destekleyen tarayıcılarda bile, alan varken konteynerine göre ortalanan bir öğenin ana kullanım durumu, bir justify-self özelliği veya benzeri olmadan hala imkansızdır.
Zaqx

1
@Zaqx, geri bildiriminiz için teşekkürler. Ve evet, sana katılıyorum, automarjlar tam bir ikame değil justify-self. Önceki autoyorumumu, marjların bazı kullanım senaryolarını kapsayacağını söyleyerek söylemeye dikkat ettim . Belirttiğiniz gibi, bitişik öğeler farklı boyutlarda olduğunda bir öğeyi yerinde ortalayamaz. Ancak, esnek öğelerin hizalanması için daha fazla seçenek sunar. Flexbox'ı ilk öğrenmeye başladığımda justify-contenttek yolun görünmez ve görünmez aralayıcı öğeleri olduğunu düşündüm .
Michael Benjamin

20

Bu www-stil listesinde soruldu ve Tab Atkins (spec editörü) nedenini açıklayan bir cevap verdi . Burada biraz ayrıntıya gireceğim.

Başlamak için, başlangıçta esnek kabımızın tek satır ( flex-wrap: nowrap) olduğunu varsayalım . Bu durumda, ana eksen ile çapraz eksen arasında açıkça bir hizalama farkı vardır - ana eksende istiflenmiş birden fazla öğe vardır, ancak çapraz eksende yalnızca bir öğe istiflenir. Bu nedenle, çapraz eksende öğe başına özelleştirilebilir bir "hizala-kendini" olması mantıklıdır (her öğe ayrı ayrı, kendi kendine hizalandığı için), ancak ana eksende (oradan, öğeler toplu olarak hizalanır).

Çok satırlı esnek kutu için, aynı mantık her "esnek hat" için geçerlidir. Belirli bir satırda, öğeler ana eksende topluca çapraz eksende (çapraz eksende her satırda yalnızca bir öğe olduğundan) tek tek hizalanır.


İşte phrasing başka yolu: böylece, bütün bir *-selfve *-contentözellikleri şeylerin etrafında fazladan alan dağıtma hakkında bulunmaktadır. Ama önemli fark olduğunu *-selfversiyonları var durumlarda içindir o eksende sadece tek şey , ve *-contentversiyonları potansiyel varken içindir o eksende pek çok şey . Tek şey ve çok şey senaryoları farklı sorun türleridir ve bu nedenle farklı seçenek türlerine sahiptirler - örneğin, space-around/ space-betweendeğerleri mantıklıdır *-content, ancak değil *-self.

SO: Bir flexbox'ın ana ekseninde, etrafa alan dağıtacak birçok şey var. Yani bir *-contentmülk orada anlamlıdır, ama bir *-selfmülk değildir .

Buna karşılık, çapraz eksende, biz a ikisine de sahip *-selfve bir *-contentözellik. Bir çok alanı nasıl dağıtacağımızı belirler esnek çizginin ( align-content) align-selfetrafına nasıl dağıtacağımızı belirler , diğeri ( ) ise belirli bir esnek çizgide çapraz eksendeki münferit esnek nesnelerin etrafındaki boşluğun nasıl dağıtılacağını belirler .

( *-itemsBurada varsayılanları yok saydığım için özellikleri görmezden geliyorum *-self.)


1
justify-selfBir öğenin aksine, birden çok öğenin bulunduğu bir eksende nasıl bir sorun olabileceğini anlıyorum . Bununla birlikte, umarım bu konuya daha fazla bakacaklardır, birden fazla maddede nasıl justify-selfdavranırlar, çünkü bunun gerçekten yararlı olabileceği bazı durumlar vardır. Örneğin ( stackoverflow.com/questions/32378953/… ).
Mark

Bu posta listesinde güzel bulmak. Kafamı etrafına sarmaya çalışıyorum, çünkü hala iyi kullanım örneği olasılıkları görüyorum justify-self.
Michael Benjamin

Ben nasıl açıklayan, biraz daha açıklamalar ekledik *-selfbiz sadece sahip vakaların yaklaşık bir halbuki fazla uyum sağlamaya şey *-contentsahip olduğumuz durumlarda ilgili birçok hizada şeyler. Bu biraz daha net mi?
dholbert

Evet, daha açık. Açıklamayı takdir ediyorum. Ama görünüşe göre hepsi, mantığa dayalı özel bir ihtiyaç değil, spec yazarları tarafından basit bir tercihe bağlı. Başvuruda bulunduğunuz posta listesinden : * -self özellikleri yalnızca alt öğe bu eksende yalnızsa çalışır. Neden? Buna ihtiyaç yok gibi görünüyor. Bu keyfi bir karardır. Bir tercih. Aslında, autospesifikasyonun bir parçası olan kenar boşlukları, satırdaki birden çok öğeyle * -kendi hizalamayı etkinleştirir. Anahtar kelime özelliklerinin de neden kullanılamadığının açık bir nedeni yok.
Michael Benjamin

1

Bunun flexbox kullanmadığını biliyorum, ancak üç öğenin basit kullanımı için (biri solda, biri merkezde, biri sağda), bu display: gridebeveyn grid-area: 1/1/1/1;üzerinde, çocuklarda ve justify-selfkonumlandırmada kolayca yapılabilir bu çocukların.

<div style="border: 1px solid red; display: grid; width: 100px; height: 25px;">
  <div style="border: 1px solid blue; width: 25px; grid-area: 1/1/1/1; justify-self: left;"></div>
  <div style="border: 1px solid blue; width: 25px; grid-area: 1/1/1/1; justify-self: center;"></div>
  <div style="border: 1px solid blue; width: 25px; grid-area: 1/1/1/1; justify-self: right;"></div>
</div>


Cevabınız için teşekkürler, ancak soruyu gerçekten ele almıyor. Ayrıca, düzen gerçekleştirmek için daha basit bir yolu var: jsfiddle.net/fga89m2o
Michael Benjamin

0

Bu soruna ya da en azından sorunuma kendi çözümümü buldum.
Onun justify-content: space-aroundyerine kullanıyordum justify-content: space-between;.

Bu şekilde uç elemanlar üste ve alta yapışır ve isterseniz özel kenar boşluklarınız olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.