javascript - 如何根据父 div 元素调整画布大小(反应)?
问题描述
我正在尝试调整 div 容器内的画布大小。目前,div容器很大,canvas是里面的蓝色框,我希望canvas占据整个灰色框。画布图片
这是我的画布功能
function Canvas() {
const canvasRef = useRef(null);
const contextRef = useRef(null);
const [isDrawing, setIsDrawing] = useState(false);
useEffect(() => {
const canvas = canvasRef.current;
const context = canvas.getContext("2d");
context.scale(1, 1);
context.lineCap = "round";
context.strokeStyle = "white";
context.linewidth = 5;
contextRef.current = context;
}, []);
const startDrawing = ({ nativeEvent }) => {
const { offsetX, offsetY } = nativeEvent;
contextRef.current.beginPath();
contextRef.current.moveTo(offsetX, offsetY);
setIsDrawing(true);
};
const finishDrawing = () => {
contextRef.current.closePath();
setIsDrawing(false);
};
const draw = ({ nativeEvent }) => {
if (isDrawing) {
const { offsetX, offsetY } = nativeEvent;
contextRef.current.lineTo(offsetX, offsetY);
contextRef.current.stroke();
} else {
return;
}
};
return (
<div className="canvas">
<div className="canvas__header">
<h1 className="word">Random Word</h1>
</div>
<div className="canvas__body">
<canvas
onMouseDown={startDrawing}
onMouseUp={finishDrawing}
onMouseMove={draw}
ref={canvasRef}
></canvas>
</div>
</div>
);
}
这是画布的 .css 文件,如果我将宽度和高度设置为 100%,画布会变得模糊并溢出 div 容器框。
.canvas {
flex: 0.6;
display: flex;`enter code here`
flex-direction: column;
}
.canvas__header {
padding: 20px;
background-color: #1b1b1b;
display: flex;
align-items: center;
justify-content: center;
border-bottom: 1px solid rgba(126, 255, 158, 0.1);
max-height: 5vh !important;
min-height: 5vh !important;
}
.canvas__header > .word {
color: #7eff9e;
font-size: 20px;
}
.canvas__body {
background-color: #242124;
flex: 1;
}
.canvas__body > canvas {
background-color: blue;
}
解决方案
我可以通过在 useEffect 函数中添加这 4 行代码来解决这个问题:
canvas.style.width = "100%";
canvas.style.height = "100%";
canvas.width = canvas.offsetWidth;
canvas.height = canvas.offsetHeight;
推荐阅读
- c++ - 当用户在 qtablewidget 中输入单元格时如何获取信号?C++
- django - 如何检查 Django 为多租户应用程序生成的 SQL 以确保过滤租户?
- javascript - 如何使用单击的 X 和 Y 坐标移动图像
- django - Django 自定义查询集不返回任何内容
- python - 如何将 Zapier 的 python 节点中的变量输出到电子邮件?
- google-cloud-platform - GCP 外部 http 负载平衡器 502 服务器错误:“failed_to_connect_to_backend”
- android-management-api - 如何通过android管理api阻止chrome中的url
- docker - 使用共享库文件构建 Docker 映像
- java - 将两个垂直的 JSplitPane 放在一个框架 java 上
- java - 我可以使用 Android 智能手机读取 FDX-B RFID 吗?