Önyükleme akışkan düzeninde ızgara öğelerini nasıl aşağıya hizalarım


123

Twitter'ın önyüklemesini kullanan akıcı bir düzenim var, burada iki sütunlu bir satırım var. İlk sütunda, aralığı normal olarak doldurmak istediğim çok fazla içerik var. İkinci sütunda yalnızca bir düğme ve ilk sütundaki hücreye göre alta hizalamak istediğim bir metin var.

İşte sahip olduğum şey:

-row-fluid-------------------------------------
+-span6----------+ +-span6----------+
|                | |short content   |
| content        | +----------------+
| that           | 
| is tall        |    
|                |
+----------------+
-----------------------------------------------

İşte istediğim şey:

-row-fluid-------------------------------------
+-span6----------+
|                |
| content        |
| that           | 
| is tall        | +-span6----------+    
|                | |short content   |
+----------------+ +----------------+
-----------------------------------------------

İlk aralığı mutlak bir yükseklik yapan ve ikinci aralığı ona göre konumlandıran çözümler gördüm, ancak div'lerimin mutlak yüksekliğini belirtmek zorunda olmadığım bir çözüm tercih edilirdi. Aynı etkiyi nasıl elde edeceğimi de tamamen yeniden düşünmeye açığım. İskelenin bu şekilde kullanılmasıyla evli değilim, bana en mantıklı geliyordu.

Bir keman olarak bu düzen:

http://jsfiddle.net/ryansturmer/A7buv/3/


.rightspan'ınıza yaklaşık 200px'lik bir kenar boşluğu ekleyemez misiniz?
Richlewis

Yalnızca CSS'nin kısayolu bu sorunun cevabı: stackoverflow.com/a/14223553/259725
Adam

bootply.com/125740# (Üzgünüm, bu bağlantının hangi SO sorusuna hangi cevabın geldiğini unuttum.)
ToolmakerSteve

Yanıtlar:


50

Lütfen dikkat: Bootstrap 4+ kullanıcıları için lütfen Christophe'un çözümünü göz önünde bulundurun (Bootstrap 4, daha zarif bir yalnızca CSS çözümü sağlayan flexbox'ı tanıttı). Aşağıdakiler, Bootstrap'in önceki sürümleri için çalışacaktır ...


Çalışan bir çözüm için http://jsfiddle.net/jhfrench/bAHfj/ adresine bakın .

//for each element that is classed as 'pull-down', set its margin-top to the difference between its own height and the height of its parent
$('.pull-down').each(function() {
  var $this = $(this);
  $this.css('margin-top', $this.parent().height() - $this.height())
});

Artı tarafta:

  • Bootstrap'in mevcut yardımcı sınıflarının ruhuna uygun olarak , sınıfı adlandırdım pull-down.
  • yalnızca "aşağı çekilen" öğenin sınıflandırılması gerekir, bu nedenle ...
  • ... farklı öğe türleri için yeniden kullanılabilir (div, span, section, p, vb.)
  • oldukça iyi destekleniyor (tüm büyük tarayıcılar kenar boşluğunu destekliyor)

Şimdi kötü haber:

  • jQuery gerektirir
  • yazıldığı gibi duyarlı değil (üzgünüm)

3
duyarlılık için, belki pencereyi bağlayın.resize? stackoverflow.com/a/2969091/244811
Scott Weaver

22
CSS çözümü olabilecek bir şey için jQuery çözümü kullanmayın. Stil oluşturma amacıyla DOM manipülasyonundan kaçınmanın birçok nedeni vardır.
Archonic

1
@Archonic: Bu yalnızca CSS'ye yönelik çözüm nedir? Ayrıca JS'ye bağlı bir çözüme tercih ederim. OP'nin şu şartını aklınızda bulundurun: "div'lerimin mutlak yüksekliğini belirtmek zorunda olmadığım bir çözüm tercih
edilirdi

1
@cfx Mutlak yükseklik gerektirmeyen bir kemanla tek bir css çözümü yayınlandı.
Archonic

