根据屏幕尺寸更改Bootstrap DIV顺序

12

场景:我有一个编辑器小部件(类似于文本区域),用于可渲染模板,一个预览面板来显示编辑后的模板,以及一个呈现预览时生成的错误消息列表。我想要的布局如下:

small screen:            large screen:

+--------------+         +--------------+ +--------------+
|              |         |              | |              |
|    editor    |         |    editor    | |    preview   |
|              |         |              | |              |
+--------------+         +--------------+ +--------------+
|              |         +-------------------------------+
|    errors    |         |                               |
|              |         |            errors             |
+--------------+         |                               |
|              |         +-------------------------------+
|   preview    |         
|              |
+--------------+    

我只需要这两个布局(不是三个或四个),因为只有-lg足够大,可以使编辑器和预览并排。为了控制大小,我给所有三个DIV添加了col-xs-12,并给编辑器和预览添加了col-lg-6(错误列表应该在大屏幕上保持为12)。

其他关于此主题的帖子建议“最小”的布局决定HTML中DIV的顺序,因此应为:编辑器、错误、预览。他们进一步告诉我们使用-pull-和-push-类在大屏幕上更改顺序。我尝试通过将col-lg-pull-6添加到预览中,并将col-lg-push-6添加到错误中来实现。据我所知,push/pull相对于元素的当前位置工作,因此应该将预览拉回到第一行,并将错误框推到第二行。

请注意,我没有使用“row”类,因为我不完全理解如何使用它们。元素的放置应该根据屏幕大小而定,而不是由HTML固定(这就是响应式布局的全部含义,不是吗?)

其他帖子还建议将其中一个框架呈现两次,根据屏幕大小使其中一个框架不可见,但他们缺乏详细的解释为什么这是一个好主意。这纯粹是一个布局问题,而响应式布局的整个意义是我不必搞乱HTML来适应屏幕大小。


1
我不是Bootstrap专家,所以无法为您提供Bootstrap解决方案;但如果您可以使用自定义CSS,您可以使用“Flex”方法,这样更容易获得所需的布局。 “Flex”的主要特点是随时可以更改div的显示顺序。 - Kheema Pandey
响应式设计是将HTML原样呈现,但通过CSS进行调整以适应视窗大小。自适应设计使用服务器端工具根据设备提供不同的HTML。如果没有Flex,可以使用CSS来隐藏和显示和/或jQuery来克隆和追加。如果您知道编辑器和预览的宽度和高度,可以使用绝对定位使其看起来在下面,并在容器上使用底部填充以保持打开状态。您可以使用jQuery在加载和调整大小时编写高度和定位。http://caniuse.com/#search=flex - Christina
请你能否在一个fiddle中重现这个问题,以帮助我们理解结构? - Karim AG
1
你对使用jQuery解决方案感到满意吗?似乎没有CSS解决方案。 - Zafar
BootstrapThemer:使用jQuery进行克隆和追加不就是在操作HTML吗?我最初的假设是RD关注的是展示而不是操作,这就是为什么我致力于纯CSS解决方案(毕竟,我的任务是关于这三个区域的展示)。 - Martin Geisse
显示剩余2条评论
5个回答

8
在你的问题中提到了使用行。 .row 清除了列浮动,并调整了列的左右边距,以便外部没有额外的填充,如果不使用 .row 将会破坏您的布局。这是一个非常全面的 Bootstrap 网格指南:http://www.helloerik.com/the-subtle-magic-behind-why-the-bootstrap-3-grid-works
使用 Flexbox 是在纯 CSS 中实现它的唯一方法。为了解决旧版浏览器(包括小于或等于 IE9 的浏览器),我使用 Modernizr(此演示链接中的 Modernizr 在 html 元素上添加了 .flexbox.no-flexbox,仅供此演示使用)。通过这种方式,您可以将对 flex 模型的使用隔离在支持它的浏览器上,而您的回退将是在 HTML 中设置的标准 Bootstrap 列。不要忘记遵循 GetBootstrap.com 上的网格说明。您需要制作自己的 Modernizr 构建。
要使 Bootstrap.css 在 IE8 上工作,您需要使用 Respond.js - 请参阅其文档并将 CSS 与相对路径链接到本地。使用 jQuery 1 系列,大于 1.10,尽管 1.9 可行。jQuery 2 不支持旧版 IE 8 浏览器。
DEMO:http://jsbin.com/dimuq/1 SMALL VIEW PORT:
LARGE VIEW PORT:
CSS:
/* uses Modernizr to add .flexbox to html class, if not supported the fallback are the basic bootstrap grid */
@media (min-width:992px) { /* choose your min-width this is using the md- default */
  .flexbox .flex-row.row {
        display: -webkit-flex;
        display: -ms-flexbox;
        display: flex;
        -webkit-flex-wrap: wrap;
        -ms-flex-wrap: wrap;
        flex-wrap: wrap;
    }

  .flexbox .flex-row [class*=flexcol-] {
        display: -webkit-flex;
        display: -ms-flexbox;
        display: flex;
    }
  
  .flexbox .flex-row .flexcol-editor, 
  .flexbox .flex-row .flexcol-preview {width:50%;}


  .flexbox .flex-row .panel {
        width: 100%;
        /*something to keep it open and add some inner style */
    }

  .flexbox .flex-row .flexcol-errors {
        order: 2;
        width:100%;
    }
}

在这里了解有关Flexbox的更多信息:http://css-tricks.com/snippets/css/a-guide-to-flexbox/http://philipwalton.github.io/solved-by-flexbox/


HTML - 需要使用Modernizr检查flexbox并将类flexbox添加到html中(请参见演示js面板)

