/** We want to change the grid repeat() depending on the items in a grid where repeat(4, 1fr) are dynamic values we can change in JS using setProperty() note: setProperty(property-name, value) */ // our html = we add a data-grid attribure to show the grid number <div class="qld-compare_page__courses" data-grid></div> // our css .courses{ //repeat(4, 1fr); replace with 2 new css variables, and a fallback // in this case var(--compare-col-count) has a fallback of 4 repeat(var(--compare-col-count, 4), var(--compare-col-width, 205px)); } // JS function // create the changeGrid function outside the main function below function changeGrid(value){ parentGrid.style.setProperty("--compare-col-width", value); } function adjustGrid(number) { // number will the dynamic value that changes // get the parent to which the grid willl be appplied const parentGrid = document.querySelector(".qld-compare_page__courses"); // if element exists if (parentGrid) { // set the grid attribute in the html to the number value in the param parentGrid.dataset.grid = `courses-${number}`; // now we are using the set Property to get the var give it the number value parentGrid.style.setProperty("--compare-col-count", number); /** switch (number) { // if numbers 1, 2, 3 or 4 is reached then do your thing! case 1: // here we are using setProperty() to target that css var, and apply value parentGrid.style.setProperty("--compare-col-width", "minmax(205px, 230px)"); break; case 2: // here we are using setProperty() to target that css var, and apply value parentGrid.style.setProperty("--compare-col-width", "minmax(205px, 249px)"); break; case 3: // here we are using setProperty() to target that css var, and apply value parentGrid.style.setProperty("--compare-col-width", "minmax(205px, 1fr)"); break; case 4: // here we are using setProperty() to target that css var, and apply value parentGrid.style.setProperty("--compare-col-width", "minmax(205px, 1fr)"); break; default: parentGrid.style.setProperty("--compare-col-width", "205px"); break; } } */ /** 1. create object with all options 2. create a function to call inside the object 3. The function returns the code want to repeat with params 4. Call that function using the object[dynamic] number */ // Note we are still using number from the main function as this is the value // that will output 1, 2, 3, 4 const options = { // use cases here for key value pairs 1: () => changeGrid("minmax(205px, 230px)"), 2: () => changeGrid("minmax(205px, 249px)"), 3: () => changeGrid("minmax(205px, 1fr)"), 4: () => changeGrid("minmax(205px, 1fr)"), } // call it // param should be the dynamic value of the oject and the matching number param changeGrid(options[number]) } //use local storage for the number we want adjustGrid(JSON.parse(localStorage.getItem("courses") || "[]").length); // here is the full JS code with CSS variables function cssColWidthVariable(value) { const parentGrid = document.querySelector(".qld-compare_page__courses"); parentGrid.style.setProperty("--compare-col-width", value); } function adjustGrid(number) { const parentGrid = document.querySelector(".qld-compare_page__courses"); if (parentGrid) { parentGrid.dataset.grid = `courses-${number}`; parentGrid.style.setProperty("--compare-col-count", number); const gridOptions = { 1: () => cssColWidthVariable("minmax(205px, 230px)"), 2: () => cssColWidthVariable("minmax(205px, 249px)"), 3: () => cssColWidthVariable("minmax(205px, 1fr)"), 4: () => cssColWidthVariable("minmax(205px, 1fr)"), }; cssColWidthVariable(gridOptions[number] || "205px"); } } // call the function based on a changing number adjustGrid(JSON.parse(localStorage.getItem("courses") || "[]").length);
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter