CSS kullanarak DIV'yi eşit olmayan şekilde ortalayın


23

Flexbox kullanarak bir DIV'yi başka bir DIV içinde ortalıyorum. Gerektiğinde ekranın ortasında açılan bir iletişim penceresi düşünün.

İyi çalışıyor, ancak iletişim kutusunun üstündeki ve altındaki alan tam olarak eşit değilse, kalan alanın% 40'ının iletişim kutusunun üstünde ve% 60'ın altında olması daha iyi görünecektir. İletişim yüksekliği, içindeki metin miktarına göre değiştiği için zorlaşır.

Örneğin, tarayıcı yüksekliği 1000 piksel ve iletişim penceresi yüksekliği 400 piksel ise, kalan dikey alanın (600 piksel) iletişim kutusunun 240 piksel ve 360 ​​piksel altında olmasını istiyorum. Javascript ile yapabilirdim, ama CSS ile akıllı bir yol olup olmadığını merak ediyorum. #DialogBox DIV için bir alt kenar boşluğu eklemeyi denedim, ancak iletişim yüksekliği tarayıcı yüksekliğine yaklaştığında çalışmıyor.

#dialogBoxPanel
  {
  position:absolute;
  display:flex;
  align-items:center;
  justify-content:center;
  left:0px;
  top:0px;
  width:100%;
  height:100%;
}
#dialogBox
  {
  width:350px;
}
<div id="dialogBoxPanel">
  <div id="dialogBox">Text</div>
</div>


Tüm manzarayı kaplamak için dış panele mi ihtiyacınız var? Değilse, css-tricks.com/centering-css-complete-guide , "Hem Yatay hem de Dikey Olarak Kesit / Bilinmeyen genişlik ve yükseklik öğesi mi?" Bölümündeki çözümle devam eder ve çeviri yüzde değerlerini değiştiririm. (Ve ana tam görüntü alanı boyutuna [arka plana] ihtiyacınız olsa bile, her ikisini de birleştirebilmeniz gerekir - esnek şeylerle uzaklaşın, dinlenme kalır.)
04FS

Evet Dış panelde karartma efekti var, bu yüzden tüm görünümü kaplaması gerekiyor. Ama içine başka bir DIV ekleyebilirim ve çözümünüz iyi olurdu. Teşekkürler 04FS!
Björn Morén

Doğruluk uğruna, merkezleme değil dikey hizalamadan bahsediyorsunuz.
Michael Benjamin

Yanıtlar:


11

Beyaz boşluğu simüle etmek için sözde öğe ve sütun yönünü kullanın. flex-growHer birinin ne kadar boş alan gerektiğini kontrol etmek için sözde öğeyi ayarlayın . Eşit flex-grow eşit alan sağlar:

Ayrıca 2ve öğelerini de kullanabilirsiniz 3. Sadece aynı oranı korumamız gerekiyor:

Başka bir fikir, 40%çeviriye eşit en üst değeri kullanmak ve konumu düzeltmektir ( 50%merkezleme ile aynı mantık )

#dialogBoxPanel {
  position: absolute;;
  left: 0px;
  top: 0px;
  width: 100%;
  height: 100%;
  /* the center */
  background:linear-gradient(red,red) center/100% 1px no-repeat;
}

#dialogBox {
  position:relative;
  top:40%;
  width: 350px;
  transform:translateY(-40%);
  margin:auto;
  border:1px solid;
}
<div id="dialogBoxPanel">
  <div id="dialogBox">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc hendrerit diam eu nisl fringilla ornare. Pellentesque aliquam quam et tellus egestas sodales. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin bibendum,</div>
</div>


Çok teşekkürler Temani! Her iki çözüm de mükemmel çalışır ve iletişim kutusunun tarayıcıdan daha uzun olduğu özel durum haricinde aynı görünür. İlk çözüm, iletişim kutusunun üst kısmını tarayıcının üst kısmıyla hizalı, altta kırparak tutar. İkinci ürün hem altta hem de üstte ekin. Sadece bir tercih meselesi.
Björn Morén

5

