【问题标题】:Extend column background into grid gutters将列背景扩展到网格排水沟
【发布时间】:2018-11-03 01:22:51
【问题描述】:

考虑一下……

您正在使用网格系统创建三列布局。您的容器大小固定并使用 margin:0 auto 居中。

您的设计规范要求第一列的背景颜色延伸到浏览器的左边缘。

知道如何实现这一目标吗? I could make it work this way,这是一种 hack,它可能不适用于某些类型的图像背景。

HTML:

<main>
  <section>
    <div class="container">
      <header>
        <h1>Hey There!</h1>
      </header>
      <div>
        <h2>Column 2</h2>
      </div>
      <div>
        <h2>Column 3<h2>
      </div>
    </div>
  </section>
</main>

CSS

main {
  min-width: 800px;
}

section {
  background-image: linear-gradient(to right, #dfdfdf 50%, #fff 50%);
  border-bottom: 1px solid #dfdfdf;
}

.container {
  width: 500px;
  margin:0 auto;
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
}

section > * {
  min-height: 200px;
}

.container > div {
  background-color: #fff;
  padding-left: 30px;
}

【问题讨论】:

    标签: css frontend css-grid


    【解决方案1】:

    您也可以使用伪元素生成背景。

    left 值足够大,可以使背景延伸到屏幕之外。如果您需要背景图像的精确位置,这可能会出现问题。

    另外,您可以考虑使用grid-gap 而不是将padding-left 添加到网格项目中。

    body {
      margin: 0;
    }
    
    main {
      min-width: 800px;
    }
    
    section {
      border-bottom: 1px solid #dfdfdf;
    }
    
    .container {
      width: 500px;
      margin: 0 auto;
      display: grid;
      grid-template-columns: 1fr 1fr 1fr;
    }
    
    section>* {
      min-height: 200px;
    }
    
    .container>div {
      background-color: #fff;
      padding-left: 30px;
    }
    
    header {
      position: relative;
    }
    
    header:before {
      content: '';
      background: lightgrey;
      display: block;
      position: absolute;
      left: -50vw;
      right: 0;
      bottom: 0;
      height: 100%;
      z-index: -1;
    }
    <main>
      <section>
        <div class="container">
          <header>
            <h1>Hey There!</h1>
          </header>
          <div>
            <h2>Column 2</h2>
          </div>
          <div>
            <h2>Column 3</h2>
          </div>
        </div>
      </section>
    </main>

    【讨论】:

    • 这次更快:p
    • 感谢 sol 和 @Temani Afif!从数学上讲,我们的两个解决方案都有一个基本的假设缺陷——如果 50% (50vw) 不够怎么办——如果在更大的屏幕上排水沟区域空间大于 50% 怎么办?我知道今天这样的设备很难找到。但是,我会采用您的解决方案并将其标记为可能的答案。 :)
    • @PratikMehta 你只需增加它 :) 让它 100vw 你会确定它就足够了 ;)
    • 确实如此。然后它成为完全证明的解决方案。很好的谈话!
    【解决方案2】:

    您可以尝试使列拉伸容器的整个宽度,然后将内部的内容对齐以显示为三个居中的列。

    .container {
      display: grid;
      grid-template-columns: 1fr auto 1fr;
      grid-column-gap: 20px;
      min-height: 50px;
    }
    
    header {
      background-color: lightgray;
      display: flex;
      justify-content: flex-end;
    }
    
    section {
      border-bottom: 1px solid #dfdfdf;
    }
    
    body {
      margin: 0;
    }
    
    p { text-align: center;}
    p > span { padding: 5px; background-color: aqua; }
    <main>
      <section>
        <div class="container">
          <header>
            <h1>Hey There!</h1>
          </header>
          <div>
            <h2>Column 2</h2>
          </div>
          <div>
            <h2>Column 3</h2>
          </div>
        </div>
      </section>
    </main>
    <p><span>True Center</span></p>

    codepen demo

    【讨论】: