You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过单个函数参数设置容器的宽高比例一致?

解决网格容器宽高不一致的问题

问题分析

当前的核心问题:

  • 固定tile宽高导致tiles数量变化时,总尺寸无法适配容器的正方形比例
  • Flex布局下,容器固定了宽度但高度由tile总高度决定,导致宽高失衡
  • 输入验证逻辑错误,无法有效拦截大于100的无效输入
  • 多次创建网格时未清空旧内容,造成tile叠加

解决方案

  1. 强制容器为正方形
    给.grid添加aspect-ratio: 1/1属性,让容器高度自动等于宽度,从根源上保证正方形比例。

  2. 改用Grid布局适配网格场景
    Grid布局天生适合网格排列,替代Flex布局:

    • 将.grid的display改为grid,通过grid-template-columns: repeat(N, 1fr)让每行自动平分N个tile(N为传入的tiles参数)
    • 移除tile的固定宽高,Grid会自动分配尺寸,配合容器的aspect-ratio,每个tile也会保持正方形
  3. 修复输入验证逻辑
    原判断逻辑会允许大于100的有效数字通过,修改为input >= 1 && input <= 100 && !isNaN(input),确保输入是1-100之间的有效数字。

  4. 创建新网格前清空旧内容
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:24:40