CSS3 kutu boyutlandırma: kenar boşluğu kutusu; Neden olmasın?


139

Neden yok box-sizing: margin-box;? Genellikle box-sizing: border-box;stil sayfalarımıza koyduğumuzda gerçekten eskisini kastediyoruz.


Misal:

Diyelim ki 2 sütunlu bir sayfa düzenim var. Her iki sütunun genişliği% 50'dir, ancak çirkin görünürler çünkü oluk yoktur (ortadaki boşluk); CSS aşağıdadır:

.col2 {
    width: 50%;
    float: left;
}


Bir oluk uygulamak için 2 sütunun ilkinde doğru bir kenar boşluğu belirleyebileceğimizi düşünebilirsiniz; böyle bir şey:

.col2:first-child {
    margin-right: 24px;
}

Ancak bu, ikinci sütunun yeni bir satıra sarılmasını sağlar, çünkü aşağıdakiler doğrudur:

50% + 50% + 24px > 100%

box-sizing: margin-box;öğenin hesaplanan genişliğine kenar boşluğu ekleyerek bu sorunu çözer. Daha yararlı olmasaydı bunu çok yararlı bulurdum box-sizing: border-box;.


30
"Neden yok box-sizing: margin-box;?" Çünkü yatay kenar boşlukları çökmezken, böyle bir öneri dikey kenar çöküşünü ciddi şekilde etkileyecektir. Her neyse, standartlaştırma için bir şey önermek istiyorsanız, Stack Overflow doğru yer değil. Posta listelerini deneyin.
BoltClock

16
Belirli durumlarda, border: xxx solid transparent;kenarlık dahil edildiğinden, bunu kullanarak etrafta gezinebilirsiniz border-box. Bu gibi bazı şeyleri kıracak box-shadow.
Nathan Osman

28
Standartlarla ilgili tüm soruları şimdi "yapıcı olmayan" olarak mı kapatacağız? Sormak adil bir soru ve hatta basit bir cevabı bile var: sahip değiliz box-sizing: margin-boxçünkü marj-çöküşü ile çalışmayacaktı.
thomasrutter

@thomasrutter: Kapattığımda bir yıldan fazla bir süre önce bunun daha iyi ifade edilmiş bir nedeni yoktu. Her neyse, "yapıcı değil" artık gitti (yani hayır, aslında yapıcı olmayan hiçbir şeyi artık kapatmıyoruz) ve "Bütün bir fikrim var, işte böyle çalışıyor, bunu standart yapalım!" son kapatılmasından bu yana kaldırılan şey aslında pratik bir "X neden çalışmıyor?" soru. Hala inanılmaz derecede spekülatif bir soru (yukarıdaki mantığım gerçekten eğitimli bir tahminden başka bir şey değil), ancak bunun hakkında daha fazla yorum yapmam.
BoltClock

neden boşluk istiyorsanız sadece bir iç sarma / div olmasın
ashley

Yanıtlar:


55

width: calc(50% - 24px);Soğanlarınız için kullanamaz mısınız? Ardından kenar boşluklarınızı ayarlayın.


