【问题标题】:Bootstrap 3 - align area to a column inside .container, size to edge of view portBootstrap 3 - 将区域与 .container 内的列对齐,大小与视口边缘对齐
【发布时间】:2018-05-01 03:27:06
【问题描述】:

有一个设计要求,我这辈子都做不到。考虑这张显示具有 12 列布局的引导网格的图像:

三个黑色矩形代表:

  1. 一列填充
  2. 主要内容区
  3. 互动地图

3段是问题所在;它需要与.container 内的网格系统完美对齐,并且还需要一直到屏幕边缘不溢出。由于1 + 2 部分加起来不超过 6 列,因此我很难调整部分 3 的大小。

我还没有想出任何可行的解决方案——最接近(仍然很远)是make use of pseudo-elements on the grid system——唯一的问题是不可能将地图放在伪元素中。

请注意,我目前已经有一个 JavaScipt 解决方案,我正在寻找一个仅 CSS/HTML 的解决方案来减少页面加载时的闪烁。


根据要求,这里有一些图片,希望能让要求更清楚。

之前 - 地图和视口边缘之间存在间隙:

之后 - 地图与固定宽度的引导网格和视口边缘对齐:


一些伪代码

<div class="section left-content side-map">
    <div class="container">
        <div class="col-sm-8 col-lg-7 col-lg-offset-1">
            Content - remain unchanged
        </div>
        <div class="col-sm-4 col-lg-3 col-lg-offset-1">
            <div id="contact-map">
                Map here - need to extend to viewport edge
            </div>
        </div>
    </div>
</div>

【问题讨论】:

  • 提供你尝试过的东西..
  • 另外,这张照片根本没有说明问题。在问题中添加当前和期望的结果,使其更清晰。还有一些代码会有所帮助。
  • @Jana 我的问题是我根本想不出没有明显问题的解决方案。我需要它不溢出的事实意味着带有width: 100%;overflow: hidden; 的顶级元素的过宽元素不在图片中,我无法手动增加宽度,因为我需要一个媒体查询每个单个像素。没有发布代码,因为我不知道从哪里开始,也找不到足够相似的问题
  • @Granny 查看编辑
  • @Scoots 我可能像蝙蝠一样瞎,但我看不出结果的图 1 和图 2 之间的区别。

标签: html css twitter-bootstrap twitter-bootstrap-3 responsive-design


【解决方案1】:

希望this pen 会有所帮助。

我在地图列中添加了负右边距以补偿可变的容器间隙。计算方式如下:calc((100vw - @container)/2*-1)(窗口宽度和容器宽度之差的一半)用于每个引导断点。

不幸的是100vw 包含滚动条宽度,因此如果页面内容高于窗口高度,则会出现烦人的水平滚动条。我已经用overflow-x:hidden; div 包裹了容器,所以它只是在地图右侧隐藏了额外的~20px。我想在你的特殊情况下没关系,因为标准的谷歌地图在它的右侧和有用的控件之间有足够的空间。

【讨论】:

  • 这是一个非常酷的解决方案,+1。我将坚持到赏金结束,以防万一有人能想出没有一点溢出的东西,但现在这是一个可靠的答案
  • 我只知道解决这个溢出问题的一种方法,我在我的一个项目中使用了它,但它与引导程序调整容器大小的方式不兼容。这个想法是使用margin-[left/right]: calc( (100vw - 1140px) / 2) 而不是引导程序的margin:auto; width:1140px;。然后右栏中的margin-right: calc( (100vw - 1140px) / 2 * -1); 正是您所需要的。但是(在我的 Mac + Chrome 上)实际容器大小变为 1125 像素而不是 1140 像素,并且它与引导程序的默认网格不匹配。
  • 查看this pen 上的最后一个块。如果您可以覆盖所有容器的默认大小,它将解决问题。
  • 稍作调整,这是可行的。非常感谢
【解决方案2】:

解决此问题的另一种方法是使用 CSS 网格布局。为此,您可以更改页面部分的标记:去掉 Bootstrap 的 .container 包装器并用您自己的网格容器替换 .row 元素,如下面的 HTML:

<div class="section left-content side-map">
  <div class="grid-row">
    <div class="content col">
      Content - remain unchanged
    </div>
    <div class="map-col">
      <!-- the map goes here -->
    </div>
  </div>
</div>

和 CSS:

