尽管有预防性设置,但当宽度大于高度时,SVG 宽高比会保留

SVG aspect ratio is preserved when width is greater than height despite of the preventive setting

我希望蓝线始终连接左上角和右下角而不显示溢出和滚动条。目前只有当宽度小于高度(或多或少)时才会发生,否则它会增加高度,从而导致屏幕溢出并显示滚动条。没有 preserveAspectRatio 选项似乎开箱即用。我正在理想地寻找仅标记解决方案。

<!DOCTYPE html>
<html style="height: 100%;">

<body style="height: 100%; margin: 0;">
    <div
        style="width: 100%; height: 100%; display: grid; grid-template-rows: min-content auto; grid-template-columns: auto;">
        <div style="grid-row: 1; grid-column: 1; border-bottom: 1px solid #ccc;">
            <p style="margin: 5px;">Header</p>
        </div>
        <div style="grid-row: 2; grid-column: 1; display: grid;">
            <svg width="100%" height="100%" viewBox="0 0 1000 1000" preserveAspectRatio="none">
                <polyline points="0,0 1000,1000" stroke="blue" stroke-width="5px" />
            </svg>
        </div>
    </div>
</body>

</html>

编辑:根据 Dave 的出色解释工作示例:

<!DOCTYPE html>
<html style="height: 100%;">

<body style="height: 100%; margin: 0;">
    <div
        style="width: 100%; height: 100%; display: grid; grid-template-rows: min-content minmax(0, 1fr); grid-template-columns: auto;">
        <div style="grid-row: 1; grid-column: 1; border-bottom: 1px solid #ccc;">
            <p style="margin: 5px;">Header</p>
        </div>
        <div style="grid-row: 2; grid-column: 1; display: grid;">
            <svg width="100%" height="100%" viewBox="0 0 1000 1000" preserveAspectRatio="none">
                <polyline points="0,0 1000,1000" stroke="blue" stroke-width="5px" vector-effect="non-scaling-stroke" />
            </svg>
        </div>
    </div>
</body>

</html>

如果我没理解错的话,您希望 svg 改变宽高比,使对角线始终完全可见。

您的 svg 结构正确,可以在使用用户单位绘制的图像上 preserveAspectRatio="none" 执行此操作以进行线和视框匹配。

您的 svg 超出页面高度的原因是因为容器 div 超出了页面高度。

我已将 class 添加到包含 svg 的父级 div 并将其样式设置为具有 100vh 的高度(减去标称像素值以确保滚动条不会显示)。我还给 div 一个边框,这样你就可以看到它现在占据了可视屏幕,并且 SVG 重新显示了从左上角到右下角的线。

在可调整大小的页面上,div 将调整大小并且 svg 将更改纵横比以始终占据它。

.svgFrame {
border: 1px solid red;
width: 100%;
height: calc(100vh - 20px);
}
        <div class="svgFrame" style="grid-row: 2; grid-column: 1; display: grid;">
            <svg width="100%" height="100%" viewBox="0 0 1000 1000" preserveAspectRatio="none">
                <polyline points="0,0 1000,1000" stroke="blue" stroke-width="5px" />
            </svg>
        </div>

关键是限制父级 div,使其完全显示在页面上;在没有约束的情况下,preserveAspectRatio="none" 没有任何效果,因为没有理由更改纵横比。

在这个基于网格布局的示例中,使用 minmax(0, 1fr) 对包含父级 div 的网格进行样式设置达到了预期的效果。