css - 在添加子项之前将画布子项缩放到由布局确定的父项宽度和高度
问题描述
Codepen 中的最小示例:
https://codepen.io/quaffpotion/pen/OJPqRgW(绿色框表示预期的行为,而蓝色框的行为是意外的。您可能需要调整浏览器窗口的大小才能看到蓝色框的大小并不总是匹配它的父级的高度和宽度。我添加了填充用于演示目的)
body {
margin: 40px;
}
.wrapper {
display: grid;
grid-gap: 10px;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr) ) ;
background-color: #fff;
color: #444;
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 10px;
font-size: 150%;
}
.a {
grid-column: auto / span 2;
}
.k {
grid-column: auto / span 3;
}
.g {
grid-column: auto / span 2;
grid-row: auto / span 2;
}
.fillup {
position: relative;
height: 100%;
/* width: 100%; This causes the child element to be too big for the parent */
border-radius: 5px;
}
.blue {
background: skyblue;
}
.green {
background: seagreen;
}
<div class="wrapper">
<div class="box a">A</div>
<div class="box b"><div class="fillup green">correctly fills parent</div></div>
<div class="box c">C</div>
<div class="box d">D</div>
<div class="box e">E</div>
<div class="box f">F</div>
<div class="box g"><canvas class="fillup blue"></canvas></div>
<div class="box h">H</div>
<div class="box i"><div class="fillup green" >correctly fills parent</div></div>
<div class="box j">J</div>
<div class="box k">K</div>
<div class="box l">L</div>
<div class="box m">M</div>
</div>
问题定义:
这与其他缩放问题略有不同,我将尝试对其进行明确定义。
我希望为画布实现对object-fit: fill
图像的作用。(缩放宽度和高度以匹配父级,忽略纵横比)其他说法如下。
我希望能够在不更改父级尺寸的情况下将子元素添加到父级。
换句话说,目标是能够遵循以下三个步骤:
您有一个使用 div 元素的 css 网格创建的布局。假设这包括
<div> Some Text </div>
在某个浏览器窗口大小下具有 200 x 100 像素的尺寸。您从第 1 步向 div 添加了一个子元素。您为子元素添加了一些样式。
当您重新加载页面并使浏览器具有与步骤 1 相同的大小时,您会看到子元素和父 div 的大小均为 200 x 100。
尝试的解决方案:
- 在子元素是 a 的情况下,
div
我可以让它工作,但是它会因 egcanvas
元素而失败。 - 添加
width: 100%
到画布元素的样式确实会创建一个与其父级大小匹配的元素,但它与原始布局中其父级的大小不匹配。 - 感谢另一个来源,我添加了以下部分解决方案:
var canvas = document.querySelector('canvas');
fitToContainer(canvas);
function fitToContainer(canvas){
// Make it visually fill the positioned parent
canvas.style.width ='100%';
canvas.style.height='100%';
// ...then set the internal size to match
canvas.width = canvas.offsetWidth;
canvas.height = canvas.offsetHeight;
}
解决方案
推荐阅读
- python - Python 数据帧 - 如何在此处应用线程/多处理以加快速度
- html - 没有 Verflow 就不能应用样式:隐藏属性到网页上的任何部分
- java - 数组中的玩家移动
- javascript - 一次使用Provider就够了吗?
- c# - datetime2 的奇怪行为
- python - 如何通过正则表达式捕获小数?
- f# - F# 记录结构比较排序
- playframework - Scala Play 2.7 在 75 秒后重新执行动作的主体
- javascript - 从 env 变量中读取跟踪 ID 并在 HTML 文件的 head 部分的 GA 脚本标记中使用它
- c# - 处理嵌套属性值