Bu çözüm kullanır display: grid, yeni bir özelliktir, bu nedenle tarayıcı desteğini kontrol ettiğinizden ve daha fazla bilgi edinmek için buraya tıklayın .

Üst ve alt boşlukları kontrol eden çizgi budur:

grid-template-rows: 40fr [content-start] auto [content-end] 60fr;

Snippet metin içeriği, yükseklik değişse bile kutunun ortalanmış olup olmadığını kontrol etmeniz için düzenlenebilir.

#dialogBoxPanel {
    display: grid;
    place-content: center;
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    grid-template-rows: 40fr [content-start] auto [content-end] 60fr;
}
#dialogBox {
    border: 1px solid;
    width: 350px;
    grid-area: content;
}
<div id="dialogBoxPanel">
   <div id="dialogBox" contenteditable>Text</div>
</div>


1
Ben kullanımını düşünürdüm 4fr auto 6fr. Çalıştığınız ancak% 40 +% 60 + 1fr olduğu için biraz taşma ile çalışır ve her zaman% 100'den daha büyük olacaktır ve bu nedenle aşırıya kaçma üstten ve alttan eşit olarak bölünecektir: jsfiddle.net/cobutn0e/2 . Ayrıca beklendiği gibi% 100 olmadığını fark edeceksiniz
Temani Afif

1fr'yi otomatik olarak değiştirdim, soru değerleriyle eşleşmek için% olarak bırakmayı tercih ederim. Hatayı işaret ettiğiniz için çok teşekkürler!
rafaelcastrocouto

otomatik ve 1fr sizin durumunuzda aynı sonucu verecektir, sorun yüzde kullanımı; 1fr=minmax(auto,1fr)ve sizin durumunuzda auto% 40 +% 60 =% 100 olduğu için boş alan olmadığı için düşecektir (bu yüzden her zaman
taşacaksınız

1
İşte benim açımdan bir başka keman: jsfiddle.net/cobutn0e/3 ilk 3'ün nasıl aynı olduğunu, üçüncü olanın 0'a düştüğünü ve
sonuncunun

Şimdi anladım, mantıklı. Gün sonunda aynı olduğu için 40fr ve 60fr kullanacaksınız. Bana öğretmek için zaman ayırdığınız için tekrar teşekkürler!
rafaelcastrocouto

4

Aralayıcılar div ekleyebilir ve esnek büyümeyi 4: 6 oranıyla ayarlayabilirsiniz.

#dialogBoxPanel {
  position: absolute;
  display: flex;
  flex-direction: column;
  align-items: center;

  left: 0px;
  top: 0px;
  width: 100%;
  height: 100%;
}

#dialogBox {
  width: 350px;
  border: 1px solid black;
}

.spacer-top{
  flex-grow: 4;
}
.spacer-bottom{
  flex-grow: 6;
<div id="dialogBoxPanel">
  <div class="spacer-top"></div>
  <div id="dialogBox">Text</div>
  <div class="spacer-bottom"></div>
</div>


Sadece şimdi @Temani Afif'in cevabını gördüm, ancak "sonra" ve "önce" ile aynı şekilde çalışıyor
Itay Gal

0

Konum ve kenar boşluğunu kullanarak basit bir şekilde, iletişim yüksekliğinizin her zaman tarayıcı yüksekliğinin% 40'ı olduğunu varsaydım.

.modal{
            max-height:50%;
            width:400px;
            margin: 10% auto 5% auto;
            position:absolute;
            top:0;
            bottom:0;
            right:0;
            left:0;
            overflow-y: auto
        }
        .modal-body{
            background-color: beige;
            padding: 20px;
            line-height: 21px
        }

HTML

<div class="modal">
 <div class="modal-body">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea </div>
</div>

Merhaba, bir dahaki sefere soruyu dikkatlice okuyunuz, şunu belirtiyor: "diyalog yüksekliği içindeki metin miktarına göre değişir."
rafaelcastrocouto

1
@rafaelcastrocouto - şimdi yüzde olarak maksimum yükseklik ile kontrol ediyor, çünkü yükseklik olmadan bırakmak üst ve alt uzay estetiğinin amaçlarını çözmeyecek.
Anshul Chaurasia
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.