假設我有一個3列CSS-Grid。有沒有一種方法,使用JavaScript來獲取自動放置的元素的網格行和網格列?
示例:
console.log($('#test').css('grid-row'), $('#test').css('grid-column'));
// expected output: 2 3
// actual output: two empty strings
.grid {
display: grid;
grid-template-columns: repeat( 3, 1fr);
}
<div class="grid">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div id="test"></div>
<div></div>
<div></div>
<div></div>
</div>
這里有一個例子:https://jsfiddle.net/w4u87d2f/7/
在本例中,我可以通過計算元素數并知道網格有三列來找出答案:
grid-column = $('#test').index() % 3 + 1;
grid-row = Math.ceil( $('#test').index() / 3 )
但是這只適用于非常簡單的網格,這也意味著我必須考慮改變列數的斷點。
編輯:這不是獲取HTML元素的位置(X,Y)的副本,因為我對像素坐標不感興趣,而是對CSS-Grid中的行號和列號感興趣。
上面的回答是一個很好的開始,并且使用了jQuery。這是一個純Javascript的等價物,并且還實現了一個& quot偏移& quot如果您已經指定了第一個子元素的網格列(比如在日歷中,您指定了一個月的第一天)
function getGridElementsPosition(index) {
const gridEl = document.getElementById("grid");
// our indexes are zero-based but gridColumns are 1-based, so subtract 1
let offset = Number(window.getComputedStyle(gridEl.children[0]).gridColumnStart) - 1;
// if we haven't specified the first child's grid column, then there is no offset
if (isNaN(offset)) {
offset = 0;
}
const colCount = window.getComputedStyle(gridEl).gridTemplateColumns.split(" ").length;
const rowPosition = Math.floor((index + offset) / colCount);
const colPosition = (index + offset) % colCount;
//Return an object with properties row and column
return { row: rowPosition, column: colPosition };
}
function getNodeIndex(elm) {
var c = elm.parentNode.children,
i = 0;
for (; i < c.length; i++) if (c[i] == elm) return i;
}
function addClickEventsToGridItems() {
let gridItems = document.getElementsByClassName("grid-item");
for (let i = 0; i < gridItems.length; i++) {
gridItems[i].onclick = (e) => {
let position = getGridElementsPosition(getNodeIndex(e.target));
console.log(`Node position is row ${position.row}, column ${position.column}`);
};
}
}
addClickEventsToGridItems();
下面是一個相應的筆,它以指定的偏移量在日歷上顯示它的動作。
這里的另一個解決方案考慮到列跨度
function getGridPosition(elem) {
var gridContainer = elem.parent();
var simpleEl = elem.get(0);
var gridItems = gridContainer.children('div');
const colCount = $(gridContainer).css('grid-template-columns').split(' ').length;
var row = 0;
var col = 0;
gridItems.each(function(index,el) {
var item = $(el);
if(simpleEl==el) {
//console.log("FOUND!")
return false;
}
var gridCols = item.css("grid-column");
if(gridCols != undefined && gridCols.indexOf("span")>=0){
var gridColumnParts = gridCols.split('/');
var spanValue = parseInt(gridColumnParts[0].trim().split(' ')[1], 10);
//console.log("spanValue: " + spanValue);
col = col+spanValue;
}else{
col++;
}
if(col>=colCount){
col=0;
row++;
}
});
return {
row: row,
col: col
};
}