【问题标题】:Restructuring sections in responsive design with only CSS仅使用 CSS 重构响应式设计中的部分
【发布时间】:2020-01-08 16:03:11
【问题描述】:

您将如何在移动版和桌面版布局中完全重构网页的各个部分? 我想实现类似于以下的布局:

Desktop:
--------
Primary         |   Complementary 1
                |   Complementary 2
Secondary       |

Mobile:
-------
Complementary 1
Primary
Complementary 2
Secondary

注意:Desktop 中的分隔线应该是一条直线,Complementaries 具有固定宽度,最大宽度,Primary/Secondary 填充页面的其余部分。此外,所有部分的高度都不同。还要注意移动设备中的交错顺序。 所有这些都阻止了我使用简单的 flexbox 方法,使用 order 和 row/column 来实现这一点。

他们的看法是:桌面中清晰的水平分隔只有通过将两列都放在一个 div 中才真正可行 - 但这本质上会阻止移动布局。 如果有办法通过 css 完全忽略包装 div,那可能是可能的,但我从来没有想过。

感谢任何想法 - 使用 Javascript 这当然是可能的,但如果有一个聪明的、或多或少纯 CSS 的解决方案,我会非常喜欢。

【问题讨论】:

  • 只需获得一个响应式 css 网格(或整个 UI 框架)并学习有关如何使用它的语义,总体上让您的生活更轻松。就像bootstrapfoundation,或者甚至是很好的'ol just plain grid。无论哪种方式,这都是一个非常广泛的问题。
  • 这个网站的整个框架是不明智的,因为一半的 CSS 代码必须是定制的(否则我会用 DOM 复杂性来完成所有这些专业)。无论如何,忘记了网格(2年前的最后一个网站)。似乎他们也支持订单,所以我认为这可能是可能的......谢谢!
  • 如下所述,网格似乎存在一个问题,即您必须明确说明 Primary 或 Complementary1 中的哪一个更大 - 除非有办法解决
  • 我现在要研究的另一条路径:回到 flexbox,但强制分栏。垂直弹性盒,强制两列(只是模糊地知道如何通过基础/增长/等实现,也许这是不可能的,因为高度可以无限增长)然后他们可以轻松地垂直分配空间。在移动设备上,然后是简单的 flexbox,对项目进行排序。
  • 虽然还有另一个限制,我不能做一个列跨度——这不是问题的一部分,但我计划在上面有另一个部分,要么跨越两列或在左边。使用网格容易,使用 flexbox 很难......

标签: html css media-queries responsive


【解决方案1】:

如上面的 cmets 所述,这可以相对容易地实现,使用 CSS 声明 display: grid 并将其设置为所需大小的媒体查询。

如果您首先以您希望将内容显示为单列的方式构造内容(即Complementary 1Primary、...),那么您可以简单地使用min-width 创建一个媒体查询(无论您希望最小宽度为),然后使用网格相应地设置内容。例如:

/* Set grid layout for screens larger than 700px only */
@media (min-width: 700px) {
  .grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-column-gap: 2em;
  }
  
  /* place sections into relevant columns/rows */
  .grid main {
    grid-column-start: 1;
    grid-row-start: 1;
  }
  
  .grid section {
    grid-column-start: 1;
    grid-row-start: 3;
  }
  
  .grid aside {
    grid-column-start: 2;
    grid-row-start: 1;
  }
  
  .grid main + aside {
    grid-column-start: 2;
    grid-row-start: 2;
  }
  
  /* Add a rule between the aside and the main content */
  aside {
    padding-left: 2em;
    border-left: 1px solid #aaa;
  }
}
<section class="grid">
  <aside>
    <p>Complementary 1</p>
  </aside>
  
  <main>
    <h1>Main content</h1>
    <p>Your main content can go here...</p>
  </main>
  
  <aside>
    <p>Complementary 2</p>
  </aside>
  
  <section>
    <h1>Secondary content</h1>
    <p>Your secondary content can go here...</p>
  </section>
</section>

需要注意的一点是,在上面的示例中,您的“次要内容”似乎开始于“补充”内容的下方。我不确定这是否只是格式错误 - 如果这不是故意的,您可以适当调整 grid-row-start

编辑:

您可以使用display: contain 使列与大小无关,但请注意 - 支持此功能的是pretty terrible!如果可访问性不是特别关注的问题,这就足够了。

如果可访问性是一个问题,您可以使用 JavaScript 相对轻松地实现以下目标,只需将 mainsection 元素包装在一个 div 中,将 asides 包装在另一个 div 中取决于屏幕尺寸。这将解决对display: contain 的不良支持,这只会使有问题的元素成为invisible 无论如何(因此使用JavaScript 删除包装&lt;div&gt; 将有效地执行与将其设置为display: contain 相同的事情)。

希望这能给你一个前进的方向。

.grid {
  display: flex;
  flex-wrap: wrap;
}

.grid > div {
  display: contents;
}

.grid aside {
  order: 1;
}

.grid aside + aside {
  order: 3;
}

.grid main {
  order: 2;
}

.grid section {
  order: 4;
}

.grid main,
.grid section,
.grid aside {
  width: 100%;
}

/* Set grid layout for screens larger than 700px only */
@media (min-width: 700px) {
  .grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-column-gap: 2em;
  }
  
  .grid > div {
    display: block;
  }
  
  /* Add a rule between the aside and the main content */
  .grid > div + div {
    padding-left: 2em;
    border-left: 1px solid #aaa;
  }
  
  /* Set order back to 0 */
  .grid section,
  .grid main,
  .grid aside {
    order: unset;
  }
}
<section class="grid">
  <div>
    <main>
      <h1>Main content</h1>
      <p>Your main content can go here...</p>
    </main>

    <section>
      <h1>Secondary content</h1>
      <p>Your secondary content can go here...</p>
    </section>
  </div>
  
  <div>
    <aside>
      <p>Complementary 1</p>
      <p>Complementary 1</p>
      <p>Complementary 1</p>
      <p>Complementary 1</p>
      <p>Complementary 1</p>
      <p>Complementary 1</p>
    </aside>

    <aside>
      <p>Complementary 2</p>
    </aside>
  </div>
</section>

【讨论】:

  • 感谢您的回答!那只是说它们可以是不同的高度-我可以修改您的代码,以便它们可以彼此相邻,但是有一个限制。通常,aside1 比 main 大,但并非总是如此 - 但是对于网格,我必须事先选择哪个更大。这里有一些需要说明的地方: 如果 main 大于 side1,我需要:“main side1”“main side2”“section aspect2” 如果 main 小于 side1,我需要:“main aspect1”“section aspect1””部分旁边2"
  • ^^ 简而言之,除非可以解决独立高度的问题,否则这将需要再次代码以某种方式解决(并且 main 的高度可以改变,扩展/隐藏类型,所以这会变得一团糟)
  • 好的 - 如果你查看我最近的编辑,希望这会给你一个更好的方向:)
  • 对,我认为没有任何类型的 javascript 就没有办法。显示:内容;这正是我在考虑列方法时想要的,可访问性甚至都不是问题,因为列只是 div - 但由于支持率甚至低于 90%,我会选择 javascript。感谢您的帮助。
  • 等一下,我想我有一个想法 - 可能行不通,但是桌面中的网格使用“主侧”区域然后将多个部分分配给它们中的任何一个呢?假设它们保持初始顺序并像普通 div 一样扩展,这基本上消除了列 div 的必要性。会尝试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 2014-01-30
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
相关资源
最近更新 更多