부트 스트랩 유동 레이아웃에서 그리드 요소를 하단 정렬하는 방법


123

저는 트위터의 부트 스트랩을 사용하는 유동적 인 레이아웃을 가지고 있는데 두 개의 열이있는 행이 있습니다. 첫 번째 열에는 내용이 많으므로 일반적으로 범위를 채우고 싶습니다. 두 번째 열에는 버튼과 일부 텍스트 만 있으며, 첫 번째 열의 셀을 기준으로 아래쪽으로 정렬하고 싶습니다.

내가 가진 것은 다음과 같습니다.

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

내가 원하는 것은 다음과 같습니다.

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

첫 번째 범위를 절대 높이로 만들고 두 번째 범위를 상대적으로 배치하는 솔루션을 보았지만 div의 절대 높이를 지정할 필요가없는 솔루션이 선호됩니다. 나는 또한 동일한 효과를 얻는 방법에 대해 완전히 재고 할 여지가 있습니다. 나는 비계를 사용하는 것에 결혼하지 않았습니다. 그것은 나에게 가장 이해가되는 것 같았습니다.

이 레이아웃은 바이올린으로 :

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


.rightspan에 약 200px의 여백 상단을 추가 할 수 없습니까?
Richlewis

이 질문에 대한 CSS의 바로 가기 : stackoverflow.com/a/14223553/259725
Adam

bootply.com/125740# (미안 SO이 링크에서이다 질문하는에있는 답변을 잊는다.)
ToolmakerSteve

답변:


50

참고 : Bootstrap 4+ 사용자의 경우 Christophe의 솔루션을 고려하십시오 (Bootstrap 4는보다 우아한 CSS 전용 솔루션을 제공하는 flexbox를 도입했습니다). 다음은 이전 버전의 Bootstrap에서 작동합니다.


작동하는 솔루션 은 http://jsfiddle.net/jhfrench/bAHfj/ 를 참조하십시오 .

//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())
});

긍정적 인 측면에서는:

  • Bootstrap의 기존 도우미 클래스 정신에 따라 클래스 이름을 pull-down.
  • "풀다운"되는 요소 만 분류하면되므로 ...
  • ... 다른 요소 유형 (div, span, section, p 등)에 재사용 가능
  • 상당히 잘 지원됩니다 (모든 주요 브라우저는 margin-top 지원).

이제 나쁜 소식 :

  • jQuery가 필요합니다.
  • 작성된대로 반응하지 않습니다 (죄송합니다).

3
응답 성을 위해 아마도 window.resize를 연결합니까? stackoverflow.com/a/2969091/244811
Scott Weaver

22
CSS 솔루션이 될 수있는 것에 jQuery 솔루션을 사용하지 마십시오. 스타일링 목적으로 DOM 조작을 피하는 데는 여러 가지 이유가 있습니다.
Archonic

1
@Archonic : CSS 전용 솔루션은 무엇입니까? 또한 JS 종속 솔루션보다 선호합니다. 그냥 마음 OP의 규정에 유지 "해결책을 내 된 div의 절대 높이를 지정하지 않은 경우 선호 할 것"
제로미 프랑스어

1
@cfx 절대 높이가 필요하지 않은 바이올린이있는 CSS 전용 솔루션을 게시했습니다.
Archonic

1
반면에 내 솔루션은 사용자가 형제에 영향을주지 않고 개별 요소를 하단 정렬 (Bootstrap의 .pull-left및과 유사한 동작 제공) 할 수 있도록합니다 .pull-right. CSS 전용 솔루션으로 할 수 있습니까?
Jeromy French

68

이것은 CSS / LESS 만 사용하는 Bootstrap 3 (이전 버전에서 작동해야 함)에 대한 업데이트 된 솔루션입니다.

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

행에서 글꼴 크기를 0으로 설정 한 다음 (그렇지 않으면 열 사이에 성가신 공간이 생김) 열 부동을 제거하고 표시를 inline-block로 설정하고 글꼴 크기를 다시 설정 한 다음 다음 vertical-align으로 설정할 수 있습니다. 필요한 모든 것.

jQuery가 필요하지 않습니다.


중간에두고 싶어요. 그러나 "vertical-allign : middle"을 시도했을 때 jsfiddle에서 작동하지 않았습니다. 이견있는 사람?
joy

divs를 모두로 설정해보십시오 vertical-align: middle;.
CFX

6
이것이 유일한 대답입니다! @ Lukas 's는 행을 채우지 않는 열의 너비를 무시합니다. 스타일링을위한 DOM 조작 ... SMH.
Archonic 2015 년

CSS가 행에서 벗어납니다 (특히, .myrow) ... 이것은 하나의 열을 위쪽 정렬, 하나의 열을 아래쪽 정렬, 세 번째 열을 위쪽 정렬 할 수 없음을 의미하지 않습니까?
Jeromy French

