JSFiddle - React, Tailwind, and code Playground
HTML
<table class="tbl" cellspacing="0" cellpadding="0" border="1">
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
</tr>
<tr>
<td>11</td>
<td>12</td>
<td class="nd2">13</td>
<td>14</td>
<td>15</td>
<td>16</td>
<td class="nd2">17</td>
</tr>
<tr>
<td class="nd2">21</td>
<td class="nd">22</td>
<td>23</td>
<td class="nd">24</td>
<td>25</td>
<td class="nd2">26</td>
<td>27</td>
</tr>
<tr>
<td>31</td>
<td class="nd2">32</td>
<td class="nd">33</td>
<td>34</td>
<td>35</td>
<td class="nd2">36</td>
<td>37</td>
</tr>
</table>
CSS
body{font-size: 20pt;}
table{
margin:0;
padding:0;
border:1px solid #888;
}
td.nd{
color:#0f0;
}
td.nd2{
color:#f00;
}
JavaScript
// функция обмена элементов
jQuery.fn.swapWith = function(to) {
return this.each(function() {
var copy_to = $(to).clone();
var copy_from = $(this).clone();
$(to).replaceWith(copy_from);
$(this).replaceWith(copy_to);
});
};
function DownCell(table, td_class){
var rowcount = table.find("tr").length;
var colcount = table.find("tr")[0].cells.length;
var cell;
for(var col=0;col<colcount;col++){
var count=0;
for(var row=0;row<rowcount;row++){
cell=table.find("tr:eq("+row+")").find("td:eq("+col+")");
if(cell.hasClass(td_class) && !cell.hasClass("down_cell")){
// теперь перемещаем текущую ячейку вниз со сдвигом вверх
cell.addClass("down_cell");
for(var k=row;k<rowcount-1;k++){
var current_cell = table.find("tr:eq("+k+")").find("td:eq("+col+")");
var down_cell = table.find("tr:eq("+(k+1)+")").find("td:eq("+col+")");
down_cell.swapWith(current_cell);
}
row--;
}
}
}
return false;
}
setTimeout(function(){
DownCell($('table.tbl'), 'nd');
DownCell($('table.tbl'), 'nd2');
}, 2000);