const container = document.getElementById('GridContainer');
const getPositionInGrid = (element, grid) => {
const gridStyles = getComputedStyle(grid);
const display = gridStyles.getPropertyValue('display');
if (display !== 'grid') {
throw new Error('grid element does not have display value of grid;');
}
const rows = gridStyles.getPropertyValue('grid-template-rows').split(' ');
const columns = gridStyles.getPropertyValue('grid-template-columns').split(' ');
const gap = parseInt(gridStyles.getPropertyValue('grid-gap'));
const rowPositions = rows.map((row, i) => {
const rowPosition = parseInt(row);
return !i ? 0 : (rowPosition + gap) * i;
});
const columnPositions = columns.map((column, i) => {
const columnPosition = parseInt(column);
return !i ? 0 : (columnPosition + gap) * i;
});
const {
offsetTop,
offsetLeft
} = element;
let row = null;
rowPositions.forEach((position, i) => {
const nextRow = rowPositions[i + 1];
if ((!nextRow && row === null) || (offsetTop >= position && offsetTop < nextRow)) {
row = i + 1;
}
});
let column = null;
columnPositions.forEach((position, i) => {
const nextColumn = columnPositions[i + 1];
if ((!nextColumn && column === null) || (offsetLeft >= position && offsetLeft < nextColumn)) {
column = i + 1;
}
});
return { row, column, y: offsetTop, x: offsetLeft};
};
container.addEventListener('click', event => {
const {
target
} = event;
if (target.classList.contains('item')) {
const {
row,
column,
x,
y
} = getPositionInGrid(target, container);
console.log('Row:', `${row},`, 'Column:', column, '|', 'x:', `${x},`, 'y:', y);
}
});
#GridContainer {
width: 65vw;
height: 80vh;
margin: 8vh auto 0 auto;
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-template-rows: repeat(3, 1fr);
grid-gap: 10px;
position: relative;
}
.column1 {
grid-column-start: 2;
}
.item {
background-color: red;
}
.column0 {
grid-column-start: 1;
}
<div id="GridContainer">
<div class="item row1 column1"></div>
<div class="item row1 column2"></div>
<div class="item row1 column3"></div>
<div class="item row2 column0"></div>
<div class="item row2 column1"></div>
<div class="item row2 column2"></div>
<div class="item row2 column3"></div>
<div class="item row3 column1"></div>
<div class="item row3 column2"></div>
<div class="item row3 column3"></div>
<div class="item row3 column4"></div>
</div>