如何通过单个函数参数设置容器的宽高比例一致?
解决网格容器宽高不一致的问题
问题分析
当前的核心问题:
- 固定tile宽高导致
tiles数量变化时,总尺寸无法适配容器的正方形比例 - Flex布局下,容器固定了宽度但高度由tile总高度决定,导致宽高失衡
- 输入验证逻辑错误,无法有效拦截大于100的无效输入
- 多次创建网格时未清空旧内容,造成tile叠加
解决方案
强制容器为正方形
给.grid添加aspect-ratio: 1/1属性,让容器高度自动等于宽度,从根源上保证正方形比例。改用Grid布局适配网格场景
Grid布局天生适合网格排列,替代Flex布局:- 将
.grid的display改为grid,通过grid-template-columns: repeat(N, 1fr)让每行自动平分N个tile(N为传入的tiles参数) - 移除tile的固定宽高,Grid会自动分配尺寸,配合容器的
aspect-ratio,每个tile也会保持正方形
- 将
修复输入验证逻辑
原判断逻辑会允许大于100的有效数字通过,修改为input >= 1 && input <= 100 && !isNaN(input),确保输入是1-100之间的有效数字。创建新网格前清空旧内容
在createSketchGrid函数开头添加grid.innerHTML = '',避免多次点击按钮导致tile叠加。
修改后的完整代码
JavaScript
const grid = document.querySelector('#grid'); const userInput = document.querySelector('#user-input'); grid.style.fontSize = '1em'; // 获取用户输入并创建网格 function getUserInput() { let input = parseInt(prompt(`Please enter the grid size you'd like`)); if (input >= 1 && input <= 100 && !isNaN(input)) { createSketchGrid(input); } else { alert('Please enter a valid number between 1 and 100.'); } } // 鼠标 hover 填充tile function setTiles(e) { e.target.classList.add('fill'); } // 右键清除tile填充 function deleteTiles(e) { e.preventDefault(); e.target.classList.toggle('fill'); } // 创建网格 function createSketchGrid(tiles) { grid.innerHTML = ''; grid.style.gridTemplateColumns = `repeat(${tiles}, 1fr)`; const gridSize = tiles * tiles; for (let i = 0; i < gridSize; i++) { const tile = document.createElement('div'); grid.appendChild(tile); tile.addEventListener('mouseover', setTiles); tile.addEventListener('contextmenu', deleteTiles); } } userInput.addEventListener('click', getUserInput);
CSS
* { box-sizing: border-box; margin: 0; padding: 0; } html { font-size: 10px; } h1 { font-size: 3rem; margin: 1rem 0; text-align: center; } .container { display: flex; flex-direction: column; align-items: center; gap: 1rem; } .grid { display: grid; gap: 0.1em; background-color: lightgrey; flex: 0 0 32em; aspect-ratio: 1/1; } .fill { background-color: black; } .btn { padding: 0.5rem 1rem; font-size: 1.6rem; cursor: pointer; }
HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Etch A Sketch</title> <link rel="stylesheet" type="text/css" href="styles/style.css"> <script type="text/javascript" src="js/main.js" defer></script> </head> <body> <h1 class="title">Etch A Sketch</h1> <div id="container" class="container"> <button id="user-input" class="btn user-input">Grid Size</button> <div id="grid" class="grid"></div> </div> </body> </html>
内容的提问来源于stack exchange,提问作者JackJack
相关产品推荐
相关产品推荐