<div class="container">
  <div class="flex-row row">
      <div class="col-md-6 flexcol-editor">
        <div class="panel panel-default">
         <div class="panel-heading">Editor</div>
         <div class="panel-body">Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem. Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et quinta decima. Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum.</div>
        </div>
      </div>
      
      <div class="col-md-6 flexcol-errors">
      
        <div class="panel panel-default">
         <div class="panel-heading">Errors</div>
         <div class="panel-body">Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem. Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et.</div>
        </div>
  
      </div>
      
    
      <div class="col-md-12 flexcol-preview clearfix">
        <div class="panel panel-default">
         <div class="panel-heading">Preview</div>
         <div class="panel-body">Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.</div>
        </div>
      </div>

目前而言,flexbox 看起来是我认为的“正确方式”。我会尽快仔细研究它。 - Martin Geisse
正如预期的那样运作,并且“感觉正确”,所以这是您的奖励。对于那些尝试演示的人:您需要调整宽度或边距,以将编辑器和预览适合单行。浏览器支持可能会成为我的问题,这让我想知道我是否可以在生产中实际使用flexbox,但是浏览器支持并不是问题的一部分。 - Martin Geisse

1

试试这个:

<div class="row">
                <div class="col-md-6 col-lg-6 col-sm-12 col-xs-12">
                    editor 
                </div>
                <div class="col-md-6 col-lg-6 col-sm-12 col-xs-12 hidden-md hidden-lg">
                    errors 
                </div>
                <div class="col-md-6 col-lg-6 col-sm-12 col-xs-12 ">
                    preview  
                </div>
                <div class="col-md-6 col-lg-6 col-sm-12 col-xs-12 hidden-sm hidden-xs">
                    errors 
                </div>
            </div>

正如问题中已经提到的,我不明白为什么这是一个好主意。我想控制一个错误框的布局,而不是添加第二个错误框。我还必须确保两个错误框的内容在页面首次呈现时以及通过Javascript向框添加错误时保持同步。请解释为什么这比纯CSS解决方案更可取,因为我认为Bootstrap绝对偏爱纯CSS解决方案。 - Martin Geisse

0
我为你想出了一个有趣的解决方案: BOOTPLY。这个方案使用了 pull-right 类来移动大视口下的预览列,然后通过改变 marginTop(将div向上移动)其他两个divs的组合高度,将其精确地放置在你想要的位置。 HTML:
<div class="container">
<div class="row">
  <div id="editor" class="col-xs-12 col-lg-6" style="background-color:red;">editor</div>
    <div id="errors" class="col-xs-12 col-lg-12" style="background-color:blue;">errors</div>
    <div id="preview" class="col-xs-12 col-lg-6 pull-right" style="background-color:green;">preview</div>
</div>

Jquery:

    var h=0;
$(document).ready(function(){
    h=document.getElementById("errors").offsetHeight + document.getElementById("editor").offsetHeight;

  $("#preview").css("marginTop", "-="+h);
});

大视口:

large viewport custom

现在这个解决方案的问题是当您移动到小视口时,预览会重叠编辑器,因此如果您使用相同的高度变量并对其进行相反的移动(marginTop: "+=" +h),它将被放回原位。

这个解决方案的主要好处是避免多个完全相同的divs


谢谢,但我已经清楚了一个jQuery解决方案在技术上如何工作。我所缺少的是它为什么比纯CSS在解决看似纯粹是一个演示问题时更优越。 - Martin Geisse
@MartinGeisse 你想要div的复制还是想要一个div,然后用jQuery来操作div的位置。这是个人偏好。 - Charles Smartt
@MartinGeisse,对于jQuery和CSS解决这个问题,双方都有论据。如果您的重复div太复杂,并且您必须更改某些内容-您必须更改两次。 - Jordan.J.D
@Charles Smartt 对我来说没有意义,与将DIV放置在CSS中相比。 - Martin Geisse
@JordanD 是的,这正是我试图避免重复 DIV 并且为什么我打算通过 CSS 来放置 DIV 的原因。关于 jQuery vs. CSS:我认为任何一种都比重复 DIV 好。如果 CSS 解决方案基于 flexbox,如上所建议,则主要争论点支持 jQuery 的浏览器兼容性。 - Martin Geisse
CSS和JavaScript在不同浏览器间存在兼容性问题。这取决于您想要支持什么。如果您正在尝试支持IE8,则JQuery比CSS更可行(旧版本)。 - Charles Smartt

0

如果您可以在桌面视图中将编辑器和预览设置为固定高度,那么这很容易实现:

HTML

<div class="container">
  <div class="row">
    <div class="col-lg-6">
      <div class="editor">
        editor.
      </div>
    </div>
  </div>
  <div class="errors">
    errors.
  </div>
  <div class="preview">
    preview.
  </div>
</div>

CSS

.container {position: relative;}

.editor {height: 200px; overflow: auto; background: #eee;}
.errors {min-height: 100px; margin: 15px 0; background: #eee;}
.preview {min-height: 100px; background: #ddd;}

@media (min-width: 1200px) {
  .preview {position: absolute; top: 0; right: 15px; width: 575px; height: 200px; }
}

演示

http://www.bootply.com/4jpGHUJWzp


0

我建议您查看this以帮助您解决问题。

我每天都使用Bootstrap,对我来说这很有效。如果要做一些更“激进”的事情,可能需要重新构建基础CSS代码以适应您的需求。

另一个解决方案是使用jQuery在转换为移动设备时附加前置这些div。希望这些内容能对您有所帮助!


不幸的是,我的问题更加复杂,因为我不仅仅想在桌面上显示单行。我已经尝试过推/拉,但是我无法用它来解决这个问题。 - Martin Geisse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接