CSS网格:自动放置在命名列中带有全角元素的居中布局

问题描述

我创建了一个带有grid-css的布局,该布局包含居中的12列(最大宽度)和2列,这些列仅在大屏幕上显示。此技术基于以下article。 (在示例中,将max-width设置为一个较小的数字,以便于检查)

我要解决的问题是:
我想使用类来确定一个元素应该有多少列宽。就像您在下面的示例中看到的那样,我有一个col-10和col-6类。类似于引导框架。

我是否可以说某种方式,例如,具有类“ col”的元素应始终位于 main 列之内,而忽略 full中包含的外部列列?

目前,我找到的唯一解决方案是给出连续的第一个元素,即正确的起点。 (在示例中,它是“ main-start”类)

示例代码:

*{
  margin: 0;
  padding: 0;
  font-family: sans-serif;
}

nav{
  display:flex;
  justify-content: flex-end;
}

a{
  text-decoration:none;
  color:white;
  font-size: 10px;
  background-color: orange;
  padding: 0.5em;
}

.grid{
    display: grid;
    grid-template-columns:
        [full-start]minmax(0,1fr)
        [main-start] repeat(12,minmax(0,40px)) [main-end]
        minmax(0,1fr)
        [full-end];
}

.main-start{
  grid-column-start: main-start;
}

.col-6{
  grid-column-end: span 6;
}

.col-10{
  grid-column-end: span 10;
}

.full-width{
  grid-column:full;
}

.gradient{
  color: white;
  text-align:center;
  height: 90px;
  background:linear-gradient(to bottom right,red,coral);
}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width,initial-scale=">
  <title>Grid centered design with full width elements</title>
</head>
<body>
  <header class="grid">
    <h1 class="col-6 main-start">MyWebsiteTitle</h1>
    <nav class="col-6">
      <a href="#">Page1</a>
      <a href="#">Page2</a>
      <a href="#">Page3</a>
    </nav>
    <p class="col-10">This is not inside main because it has no main-start class</p>
    <div class="full-width gradient">A full-width banner</div>
  </header>
</body>
</html>

解决方法

一个想法是考虑将一个空元素填充到第一列中,这将迫使所有元素从所需的位置开始

* {
  margin: 0;
}

nav {
  display: flex;
  justify-content: flex-end;
}

.grid {
  display: grid;
  grid-template-columns: 
    [full-start]minmax(0,1fr) 
    [main-start] repeat(12,minmax(0,40px)) [main-end] minmax(0,1fr) [full-end];
}
/* added */
.grid::before {
  content:"";
  grid-column:full-start/main-start;
  grid-row:span 100; /* take a lot of rows */
}
/**/

.col-6 {
  grid-column-end: span 6;
}

.col-10 {
  grid-column-end: span 10;
}

.full-width {
  grid-column: full;
}

.gradient {
  color: white;
  text-align: center;
  height: 90px;
  background: linear-gradient(to bottom right,red,coral);
}
<header class="grid">
  <h1 class="col-6">MyWebsiteTitle</h1>
  <nav class="col-6">
    <a href="#">Page1</a>
    <a href="#">Page2</a>
    <a href="#">Page3</a>
  </nav>
  <p class="col-10">This is not inside main because it has no main-start class</p>
  <div class="full-width gradient">A full-width banner</div>
</header>

,

针对具有上一个答案的行间距问题的回答。这是一个用空白代替行距的示例:

*{
  margin: 0;
  padding: 0;
  font-family: sans-serif;
}

nav{
  display:flex;
  justify-content: flex-end;
}

a{
  text-decoration:none;
  color:white;
  font-size: 10px;
  background-color: orange;
  padding: 0.5em;
}

.grid{
    display: grid;
    /* added */
    column-gap: 0.5rem;
    /**/
    grid-template-columns:
        [full-start]minmax(0,1fr)
        [main-start] repeat(12,40px)) [main-end]
        minmax(0,1fr)
        [full-end];
}

/* added */
.grid::before {
  content:"";
  grid-column:full-start/main-start;
  grid-row:span 100; /* take a lot of rows */
}

.grid > *:not(:last-child) {
    /* row-gap */
    margin-bottom: 0.5rem;
}
/**/

.main-start{
  grid-column-start: main-start;
}

.col-6{
  grid-column-end: span 6;
}

.col-10{
  grid-column-end: span 10;
}

.full-width{
  grid-column:full;
}

.gradient{
  color: white;
  text-align:center;
  height: 90px;
  background:linear-gradient(to bottom right,coral);
}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width,initial-scale=">
  <title>Grid centered design with full width elements</title>
</head>
<body>
  <header class="grid">
    <h1 class="col-6 main-start">MyWebsiteTitle</h1>
    <nav class="col-6">
      <a href="#">Page1</a>
      <a href="#">Page2</a>
      <a href="#">Page3</a>
    </nav>
    <p class="col-10">This is not inside main because it has no main-start class</p>
    <div class="full-width gradient">A full-width banner</div>
  </header>
</body>
</html>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...