1
Öte yandan, benim çözümüm, kullanıcının kardeşleri etkilemeden tek tek öğelerin altını hizalamasına (Bootstrap .pull-leftve benzer davranışlara sahip) izin veriyor .pull-right. Bu yalnızca CSS çözümüyle yapılabilir mi?
Jeromy French

68

Bu, yalnızca CSS / LESS kullanan Bootstrap 3 için güncellenmiş bir çözümdür (ancak daha eski sürümlerde çalışmalıdır):

http://jsfiddle.net/silb3r/0srp42pb/11/

Satırdaki yazı tipi boyutunu 0 olarak ayarlarsınız (aksi takdirde sütunlar arasında sinir bozucu bir boşluk kalırsınız), ardından sütun kayan karakterlerini kaldırırsınız, görüntüyü olarak inline-blockayarlarsınız, yazı tipi boyutunu yeniden ayarlarsınız ve ardından vertical-alignşu şekilde ayarlanabilir: İhtiyacınız olan her şey.

JQuery gerekmez.


Ortada kalmasını istiyorum. Ancak jsfiddle'ınızda "vertical-allign: middle" yi denediğimde işe yaramadı. Düşüncesi olan var mı?
sevinç

Her iki belirlemeyi deneyin diviçin s vertical-align: middle;.
cfx

6
Bu kabul edilebilir tek cevap! @ Lukas, bir satırı doldurmayan sütunlardaki genişlikleri göz ardı eder. Ve şekillendirme için DOM manipülasyonu ... SMH.
Archonic

CSS'niz satırdan çıkarılmıştır (özellikle .myrow) ... Bu, bir sütun yukarı hizalı, bir sütun aşağı hizalı ve üçüncü bir sütun üste hizalı olamayacağınız anlamına gelmez mi?
Jeromy French

Teşekkürler ! Bootstrap 4 ile iyi çalışıyor.
Elie Teyssedou

33

Flex'i kullanabilirsiniz:

@media (min-width: 768px) {
  .row-fluid {
    display: flex;
    align-items: flex-end;
  }
}

Felx'i kullanmak benim görüşüme göre çok güzel ve anlaşılır bir şey ve "align-items: baseline" kullanarak farklı öğelerde farklı yazı tipleriyle uyumlu bir avantaj daha elde ettim.
Alessandro Dentella

Flex kullanmak için mükemmel bir öneri. Basit, ileriye dönük ve Bootstrap sorununu çözmek için Bootstrap kullanır.
CheddarMonkey

1
Mükemmel yanıt ve javascript / jquery gerektirmeden bootstrap ile mükemmel çalışıyor.
Pislik

1
Evet, bunu normal bir önyükleme satırına ekleyin ve işe yarıyor. Güzel. Duyarlı olmayan bir jquery çözümü nasıl en iyi yanıt oldu? Asla bilemeyeceğiz.
Levi Fuller

@LeviFuller Tahminim, bu çözümün yalnızca bir kesme noktasını desteklemesi nedeniyle
clamchoda

27

Bunun span6gibi smthg için biraz stil eklemelisin:

.row-fluid .span6 {
  display: table-cell;
  vertical-align: bottom;
  float: none;
}

ve bu sizin kemanınız: http://jsfiddle.net/sgB3T/


4
Span6 olarak ayarlamak yerine belirli bir css sınıfı oluştururdum, ancak tablo hücresi stratejisi iyi çalışıyor! Ayrıca doğru genişliklere sahip olmak için "display: table-row" öğesini içeren div öğesine ayarlamam gerekiyordu.
Meta-Knight

3
Bootstrap 3 için şu kuralı ekledim: .row.align-bottom> [class ^ = col] {display: table-cell; dikey hizalama: alt; float: yok; } align-bottom satırını & lt; div class = "row align-bottom" & gt;
Martin

@Martin, kuralınız .align-bottom {display: table-row;} ayarladığınızda da sorunsuz çalışıyor, ancak tablo satırları önyükleme marjı-left ve margin-right: -15px'e uymadığından satır hizalaması kapalı. ...... düşünceler?
Alex White

@AlexWhite - Bu satırdaki tüm sütunları koyun padding-left: 0ve padding-right: 0üzerine koyun .
AnalogWeapon

