如何使用弹性框重新排序 div?

2023-11-30

我试图为我的 DOM 保持 seo 友好和语义结构,而不重复整个元素以在不同位置显示它们。

我的布局基于display: flex项目。我尝试实现以下目标:

Preview of mobile and desktop layout

需要了解的重要事项:

  • 我不想根据窗口宽度显示/隐藏 div(以避免不必要的重复)
  • 所有 div 都没有已知或固定的高度
  • 在桌面上div 应该垂直居中,而右列构建一个标签组(行为就像一个单独的 div)
  • 布局至少需要支持IE11+

有没有一个仅CSS的解决方案来实现这一点?

如果没有,可以很容易地剪下绿色 div 并使用 javascript 将其内容粘贴到粉色 div 中。但我确实担心使用它的性能和“闪烁”,尽管调整浏览器的大小会使它变得更加复杂。我是否让这变得不必要的复杂化?

这是小提琴显示工作解决方案,但使用 javascript:

代码库演示


一般来说,您无法单独使用 Flexbox 来做到这一点,尽管根据每个给定的情况可能会有折衷方案。

单独使用 Flexbox,使用固定高度,您就可以实现这一点

* {
  box-sizing: border-box;
}

body, html {
  margin: 0;
}

.flex {
  width: 90%;
  margin: 5vh auto;
  height: 90vh;
  background: rgba(0, 0, 0, 0.05);  
  display: flex;
  flex-flow: column wrap;
}
.flex div {
  flex: 1;
  width: 50%;
}
.flex div:nth-child(2) {
  order: -1;
}
.flex::before {
  content: '';
  height: 100%;
}

@media (max-width:768px) {
  .flex div {
    width: auto;
  }
  .flex::before {
    display: none;
  }
 .flex div:nth-child(2) {
    order: 0;
  }
}


/*  styling  */
.flex-child {
  color: white;
  font-size: 2em;
  font-weight: bold;
}
.flex-child:nth-child(1) {
  background: #e6007e;
}
.flex-child:nth-child(2) {
  background: #f4997c;
}
.flex-child:nth-child(3) {
  background: #86c06b;
}
<div class="flex">
  <div class="flex-child">
    <div>Top/Right</div>
  </div>
  <div class="flex-child">
    <div>Center/Left</div>
  </div>
  <div class="flex-child">
    <div>Bottom/Right</div>
  </div>
</div>

在这种情况下,如果不允许固定高度,您可以将 Flexbox 和float.

通过使用 Flexbox 将其设置为移动设备,您可以在其中添加center项目首先出现在标记中,然后,order,将其移动到top and bottom.

通过媒体查询,您只需制作柔性容器块元素及其使用float定位left向左和向right向右。

* {
  box-sizing: border-box;
}

body, html {
  margin: 0;
}

.flex {
  max-width: 1024px;
  width: 90%;
  margin: 5vh auto;
  height: 90vh;
  background: rgba(0, 0, 0, 0.05);
  
  display: flex;
  flex-direction: column;
}

.flex-child {
  color: white;
  font-size: 2em;
  font-weight: bold;
  padding: 5%;
  flex-basis: 33.333%;

  display: flex;
  align-items: center;
}

.flex-child:nth-child(1) {
  background: #e6007e;
  order: 1;
}
.flex-child:nth-child(2) {
  background: #f4997c;
}
.flex-child:nth-child(3) {
  background: #86c06b;
  order: 2;
}

@media (min-width: 768px) {
  .flex {
    display: block;
  }
  .flex-child {
    width: 50%;
  }
  .flex-child:nth-child(1) {
    float: left;
    height: 100%;
  }
  .flex-child:nth-child(2),
  .flex-child:nth-child(3) {
    float: right;
    height: 50%;
  }
}
<div class="flex">
  <div class="flex-child">
    <div>Center/Left</div>
  </div>
  <div class="flex-child">
    <div>Top/Right</div>
  </div>
  <div class="flex-child">
    <div>Bottom/Right</div>
  </div>
</div>

Update

这是结合 Flexbox 的另一个版本position: absolute,这也将项目垂直居中桌面模式

更新,添加了一个脚本来控制,以便绝对定位的元素不会变得比正确的项目更大,如果是这样,请调整弹性容器的高度。

