CONVERT setProperty with CSS variables to object and functions version 2
Fri Feb 21 2025 03:25:09 GMT+0000 (Coordinated Universal Time)
Saved by @davidmchale #setproperty #cssvariables
// html
<div id="app">
<div class="grid-container">
<div class="box"><a href="#">remove</a></div>
<div class="box"><a href="#">remove</a></div>
<div class="box"><a href="#">remove</a></div>
<div class="box"><a href="#">remove</a></div>
</div>
</div>
//css
.grid-container {
background-color: aliceblue;
width: 100%;
min-height: 200px;
display: grid;
column-gap: 1rem;
grid-template-columns: repeat(
var(--col-grid-count, 4),
var(--col-make-width, 1fr)
);
}
.box {
width: 100%;
height: 100%;
background-color: firebrick;
padding-top: 1rem;
}
.box a {
text-align: center;
margin-top: 1rem;
color: white;
display: flex;
justify-content: center;
cursor: pointer;
text-decoration: none;
}
//js
(function () {
"use strict";
const gridContainer = document.querySelector(".grid-container");
if (!gridContainer) return;
function changeItemWith(value) {
gridContainer.style.setProperty("--col-make-width", value);
}
function updateGrid(number) {
const updatedBoxes = document.querySelectorAll(".box").length;
gridContainer.style.setProperty("--col-grid-count", updatedBoxes);
const widthOptions = {
1: () => changeItemWith("minmax(230px, 250px)"),
2: () => changeItemWith("minmax(295px, 320px)"),
3: () => changeItemWith("minmax(245px, 420px)"),
4: () => changeItemWith("minmax(243px, 500px)"),
};
console.log(`Number of boxes: ${number}`);
console.log(`Function in widthOptions:`, widthOptions[number]);
// Fix: Call the function if it exists, otherwise apply default width
// see note on how widthOptions[number](); works
if (widthOptions[number]) {
widthOptions[number]();
} else {
changeItemWith("205px"); // Default case
}
}
function onHandleLink(event) {
event.preventDefault();
const link = event.currentTarget;
const box = link.parentElement;
if (box) {
box.remove();
// Fix: Pass the correct length
updateGrid(document.querySelectorAll(".box").length);
}
console.log(box);
}
function listeners() {
document.querySelectorAll(".box").forEach((box) => {
const link = box.querySelector("a");
if (link) {
link.addEventListener("click", onHandleLink);
}
});
}
function init() {
// Fix: Pass the correct length
updateGrid(document.querySelectorAll(".box").length);
listeners();
}
init();
})();
/*
NOTE; Understanding widthOptions
widthOptions is an object where each key (like 1, 2, etc.) maps to a function:
const widthOptions = {
1: () => changeItemWith("minmax(230px, 250px)"),
2: () => changeItemWith("minmax(295px, 249px)"),
3: () => changeItemWith("minmax(245px, 1fr)"),
4: () => changeItemWith("minmax(243px, 1fr)"),
};
Each value is an anonymous function (() => {}) that calls changeItemWith(...).
Accessing a Function in an Object
If number is 1, then: widthOptions[1]
is the same as: () => changeItemWith("minmax(230px, 250px)");
which in the widthOptions object is: 1: () => changeItemWith("minmax(230px, 250px)")
So if we call it with (), it executes:
widthOptions[1]();
*/
// See codesandbox for my implementation
// https://codesandbox.io/p/sandbox/q3926h?file=%2Fsrc%2Findex.mjs%3A28%2C6-28%2C30



Comments