1
Bu, sütunlar bir satırın genişliğini doldurmadığında sütun genişliklerini göz ardı eder. Örneğin ofsetler kullanılırken.
Archonic

14

İşte bu işlevi uygulamak için bir angularjs yönergesi de var

    pullDown: function() {
      return {
        restrict: 'A',
        link: function ($scope, iElement, iAttrs) {
          var $parent = iElement.parent();
          var $parentHeight = $parent.height();
          var height = iElement.height();

          iElement.css('margin-top', $parentHeight - height);
        }
      };
    }

7

Sadece ebeveyni display:flex;ve çocuğu olarak ayarlayın margin-top:auto. Bu, üst öğenin alt öğeden daha yüksek bir yüksekliğe sahip olduğunu varsayarak, alt içeriği üst öğenin altına yerleştirir.

margin-topEbeveyn öğenizde bir yüksekliğe veya ana öğenizdeki alt öğe öğenizden daha büyük başka bir öğeye sahip olduğunuzda bir değer hesaplamaya çalışmanıza gerek yoktur .


Kabul edilen cevap bu olmalı: kısa, basit ve flex'i destekleyen herhangi bir tarayıcıda çalışıyor. Tek dezavantajı, duyarlılığı bozmasıdır.
tbm

4

Buradaki diğer cevaplara göre daha duyarlı bir versiyon. Ivan'ın sürümünden <768px genişliğinde görüntü alanlarını desteklemek ve yavaş pencere yeniden boyutlandırmalarını daha iyi desteklemek için değişiklikler yaptım.

!function ($) { //ensure $ always references jQuery
    $(function () { //when dom has finished loading
        //make top text appear aligned to bottom: http://stackoverflow.com/questions/13841387/how-do-i-bottom-align-grid-elements-in-bootstrap-fluid-layout
        function fixHeader() {
            //for each element that is classed as 'pull-down'
            //reset margin-top for all pull down items
            $('.pull-down').each(function () {
                $(this).css('margin-top', 0);
            });

            //set its margin-top to the difference between its own height and the height of its parent
            $('.pull-down').each(function () {
                if ($(window).innerWidth() >= 768) {
                    $(this).css('margin-top', $(this).parent().height() - $(this).height());
                }
            });
        }

        $(window).resize(function () {
            fixHeader();
        });

        fixHeader();
    });
}(window.jQuery);

bu ayrıntılandırma için teşekkürler, onu yeni bir proje için aldım ve iyi çalışıyor.
sifriday

1
Neden margin-top0'a ayarlanıp sonra yeniden yeni değere ayarlansın? Ayrıca, bu şeyler neden iki each()"döngü" halinde oluyor?
Jeromy French

4

Bu, cfx'in çözümüne dayanmaktadır, ancak ekran nedeniyle eklenen sütunlar arası boşlukları kaldırmak için ana kapta yazı tipi boyutunu sıfıra ayarlamak yerine: satır içi blok ve bunları sıfırlamak zorunda kaldım, basitçe ekledim

.row.row-align-bottom > div {
    float: none;
    display: inline-block;
    vertical-align: bottom;
    margin-right: -0.25em;
}

telafi etmek için sütun divs.


0

Eh, ben yapmadım o cevapların hiçbirinde gibi aynı sorunun benim çözüm bu eklemek oldu: <div>&nbsp;</div>. Yani planınızda şöyle görünecektir (az ya da çok), benim durumumda hiçbir stil değişikliğine gerek yoktu:

-row-fluid-------------------------------------
+-span6----------+ +----span6----------+
|                | | +---div---+       |
| content        | | | & nbsp; |       |
| that           | | +---------+       |
| is tall        | | +-----div--------+|   
|                | | |short content   ||
|                | | +----------------+|
+----------------+ +-------------------+
-----------------------------------------------

4
&nbsp;Sol hücrenin uzunluğu bilinmiyorsa eklenecek sayıyı nasıl biliyorsunuz ?
Gqqnbig

-2
.align-bottom {
    position: absolute;
    bottom: 10px;
    right: 10px;
}

1
cevabınıza neden OP sorusunu cevapladığını açıklayan bazı bilgiler eklemeye çalışmalısınız
MLavoie
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.