【问题标题】:Array Vertical order in different columns by alphabet按字母表排列在不同列中的垂直顺序
【发布时间】:2018-10-14 21:29:18
【问题描述】:
A | B | D | F
A | C | E | G
B | C |

我有一组数据:

  • 需要按字母垂直对齐;
  • 需要为大屏幕订购 4 列数组;
  • 需要为中等屏幕订购 3 列数组;
  • 需要为小屏幕订购 2 列数组;
  • 必须按字母顺序排列;

3 列示例

A | C | E
A | C | F
B | D | G
B |
CSS 中的

column-count 是目前最好的,但在响应式上工作错误

我在考虑 Vue.js,它取决于屏幕大小(可以添加/删除列)并在列之间移动数组数据

我为 HTML 使用引导程序

这里是我做的代码,但是还不够工作需要https://codepen.io/alexander-chumak/pen/JvyLPJ

【问题讨论】:

  • 我不明白逻辑。如何仅通过调整屏幕大小从A | B | D | F 变为A | C | E
  • 您可以使用屏幕大小来确定是中小还是大,并打破 td 循环,例如它在 5 后更改 td
  • “工作错误”是什么意思?
  • @myself 哦,我明白了。这些是垂直

标签: javascript html css vue.js


【解决方案1】:

由于您使用的是 Vue,因此我将按列对项目使用计算值。这样,当 items 或 columnCount 发生变化时,您无需担心自己重新运行任何内容。

你可以这样做:

data () {
  return {
    columnCount: 2,
    items: [],
  }
},

created () {
  // You should debounce this callback.
  window.addEvenetListener('resize', this.updateColumnCount)
  this.updateColumnCount()
},

destroyed () {
  window.removeEventListener('resize', this.updateColumnCount)
},

methods: {
  updateColumnCount () {
    // updat the columnCount here like: this.columnCount = 2
  },
},

computed: {
  itemsByColumn () {
    return this.items.reduce((columns, item, index) => {
      const columnNumber = index % this.columnCount

      if (!columns[columnNumber]) {
        columns[columnNumber] = []
      }

      columns[columnNumber].push(item)

      return columns
    })
  },
},

然后,在您的模板中,您可以这样做:

<div class="flex">
  <div class="column" v-for="(column, index) in itemsByColumn" :key="index">
    <div class="item" v-for="item in column" :key="item.id">
      {{ item.name }}
    </div>
  </div>
</div>

此代码未经测试,但它应该能让你大部分时间到达那里。

【讨论】:

    【解决方案2】:

    您可以使用下面的代码来管理基于 size 的 td 数量,您可以将下面的代码放入一个函数中,并在 jQuery 提供的窗口调整大小事件上调用该函数。就像我在示例中所做的那样

    function drawTable(){
        var array = ["a","b","c","d","e","f","g","h","i","j","k","l","m"];
        var windowSize = $(window).width();
        var maxWidth = 50;
        var maxColumn = 2;
    
        if(windowSize < 400){
            maxWidth = 33;
            maxColumn = 3;
        }
        if(windowSize < 800){
            maxWidth = 25;
            maxColumn = 4;
        }
        
        var maxItemInColumn = Math.ceil(array.length/maxColumn);
        
        var result = "<div style='width:100%;'>";
        result += "<ul style='float:left;'>";
        for (var j = 0; j < array.length; j++) {
            result += "<li>" + array[j] + "</li>";
            if ((j + 1) % maxItemInColumn === 0) {
                result += "</ul><ul style='float:left;'>";
            }
        }
        result += "</ul>";
        result += "</div>";
    
        document.body.innerHTML = result;
    }
    drawTable();
    $( window ).resize(function() {
        drawTable()
    });
    &lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

    【讨论】:

    • 它应该垂直对齐! RTL 和 LTR 没问题
    • @AleksandrChumak 我已经根据您的需要添加了它,请看一下
    • 泰勒,很好的尝试,几乎可以工作,但与 CSS 中的列数相同的错误,如果在您的代码中放置 6 列:3,3,3,3,1,每列空元素它应该是 3,2,2,2,2,2 所以所有列都有元素
    猜你喜欢
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多