RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1070269
Accepted
Дмытрык
Дмытрык
Asked:2020-01-15 22:15:26 +0000 UTC2020-01-15 22:15:26 +0000 UTC 2020-01-15 22:15:26 +0000 UTC

排列具有随机平铺宽度的元素

  • 772

有一个具有最大和最小宽度的容器。有一个随机的标签列表。您需要在此容器中精美地排列标签,以便尽可能少的空白空间,而布局应该是流畅的。

标签的顺序并不重要。标签名称必须在 1 行中。标签宽度固定:80px;80像素*2;80像素*3;80像素*4。 主要问题是:是否可以使用 CSS Grid 解决问题,还是需要包含 JS?

下面的代码演示了这个问题 - 从给定大小创建 10 个随机长度的标签

const container = document.querySelector("#app");

for (let i = 0; i < 10; i++) {
  createItem();
}
function createItem() {
  const div = document.createElement("div");
  div.className = "item";
  const text = createText();
  div.innerText = text;
  const baseWidth = 79;
  const baseLength = 7;
  let width = baseWidth;
  if (text.length > baseLength && text.length < baseLength * 2) width *= 2;

  if (text.length >= baseLength * 2 && text.length < baseLength * 3) width *= 3;

  if (text.length >= baseLength * 3 && text.length <= baseLength * 4)
    width *= 4;
  div.style.width = width + "px";
  container.appendChild(div);
}

function createText() {
  const str = "qwertyuiopasdfghjklzxcvbnm";
  const length = Math.floor(Math.random() * (str.length / 1.5 + 1)) + 3;
  return str.slice(0, length);
}
body{
  display: flex;
  justify-content: center;
  align-items: center;
}
#app{
  min-width: calc(90px * 3);
  max-width: calc(90px * 6);
  border: 1px solid;
  display: flex;
  flex-wrap: wrap;
}
.item{
  padding: 5px 15px;
  background-color: #F8FAFF;
  border: 1px solid;
  margin: 0px 5px 12px 5px;
  text-align: center;
}
    <div id="app"></div>

javascript
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    qwabra
    2020-01-15T23:04:18Z2020-01-15T23:04:18Z

    是否有可能用 CSS 解决问题?

    是的你可以。

    const container = document.querySelector("#app");
    for (let i = 0; i < 10; i++) {
      const div = genItem(createText());
      container.appendChild(div);
    }
    
    function genItem(text) {
      const div = document.createElement("div");
      div.className = "item";
      div.innerText = text;
      div.style.width = `${genWidth(text)}px`;
      return div;
    }
    
    function genWidth(text) {
      const baseWidth = 79;
      const baseLength = 7;
      let width = baseWidth;
      if (text.length > baseLength && text.length < baseLength * 2)
        width *= 2;
      if (text.length >= baseLength * 2 && text.length < baseLength * 3)
        width *= 3;
      if (text.length >= baseLength * 3 && text.length <= baseLength * 4)
        width *= 4;
      return width;
    }
    
    function createText() {
      const str = "qwertyuiopasdfghjklzxcvbnm";
      const length = Math.floor(Math.random() * (str.length / 1.5 + 1)) + 3;
      return str.slice(0, length);
    }
    .flex-container {
      display: flex;
      flex-wrap: wrap;
      background-color: DodgerBlue;
    }
    
    .flex-container>div {
      background-color: #f1f1f1;
      margin: auto;
      margin-top: 10px;
      margin-bottom: 10px;
      text-align: center;
    }
    <div id="app" class="flex-container"></div>

    根据材料:

    • https://www.w3schools.com/css/css3_flexbox.asp
    • https://medium.com/@stasonmars/all-about-the-magic-of-padding-in-css-flexbox-afaf6067a7f3
      .child {
          margin: auto;
      }
      

    是的,我认为这更好

    • https://css-tricks.com/flex-grow-is-weird/
      flex-grow

    const container = document.querySelector("#app");
    
    for (let i = 0; i < 10; i++) {
      const div = genItem(createText());
      container.appendChild(div);
    }
    
    function genItem(text) {
      const div = document.createElement("div");
      div.className = "item";
      div.innerText = text;
      return div;
    }
    
    function createText() {
      const str = "qwertyuiopasdfghjklzxcvbnm";
      const length = Math.floor(Math.random() * (str.length / 1.5 + 1)) + 3;
      return str.slice(0, length);
    }
    .flex-container {
      display: flex;
      flex-wrap: wrap;
      background-color: DodgerBlue;
      padding: 10px;
    }
    
    .flex-container>div {
      flex-grow: 1;
      background-color: #f1f1f1;
      margin: 10px;
      padding: 4px;
      text-align: center;
    }
    <div id="app" class="flex-container"></div>

    • 3
  2. Дмытрык
    2020-01-16T17:11:00Z2020-01-16T17:11:00Z

    到目前为止,我使用 JS 解决了这个问题

    const container = document.querySelector("#app");
    const list = [];
    const margin = 12;
    
    for (let i = 0; i < 10; i++) {
      createItem();
    }
    elemSort();
    window.addEventListener("resize", elemSort);
    
    function createItem() {
      const div = document.createElement("div");
      div.className = "item";
      const text = createText();
      div.innerText = text;
      div.style.width = getWidth(text.length) + "px";
      list.push(div);
      container.appendChild(div);
    }
    
    function elemSort() {
      const width = container.getBoundingClientRect().width;
      const arr = Array.from(container.children);
      let result = [];
      while (arr.length !== 0) {
        const row = createRow(arr, width);
        result.push(row);
      }
      setOrder(result.flat());
    }
    
    function setOrder(arr) {
      arr.forEach((item, index) => {
        item.style.order = index;
      });
    }
    
    function createRow(baseArr, baseWidth) {
      const result = [];
      let sum = 0;
      for (let i = 0; i < baseArr.length; i++) {
        const item = baseArr[i];
        const itemWidth = item.getBoundingClientRect().width + margin;
        if (sum + itemWidth < baseWidth) {
          sum += itemWidth;
          result.push(item);
          baseArr.splice(i, 1);
          i--;
        }
      }
      return result;
    }
    
    function getWidth(length) {
      const baseWidth = 78;
      const baseLength = 7;
      let width = baseWidth;
      if (length > baseLength && length < baseLength * 2) width = width * 2 + margin;
      if (length >= baseLength * 2 ) width = width * 4 + margin * 3;
      return width;
    }
    function createText() {
      const str = "qwertyuiopasdfghjklzxcvbnm";
      const length = Math.floor(Math.random() * (str.length / 1.5 + 1)) + 3;
      return str.slice(0, length);
    }
    body{
      display: flex;
      justify-content: center;
      align-items: center;
    }
    #app{
      min-width: calc((78px * 4) + (12px * 4));
      max-width: calc(75px * 9);
      border: 1px solid;
      display: flex;
      flex-wrap: wrap;
    }
    .item{
      padding: 5px 10px;
      background-color: #F8FAFF;
      border: 1px solid;
      margin: 0px 6px 12px 6px;
      text-align: center;
      box-sizing: border-box;
      min-width: 78px
    }
        <div id="app"></div>

    顺便说一句,这可以应用在本网站的“跟踪标签”块中

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5