请注意,该脚本绝不是经过优化的,它只是为了展示如何在某些情况下进行修复

(function() {

  window.addEventListener("resize", resizeThrottler, false);

  var fp = document.querySelector('.flex');
  var fi = fp.querySelector('.flex-child:nth-child(1)');
  var resizeTimeout;
  function resizeThrottler() {
    // ignore resize events as long as an actualResizeHandler execution is in the queue
    if ( !resizeTimeout ) {
      resizeTimeout = setTimeout(function() {
        resizeTimeout = null;
        actualResizeHandler();
     
       // The actualResizeHandler will execute at a rate of 15fps
       }, 66);
    }
  }

  function actualResizeHandler() {
    // handle the resize event
    if (fp.offsetHeight <= fi.offsetHeight) {
      fp.style.cssText = 'height: '+fi.offsetHeight+'px';
    } else {
      fp.style.cssText = 'height: auto';
    }
  }

  window.addEventListener('load', function() {
    actualResizeHandler();
  })
  
}());
* {
  box-sizing: border-box;
}

body, html {
  margin: 0;
}

.flex {
  position: relative;
  max-width: 1024px;
  width: 90%;
  margin: 5vh auto;
  height: 90vh;
  background: rgba(0, 0, 0, 0.05);
  
  display: flex;
  flex-direction: column;
}

.flex-child {
  color: white;
  font-size: 2em;
  font-weight: bold;
  padding: 5%;
}

.flex-child:nth-child(1) {
  order: 1;
}
.flex-child:nth-child(3) {
  order: 2;
}

.flex-child:nth-child(1) div {
  background: #e6007e;
}
.flex-child:nth-child(2) div {
  background: #f4997c;
}
.flex-child:nth-child(3) div {
  background: #86c06b;
}

@media (min-width: 768px) {
  .flex {
    justify-content: center;
  }
  .flex-child {
    width: 50%;
  }
  .flex-child:nth-child(1) {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
  }
  .flex-child:nth-child(n+2) {
    margin-left: 50%;
  }
}
<div class="flex">
  <div class="flex-child">
    <div>Center/Left<br>with more<br>content<br>than any<br>of the<br>other items<br>other items<br>other items<br>other items<br>other items</div>
  </div>
  <div class="flex-child">
    <div>Top/Right<br>with more<br>content</div>
  </div>
  <div class="flex-child">
    <div>Bottom/Right<br>with more</div>
  </div>
</div>

通过脚本,我们还可以在元素之间重新排序/移动项目。

堆栈片段

您还可以将其与媒体查询结合起来,并使用它来对元素进行实际的重新排序