@media (min-width: 768px) {
  .grid-row {
    display: grid;
    /* create 14 columns: 12 build up the actual grid,
       two more columns emulate left/right "margins" */
    grid-template-columns: 1fr repeat(12, 60px) 1fr;
  }

   .content {
    grid-column: 3 / span 7; /* span 7 columns starting from #2 (technically, the 3rd) */
  }

  .map-col {
    grid-column: 10 / span 5; /* span 5 last columns, including the right "margin" */
  }

}

@media (min-width: 992px) {
  .grid-row {
    grid-template-columns: 1fr repeat(12, 80px) 1fr;
  }
}

@media (min-width: 1200px) {
  .grid-row {
    grid-template-columns: 1fr repeat(12, 95px) 1fr;
  }
}

此解决方案的关键部分是吸收主要 12 个网格列之外的额外水平空间的“边距”也是网格列(具有自动宽度),您可以让您的块像任何其他块一样跨越这些额外的列,因此浏览器会自动为您计算所有大小。

您可以在 Ilya Myasin 的 CodePen 的这个分支中看到这种方法的实际效果:https://codepen.io/SelenIT/pen/mjoomN?editors=1100。我还在 CSS Grid 属性中添加了 -ms-prefixed 等效项,以使演示也可以在 IE10+ 中运行。

【讨论】:

  • 即使使用垂直滚动条也很完美,因此它几乎是一个出色的解决方案。提出这个问题的项目现在已经完全没有问题了,但从那以后我就有了类似的设计特征。对于未来的案例,我会牢记这一点 - 感谢您回答这样一个老问题。正如我之前提到的,我觉得这是最好的答案,所以我实际上会将其标记为已接受。
【解决方案3】:

在引导程序中container 的宽度在px....所以给.container 一个宽度在% or vw

    .container{
      width: 80vw;
    }
or
    .container{
      width: 80%;
    }

【讨论】:

  • 我需要遵循的设计是固定宽度。这并不能解决问题。
  • 如果你要为容器使用固定宽度,它会在响应中产生问题
  • 这就是 bootstrap 的真正目的——使用不同的断点,你可以知道一个单元格在不同的屏幕尺寸下占据了多少列。容器在这些断点处自动缩小。
【解决方案4】:

尝试一下..您必须在拆分之前将网格修复为 12 部分 col-sm-12.. 并删除 col-lg-offset-1 并删除 position:padding;

<div class="section left-content side-map">
    <div class="container">
        <div class="col-sm-12">
            <div class="col-sm-8 col-lg-7">
                Content - remain unchanged
            </div>
            <div class="col-sm-4 col-lg-3">
                <div id="contact-map">
                    Map here - need to extend to viewport edge
                </div>
            </div>
        </div>
    </div>
</div>

【讨论】:

  • 这会移除.container 添加的填充,但不会补偿.container 和浏览器视口边缘之间添加的可变间隙。
  • 你应该给 .container 和浏览器视口边缘之间的间隙...给 .container 填充
  • 但是这个差距是完全可变的,完全由最终用户控制。我可以用 JavaScript 来弥补它(正如我已经作为(希望是)临时解决方案所做的那样)——但使用 CSS 来解决这个差距的唯一方法是为每个像素创建一个 @media screen and (max-width: 1234px) {} 规则——这完全是不切实际。
【解决方案5】:

只需添加 padding-right:0;在地图一侧。 不要使用 col-lg-offset-1 将列从 3 增加到 4。这将解决问题

<div class="section left-content side-map">
    <div class="container" style="border:1px solid #ccc;">
        <div class="row">
        <div class="col-sm-8 col-lg-7 col-lg-offset-1">
            Content - remain unchanged
        </div>
        <div class="col-sm-4 col-lg-4 text-right" style="padding-right:0;">
            <div id="contact-map">
                Map here - need to extend to viewport edge
            </div>
        </div>
    </div>
    </div>
</div> 

【讨论】:

  • 没有填充,.container在引导程序中固定了一个宽度元素,这个解决方案在.container和vviewport边缘之间留下了空白
  • 添加 pull-right 类而不是 text-right 并将小屏幕中的 pull-right 类删除到正常工作
    这里的地图 - 需要延伸到视口边缘
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2020-06-03
  • 2020-01-24
  • 1970-01-01
  • 2015-11-13
  • 2014-10-18
  • 2013-12-31
相关资源
最近更新 更多