5
Yüksek oranda tarayıcıya bağımlıdır. Muhtemelen 2020 civarında ie15 bunu destekleyecek ve bunu işinizde de kullanmanıza izin verilecek :-(
peterh - Monica'yı

1
Firefox'ta çok iyi çalışmıyor gibi görünüyor mu? (veya yaptığım başka bir şey değil)
Laurengineer

@Morgan Feeney: Evet, ancak kutu boyutlandırmanın kenar boşluğu kutusu (bu sorunun tüm noktası) adı verilen bir değeri yok. Şimdi böyle bir değer girilmiş olsa bile, mevcut tarayıcılara yama / çoklu doldurma / küçültmeyi nasıl öneriyorsunuz?
BoltClock

Evet ama ... calc () yöntemini geçici bir çözüm olarak öneren bir cevaba özellikle yanıt veriyor.
Morgan Feeney

Bunun belirli örnek için geçerli olup olmadığından emin değilim ancak senaryomuzda (FF 53.0.3'te olduğu gibi) calc () işlevini kullanmanın büyük bir negatifi, davranışının genişlikle aynı olmamasıdır:% X; Gördüğümüzden "calc" ilk renderleme sırasında statik bir Xpx'e yapılır. Bu, genişlikten farklı olarak:% X oranında, hesaplanan sütun kap boyutlandırmasıyla otomatik olarak yeniden boyutlandırılmaz.
Pancho

16

Bence bir box-sizing: margin-box. Css kutusu modeli, çerçevelerin kenar boşluklarının konumlarını tam olarak gösterir.

Küçük sorunlar var - örneğin, kenar boşluğu kutuları üst üste gelebilir - ancak çözülmesi zor değildir.

Sanırım durum, tablo hücrelerindeki mutlak konumlandırılmış div'larla , overflow-x& overflow-ykombinasyonları ile görebildiğimiz gibi aynıdır, min | max-width | height ile kutu boyutlandırması kombinasyonu vb.

Tarayıcı geliştiricilerinin geliştirmediği özellikler, gerçekten basit özellikler var.

IMHO, box-sizing: margin-boxçok kullanışlı bir özellikti. Başka bir kullanışlı özellik, box-sizing: padding-boxen azından standartta mevcuttu, ancak büyük tarayıcıların hiçbirinde uygulanmadı. En yeni kromda bile değil!


Not: @Oriol'un yorumu: Firefox, kutu boyutlandırma: dolgu kutusu uyguladı. Ama diğerleri yapmadı ve şartnameden çıkarıldı. Firefox 50. sürümde kaldıracaktır. Sad.


2
Firefox uyguladı box-sizing: padding-box. Ama diğerleri yapmadı ve şartnameden çıkarıldı. Firefox 50. sürümde kaldıracaktır. Sad.
Oriol

6

Üstteki adam, dolgu ve sınır da dahil olmak üzere toplam genişliğe marj eklemeyi soruyor. Mesele şu ki, kenar boşluğu kutunun dışına uygulanır ve dolgu ve kenarlık kullanılmaz border-box.

Bu border-marginfikri başarmaya çalıştım . Bulduğum şey, eğer kenar boşluğu kullanırken .lastson öğeye bir sınıf ekleyebilmenizdir (kenar boşluğu ile sıfır boşluğu uygulayın veya kullanın :last-child/:last-of-type). Veya her yerde eşit kenar boşlukları ekleyin (yukarıdaki dolgu sürümüne benzer).

Buradaki örneklere bakın: http://codepen.io/mofeenster/pen/Anidc

border-boxelemanın genişliğini + dolgusunu + kenarlığını toplam genişlik olarak hesaplar. Yani div% 50 genişliğinde 2 s'niz varsa , bitişik olacaktır. 8pxOnlara dolgu eklerseniz , oluk olacaktır 16px. Bunu, aynı zamanda dolguya sahip bir sarma elemanı ile birleştirin, 8pxeşit olukları olan güzel bir ızgaraya sahip olacaksınız.

Bu örneğe buradan bakın: http://codepen.io/mofeenster/pen/vGgje

İkincisi benim en sevdiğim yöntem.


4

Eminim tüm bunlar açıktır, ama yine de yazacağım çünkü ... egzersize ihtiyacım var. Aşağıdaki sonuç kadar etkili olmaz box-sizing: margin-box;:

.col2 {
    width: 45%;
    height: 90%;
    margin: 5% 2.5%;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    float: left;
}

http://jsfiddle.net/Fg3hg/

box-sizingdolgu ve kenarlığın elemanın toplam boyutuna göre hangi noktadan değerlendirildiğini kontrol etmek için kullanılır. Bu nedenle, genişliğe pxsahip kenar boşlukları dahil etmek için koşer olmasa da %(genellikle her zaman olduğu gibi), göreli yüzde miktarının ne olması gerektiğini hesaplamak daha kolaydır, çünkü tanımlanmış genişliğe dolgu ve kenarlık eklemeniz gerekmez.


9
Kenar boşluğu kutusu gibi bir şey için kullanım durumu, yüzde genişliklerinin piksel kenar boşluklarıyla karıştırılmasını sağlamaktır. Aralarında 1 piksel kenar boşluğuna sahip iki% 50 kutu istiyorsanız, bu% 1'lik bir yüzde marjı ile gerçekleştirilemez - bazı küçük ekran boyutları% 1'den 0 piksele yuvarlanır ve aniden kenar boşluğunuz olmaz. Gerçekten ihtiyacımız olan şey, @Slouch'un gösterdiği gibi calc () veya flexbox modeli için daha fazla tarayıcı desteği.

1
Eğer bakım bu olursa, ana konteyner 100 pikselden az olacaktır ve umarım bazı tasarım öğeleri bu noktada yeniden düşünülecektir. İç içe elemanlar ve benzerleri ile yapabileceğiniz başka şeyler de var, ancak evet, değişken hesaplamalar güzel uyuşturucu olurdu. Eğer sass veya daha az şeylere giriyorsanız, sanırım bu şeylerin çoğunu yapıyorlar. Onlarla oynadım, ama henüz Jedi değilim.
Plummer

2
Önerdiğiniz şey bir çözüm. Karmaşık düzenlerle çalışırken CSS yazmanın ideal bir yolu değildir. Tasarımcının veya yazarın tasarımlarında yüzdeleri kullanmak istediğini varsayıyorsunuz. Ayrıca, bu sorundan bağımsız olarak, piksel kenar boşluklarını kullanarak aralık oluşturmak için calc () işlevini kullansanız bile, CSS kullanılarak üzerine yazılmasına izin vermek yerine oluğun ne olduğunu önceden belirlemeleri gerektiğinden tasarımcı hala sınırlıdır.
limitlessloop

Ne demek istediğini anlamıyorum. Mevcut sorun, px ve% ifadelerinin dahil edilmesinin, kenar boşluğu boyut hesaplamasına dahil edilmediğinden satır sonlarına neden olmasıdır. Bir kenar boşluğu bir öğenin boyutuna dahil değildir, bir öğenin etrafında görünmesini istediğiniz alandır. Ayrıca, margin-boxçok boyutlu marj hesaplamaları nasıl yapılır ? @mediakırılma noktaları, max-widthve min-widthçalışma gayet güzel. Sanırım margin-boxbazı şişkinlikleri azaltabilir, ama bunun gereksiz olduğu için nedenler de alıyorum.
Plummer

Neden kimse bu marjın Yüzde VALUE'sunun bir nedenle genişliğin yüzdesi olduğunu söylemiyor ... yükseklik veya genişlik önemli değil. Ebeveynin genişliği kullanılır. Hangi en az söylemek bizzare .. yani yukarıdaki kod çalışmamalı ve çalışmıyor. yükseklik ve genişliği eşit yapmazsanız.
Muhammed Umer

4

Bunun nedeni, kutu boyutlandırma özelliğinin, verilen boyuta özgü değerleri (dolgu, kenarlıklar) hesapladıktan sonra bir öğenin boyutunu ifade etmesidir. "box-sizeing: border-box" bir elemanın yüksekliğini / genişliğini ayarlar ve kenarlığın yanı sıra dolgu malzemesini de dikkate alır. Bir öğenin kenar boşluğunun kapsamı, öğenin kendisinden daha büyüktür, yani sayfanın ve çevresindeki öğelerin akışını değiştirir, dolayısıyla öğenin kardeş öğelerine göre üst öğeye uyma şeklini doğrudan değiştirir. Sonuçta bir "kenar boşluğu kutusu" öznitelik değeri büyük sorunlara neden olur ve esasen elemanların yüksekliğini / genişliğini doğrudan ayarlamakla aynıdır.


1
özür dilerim ama "margin-box" ile boşluk hesaplamasına dolgu, sınır ve kenar boşluğu eklemenin kavramsal olarak "border-box" ile dolgu ve kenarlık eklemekten nasıl farklı olacağını anlamıyorum. Elbette aynı temadaki bir varyasyon?
Pancho

1

On Codrops taşma zorla marjlar ve satır en etkisiyle konusunda iyi makalelerin bir çift vardır. Tüm tarayıcılar için normalleştirici css ayar yazı tipi boyutunu% 100 olarak ayarlayan rem veya em birimini kullanmanızı önerir, ardından genişlikleri ve kenar boşluklarını ayarladığınızda, yorumlarda yalnızca bir not yazarak satır genişliği üzerindeki etkiyi takip etmek kolaydır. toplam genişlik. 16 pikseli 1 em'e dönüştürmek, hedeflenen toplam görüntüleme alanlarını hesaplamanın yoludur.

En azından geliştirme aşaması için böyle çalışarak ve daha sonra 'duyarlı' şablonlar istiyorsanız, kenar boşlukları dahil genişlikleri% 'e dönüştürebilirsiniz.

Olukları işlemek için önerdikleri diğer ve genellikle daha basit bir yol, sözde content: '';bulduğum sütunlarınızın her birinde pseudo ve on'u kullanmaktır . Bitiş gibi tanımlanmış son sütun olan bir div sınıfı ayarlarsanız, söz konusu sınıfı sonradan sözde olmaması veya daha geniş bir sınıf olması için hedefleyebilirsiniz; düzeninize en uygun olanı.

Bu sözde öğe yöntemini kullanmanın ek avantajı, aynı zamanda okuyucular monitöründeki düz görüntüye daha fazla 3d efekti ve daha fazla derinlik verebilen gölgeler için bir hedef vermesidir. Şu anda düğmelerde kullanılan efektleri ölçeklendirerek, degradeleri ve z-dizinini 'ayarlayarak' bu etkiyi deniyorum.


1

Normal akıştaki blok düzeyinde, değiştirilmemiş elemanların boyutları tatmin etmelidir

kenar boşluğu-sol + kenarlık-sol genişlik + dolgu-sol + genişlik + dolgu-sağ + kenarlık-sağ genişlik + kenar boşluğu-sağ = kapsayıcı genişliği

Aşırı kısıtlandığında, tarayıcıların sol veya sağ kenar boşluğunu ayarlaması gerekir. Bu, kenar boşluğu kutusunun genişliği içeren bloğun genişliğine eşit olması gerektiği anlamına gelir (yani% 100).

Sizin durumunuz için, saydam kenarlıklar box-sizing: border-boxkenar boşluklarına çok benzer .


1

Belki de RGBA kullanarak kenarlığı% 0 opaklığa ayarlayın ve kenarlığı kenar boşluğu olarak kullanın.


Kulağa bir saldırı gibi geliyor, ama işi yapardı.
Morgan Feeney

Bu, işi başarmak için sarmalayıcıları kullanmak istemezseniz yararlı olabilir.
limitlessloop

... gerçekten bir sınıra ihtiyacınız yoksa
FrancescoMM

@FrancescoMM - biraz "gürültülü", ancak "kenar boşluğu genişliği" saydam kenarlığı olan bir kutu yapabilirsiniz (ve elbette kenar boşluğu yok) ve bu yerin içinde görüntülenmesini istediğiniz genişlik sınırına sahip bir kutu (yine hayır marj)
Pancho

1
Bu tür düşünceleri takip edemiyorum. 1pxHer biri 50%boş alan alan iki kutu istediğimi söylemekten daha doğal bir şey var mı ? Tam olarak margin-boxbunu yapardı. Ya da kenar boşluğu kutusunu unut ve kullanılabilir alanı düşün. Ana konteynerin% 50'si değil, kalanların% 50'si. "Kireç" yok, "% 5 marj" yok, böyle bir karmaşa yok ...
maaartinus

0

Gövde içeriğinde kutu boyutlandırmayı kullanırken ilginç bir durum var

içerik yok kenarlık kutusu sol-sağ kenar boşluğunda değer vermez Bu iki kutu yeniden sayım algoritmasının% yeniden sayımı

  .body{
    box-sizing: border-box;
    margin:0 3%;
  }

57 öncesi Firefox sürümleri de kutu boyutlandırma için dolgu kutusu değerini destekledi, ancak bu değer tarayıcının teknik özelliklerinden ve sonraki sürümlerinden kaldırıldı.

Yani marj kutusu planlanmamış bile ...

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.