$( document ).ready(function() {
  $(window).resize(function() {
    if ($( window ).width() < 600 ) {
      $(".one").insertBefore("#b");
    } else {
      $(".one").insertBefore(".two");
    }
  });
});
.outer, #flex, #flex2 {
  display: flex;
  flex-direction: column;
}
#a {
  order: 4;
  background: #ccc;
}
#b {
  order: 1;
  background: #aaa;
}
#c {
  order: 3;
  background: #d33;
}
.one {
  order: 2;
  background: #aaa;
}
.two {
  order: 5;
  background: #aaa;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="outer">
  <div id="flex">
    <div id="a">A</div>
    <div id="b">B</div>
    <div id="c">C</div>
  </div>

  <div id="flex2">
    <div class="one">Show me 2nd</div>
    <div class="two">Show me 5th</div>
  </div>

</div>

更新2(已回答在另一个问题上但后来搬到了这里)

如果我们谈论较小的项目,例如标题或较小的菜单,则可以做许多网站平台提供商(如“squarespace”、“weebly”、“wordpress”等)所做的事情。他们的模板拥有不同的标记结构,其中一个项目有时存在两次,一个在桌面上可见,另一个在移动设备上可见。

另外,由于体积如此之小,在性能方面几乎没有任何影响(就我个人而言,我认为这不会比重复的 CSS 规则(每个屏幕尺寸都有一个规则)有更多问题,并且很乐意这样做而不是引入脚本) 。

小提琴演示

堆栈片段

.container {
  display: flex;
}
.container > div {
  width: 50%;
}
.container div:nth-child(-n+2) {
  border: dashed;
  padding: 10px;
}
.container > div:nth-child(1) {
  display: none;                                  /*  hide outer "Flower"  */
}

@media (max-width:768px) {
  .container {
    flex-direction: column;
  }
  .container div {
    width: auto;
  }
 .container div:nth-child(1) {
    display: block;                               /*  show outer "Flower"  */
  }
  .container div:nth-child(3) div:nth-child(1) {
    display: none;                                /*  hide inner "Flower"  */
  }
}
<div class="container">
  <div>Flower</div>
  <div>Tree</div>
  <div>
    <div>Flower</div>
    <div>Bee</div>
  </div>
</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用弹性框重新排序 div? 的相关文章

  • 如何将滚动条更改为自定义设计? (避免使用默认浏览器外观)

    在新的 Gmail 中 您可以看到有一个滚动条 但它看起来与浏览器滚动条不同 怎样制作呢 你看到的是WebKit 特定的重新设计 http css tricks com custom scrollbars in webkit 浏览器的滚动条
  • Javascript - 将类型化数组保存为 blob 并以二进制数据读回

    我有一个充满二进制数据的类型化数组 它是从 ArrayBuffer 生成的 var myArr new Uint8Array myBuffer 我将其呈现给用户 var blob new Blob myArr type octet stre
  • 使用 Leaflet 加载页面时 moveend 事件多次触发

    我需要在地图平移或缩放时执行一些操作 因此我向该事件附加了一个回调moveend map on moveend function code stuff 它工作正常 但是当页面加载时 该事件被触发三次 我不知道为什么 可能是因为在创建过程中地
  • 如何使用 d3.js 沿 GeoJSON 路径对对象进行动画处理?

    我正在使用 D3 js 从 GeoJSON 文件生成并渲染路径 效果很好 但现在我想沿着该路径为对象设置动画 我知道如何使用 D3 和标准 SVG 来做到这一点 创建过渡并设置其持续时间 对于过渡的每一帧 使用 Complete 查找沿路径
  • HTML5进度条动画

    我在我的应用程序中使用 HTML5 进度条 我想知道是否有什么方法可以控制进度条的动画速度 我想在一定时间间隔后显示进度 我使用 javascript 的 setTimeout 方法做到了这一点 以便它在屏幕渲染后设置值 但动画太快了 有什
  • 在javascript中,对象和命名空间有什么区别?

    在读的时候 面向对象的 JavaScript https developer mozilla org en US docs Web JavaScript Introduction to Object Oriented JavaScript
  • Promise 和 setTimeout

    我正在尝试确定一种方法来 暂停 我的 Promises 代码 直到条件成立为止 也许可以使用递归setTimeout 对于我的简单示例 我手动设置waitValue 我需要等一下 如果waitValue仍然是错误的 那就只能继续等待了 当然
  • QUnit 不会运行测试

    我刚刚开始使用 QUnit 并遇到问题 我目前正在使用 TypeScript 它是一个 JavaScript 编译器 我在与我的主要课程结构平行的课程中进行测试 在每个类中 我都有一个名为 runTests 的函数 为了执行这些测试 我循环
  • JavaScript 中什么可能会打乱我的查询字符串参数构造函数?

    所以这可能是一个很长的机会 但我完全不知道可能导致这个问题的原因 我正在提供一个客户端 JavaScript 它解析嵌入的页面上的某些参数 使用这些参数构建 URL 并使用该 URL 将 iframe 注入到页面中 如下所示 var que
  • 如何将 Jitsi Meet 添加到 Vuejs

    我已在 public html 的正文中加载了 jitsi meet 脚本 并且我有一个组件 如下所示
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • javascript中的快捷方式融合优化

    我听说 lodash 和其他 javascript 库使用一种称为 快捷融合 的技术进行优化 但在任何地方都找不到该技术的详细解释 任何人都可以提供链接或举例解释 快捷方式融合 的含义吗 对于一个非常简短且不清楚的解释 https wiki
  • 将 jQuery 集成到电子应用程序中

    我正在尝试将 jquery 功能添加到用 Electron 编写的桌面应用程序中 使用电子快速启动存储库 我将下载的 jquery 文件添加到main html像这样的文件 or so 然后在index js我正在文件中添加代码create
  • 使用 fullpage.js 触发 Velocity.js/Blast.js

    以下是此处发布的解决方案 Velocity js Blast js 从 0 开始不透明度 https stackoverflow com questions 28614890 velocity js blast js starting op
  • eslint/prettier 在 html 标签中添加不需要的空间

    我正在尝试向我的项目添加配置 以便代码自动格式化 我对 VS Code 中的用户设置进行了一些更新 还安装了 eslint 和 prettier 现在 每当我尝试保存我的代码时 都会从中得到改变 div div div div div di
  • Json 对象 - 获取键和值

    我是 JSON 的新手 所以 如果这是一个非常基本的疑问 请不要责骂我 我有一个 JSON 对象引用 我想获取 Key 对象只有一个键值对 我如何在 Java 中获得它 您可以使用jsonObject keys 获取所有钥匙 然后您可以迭代
  • 模块模式和这个

    我正在为我的 JavaScript 类 使用模块模式 声明有什么重大缺点吗 var self在课外我返回然后将其设置为this在类构造函数内部 这样当我不希望发生上下文切换时 我就不必担心上下文切换 在这个小例子中 可能没有必要 这只是一个
  • 通过innerHTML输入时span不应用css样式

    我有 Angular 应用程序 作为它的一部分 我在 div 中显示查询结果 具有 JSONContainer 的 ID 我想突出显示结果中的特定查询 因此我使用了一个管道来搜索结果 并将文本中的 FIELD VALUE 替换为 span
  • Angular:DOM更新后调用方法

    我正在从 html 调用一个方法 调用休息服务 来增加 减少屏幕上的计数 现在我想调用另一个方法 即 getThreshold 来检查计数是否达到阈值 如果是 我想显示一条确认消息 我想首先更新屏幕上的计数 然后调用该函数来检查它是否达到阈
  • jQuery / Javascript - 检测 WooCommerce 商店通知 html 是否可见

    我正在寻找一种方法来确定使用 JavaScript jQuery 是否显示 WooCommerce 商店通知 商店通知的 HTML 看起来像这样 p class woocommerce store notice demo store sty

随机推荐

  • 使用共享首选项在主屏幕上颤动多个条件

    我有一个登录屏幕 用户登录后 他会转到工作屏幕 如果用户登录并离开应用程序并返回 我将其设置为主屏幕 使用共享首选项作为工作屏幕 但现在我有另一个屏幕女巫是停止工作屏幕 我所做的是用户转到此工作屏幕并开始工作 当他在工作屏幕上按下开始工作时
  • Pandas 可以将 Excel 组结构读取为 Multiindex 吗?

    我有一个 Excel 文件 其中有一些 大部分 很好地分组的行 我在下面构建了一个假示例 有没有办法让 Pandas 中的 read excel 生成保留此结构的多重索引 对于此示例 多重索引将有四个级别 家庭 个人 儿童 可选 投资 如果
  • 如何使用自定义 UIImage 作为 UITabBarItem Badge?

    如何添加自定义 UIImage 作为 UITabBarItem 的徽章 即 当设置 UITabbarItem 的徽章值时 它将显示 考虑子类化 UITabBarItem 并自己绘制它
  • C++ 循环未正确循环

    我有一个 20 x 20 的数组 它输出盘子的热度 我需要重复一个循环 直到数组中没有单元格的变化超过 0 1 度 我通过每次迭代刷新值 如何监视数组中任何单元格的最大变化以确定何时停止迭代 对现在我已经尝试过 但下面的输出不正确 incl
  • 字节字符串与 unicode 字符串。 Python

    你能详细解释一下Python中字节字符串和Unicode字符串之间的区别吗 我读过了this 字节码只是将源代码转换为字节数组 这是否意味着Python有自己的编码 编码格式 还是使用操作系统设置 我不明白 您能解释一下吗 谢谢你 不 Py
  • 在javascript中检索被点击元素的getAttribute

    我的网页上有很多图片 img src 1 jpg br img src 2 jpg 我正在尝试使用下面的 javascript 获取单击图像的 src var getImageName function document onclick f
  • HTTP 404 - 找不到文件 Internet Explorer V6

    我有 ang 404 代码 如果找不到该页面 它将重定向到该网站 它在火狐浏览器中运行正常 但是 当我使用 Internet Explorer v6 该网站将收到错误消息 HTTP 404 文件未找到 Internet Explore 我怎
  • Microsoft Office Access 数据库引擎无法打开或写入该文件

    我收到以下异常 Microsoft Office Access 数据库引擎无法打开或写入 文件 它已被其他用户独占打开 或者您 需要查看和写入其数据的权限 at Econ Open public partial class LBMIS1Ne
  • android 已建立的连接被主机中的软件中止

    2014 03 30 19 55 57 ddmlib An established connection was aborted by the software in your host machine java io IOExceptio
  • 如何通过为所有具有相同日期的文件创建一个存档来存档超过 7 天的文件?

    我正在寻找可以帮助我制定计划任务以自动将日志文件移动到 RAR 存档中的人 它不一定是批处理文件解决方案 如果您有其他想法请分享 我得到了它的基本代码 这是我到目前为止的批处理文件代码 C Program Files WinRAR rar
  • 如何通过我的代码访问 iPhone 的设置?

    我想要做的就是能够判断我的应用程序的用户是否使用 24 小时制 我意识到我无法设置这些设置 我只想读取它们 如果您不知道我在说什么 我希望能够读取用户在 iPhone 内置 设置 应用程序中设置的值 以灰色齿轮为图标的那个 我尝试用谷歌搜索
  • 每页的 Mat 分页器项目在 Angular 9 中不起作用

    我正在从可观察对象渲染表数据 然后将数据源分配给分页器 下一页箭头以及首页和最后一页按钮都可以使用 当我尝试更改每页的项目时 它不起作用 我尝试了 ngAfterViewInit 和页面事件调用 但它们没有任何区别 import Compo
  • 受保护的静态方法可见性

    考虑这种情况 请注意 为了简洁起见 类型和方法体已被省略 当我需要这样做时 这可以让我连接到数据 public abstract class DatabaseAccessor protected static object GetDataF
  • Perl 代码分析工具

    我需要测试 Perl 应用程序 文件操作 数据库操作等 我正在寻找 Perl 代码的配置工具 Linux 中是否有类似 gprof 的 Perl 代码分析工具 有些人可能建议使用 Devel DProf 作为最标准的方法 但如果你仔细观察
  • 仅当用户不在另一个表中时才从一个表中选择用户

    我们有两张表 用户 id name borrower 1 Peter 1 2 John 1 3 Mark 1 4 David 0 贷款 id from to amount 1 1 2 100 我需要输出 Peter 没有借过任何钱并且借款人
  • 运行带有太多空格的程序

    我有一个在命令提示符下运行良好的命令 CMD C C Program Files x86 VideoLAN VLC VLC vvv http www foo com 8085 video mp4 playlist m3u8 wmsAuthS
  • 如何递归遍历目录树并仅查找文件?

    我正在研究一个scp调用以下载远程系统上存在的文件夹 下载的文件夹有子文件夹 在这些子文件夹中有一堆文件 我想将它们作为参数传递给 python 脚本 如下所示 scp r email protected SomeName SomeName
  • 如果有新版本可用,如何强制更新 Android 应用程序?

    我正在开发一个应用程序 如果游戏商店上有新版本 我想向应用程序用户强制更新 该应用程序应该向用户显示一条对话框消息 public class ForceUpdateAsync extends AsyncTask
  • 选择套接字输出接口:SO_BINDTODEVICE 与连接前绑定

    我正在尝试在具有两个接口的系统上设置套接字的输出接口 我用谷歌搜索了很多 发现了不同的答案 有人说我可以bind调用之前的套接字connect选择一个特定的接口 如套接字如何知道要使用哪个网络接口控制器 但其他人说这还不够 如http co
  • 如何使用弹性框重新排序 div?

    我试图为我的 DOM 保持 seo 友好和语义结构 而不重复整个元素以在不同位置显示它们 我的布局基于display flex项目 我尝试实现以下目标 需要了解的重要事项 我不想根据窗口宽度显示 隐藏 div 以避免不必要的重复 所有 di