감사 ! 부트 스트랩 (4)와 함께 잘 작동
엘리 Teyssedou

33

flex를 사용할 수 있습니다.

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

felx를 사용하는 것은 제 생각에 매우 훌륭하고 간단합니다. "align-items : baseline"을 사용하면 한 가지 더 많은 이점이 있습니다. 이는 정렬 할 다른 항목의 다른 글꼴로 훌륭했습니다.
Alessandro Dentella

flex를 사용하는 훌륭한 제안. 간단하고 간단하며 Bootstrap을 사용하여 Bootstrap 문제를 해결합니다.
CheddarMonkey

1
훌륭한 대답이며 javascript / jquery가 필요없는 부트 스트랩과 완벽하게 작동합니다.
Filth

1
예, 이것을 일반 부트 스트랩 행에 추가하고 bam, 작동합니다. 아름다운. 응답이없는 jquery 솔루션이 어떻게 최고의 답변이 되었습니까? 우리는 결코 알 수 없습니다.
Levi Fuller

이 솔루션은 하나의 중단 점 지원하기 때문에 @LeviFuller 내 추측이다
clamchoda

27

span6다음과 같은 스타일을 추가해야 합니다.

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

그리고 이것은 당신의 바이올린입니다 : http://jsfiddle.net/sgB3T/


4
span6으로 설정하는 대신 특정 CSS 클래스를 만들 수 있지만 테이블 셀 전략은 잘 작동합니다! 또한 올바른 너비를 갖도록 포함하는 div에 "display : table-row"를 설정해야했습니다.
Meta-Knight

3
Bootstrap 3의 경우 다음 규칙을 추가했습니다. .row.align-bottom> [class ^ = col] {display : table-cell; 수직 정렬 : 하단; float : 없음; } 행에 align-bottom 적용 & lt; div class = "row align-bottom"& gt;
Martin

@Martin, .align-bottom {display : table-row;}도 설정하면 규칙이 제대로 작동하지만 테이블 행이 부트 스트랩 margin-left 및 margin-right : -15px를 존중하지 않기 때문에 행 정렬이 꺼져 있습니다. ...... 생각?
Alex White

@AlexWhite는 - 넣어 padding-left: 0padding-right: 0그 행의 모든 COLS합니다.
AnalogWeapon 2015 년

1
열이 행의 너비를 채우지 않을 때 열 너비를 무시합니다. 예를 들어 오프셋을 사용할 때.
Archonic 2015 년

14

이 기능을 구현하기위한 angularjs 지시문도 있습니다.

    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

부모는로 display:flex;, 자식은로 설정하면 됩니다 margin-top:auto. 이렇게하면 부모 요소의 높이가 자식 요소보다 크다고 가정하여 자식 콘텐츠가 부모 요소의 맨 아래에 배치됩니다.

margin-top부모 요소에 높이가 있거나 부모 요소 내에서 관심있는 자식 요소보다 큰 다른 요소가있는 경우 값을 계산할 필요가 없습니다 .


이것이 허용되는 대답이어야합니다. 짧고 간단하며 flex를 지원하는 모든 브라우저에서 작동합니다. 유일한 단점은 응답 성이 깨진다는 것입니다.
tbm

4

여기에 다른 답변을 기반으로 훨씬 더 반응이 빠른 버전이 있습니다. 나는 Ivan의 버전에서 <768px 너비의 뷰포트를 지원하고 느린 창 크기 조정을 더 잘 지원하도록 변경했습니다.

!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);

개선 해주셔서 감사합니다. 방금 현재 프로젝트에 적용했으며 잘 작동하고 있습니다.
sifriday

1
margin-top0으로 설정 한 다음 새 값으로 다시 설정하는 이유는 무엇 입니까? 또한 두 개의 each()"루프" 에서 이러한 작업을 수행하는 이유는 무엇입니까?
Jeromy French 2015 년

4

이것은 cfx의 솔루션을 기반으로하지만 표시로 인해 추가 된 열 간 공백을 제거하기 위해 부모 컨테이너에서 글꼴 크기를 0으로 설정하는 대신 : 인라인 블록을 재설정해야하고 간단히 추가했습니다.

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

보상하기 위해 열 div에.


0

글쎄, 나는 그 대답 중 어느 것도 마음에 들지 않았고, 같은 문제에 대한 나의 해결책은 이것을 추가하는 것이 었습니다 <div>&nbsp;</div>. 따라서 귀하의 계획에서는 다음과 같이 보일 것입니다 (다소), 제 경우에는 스타일 변경이 필요하지 않았습니다.

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

4
어떻게의 수를 알 수 있습니까 &nbsp;왼쪽 셀의 길이를 알 수없는 경우 추가?
Gqqnbig

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

1
는 영업 이익의 질문에 대답 당신은 왜 당신의 대답은 설명에 약간의 정보를 추가하려고한다
MLavoie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.