我可以使用什么 CSS 来缩放画布以填充其容器而不改变其纵横比?

2024-01-05

我有一个特定尺寸的画布(比如说 300x150)。我可以使用什么 CSS 来缩放画布以填充其容器,而不改变其纵横比,并将其水平和垂直居中,以获得缩放后剩余的任何额外空间。

我试过这个

* {
    box-sizing: border-box;
   -moz-box-sizing: border-box;
}

html, body {
  height: 100%;
}

#container {
  width: 100%;
  height: 100%;
  text-align: center;
}

canvas {
  width: auto;
  height: auto;
  max-width: 100%;
  max-height: 100%;
}

<div id="container">
  <canvas></canvas>
</div>

这适用于除垂直居中之外的所有内容。我尝试改变#container to a table-cell with vertical-align: middle带有外容器display:table。它实现了垂直居中,但不再水平缩放。我尝试改变#container到弹性框,但随后它开始错误地垂直缩放画布。

还有其他想法吗?


所以这种工作方式。

canvas {
    max-width: 100%;
    max-height: 100%;
    margin: auto;

    position: absolute;
    top: 0; left: 0; bottom: 0; right: 0;
}

不幸的是,画布永远不会被拉伸,只会收缩


考虑到您问题的标签,这可能偏离主题,但这是一种使用 javascript 的方法。

注意:如果需要,您可以将此示例的 jquery 转换为纯 javascript — jquery 没有关键用途。

var canvas = document.getElementById("canvas");
var cw = canvas.width;
var ch = canvas.height;
var $canvas = $('#canvas');
var $container = $('#container');
var $containerWidth = $('#containerWidth');
var $containerHeight = $('#containerHeight');
$containerWidth.val($container.css('width'));
$containerHeight.val($container.css('height'));
scale();

$('#containerWidth,#containerHeight').change(function() {
  scale();
});

function scale() {
  var containerW = $containerWidth.val();
  var containerH = $containerHeight.val();
  var scale = scalePreserveAspectRatio(cw, ch, containerW, containerH)
  $container.css('width', containerW);
  $container.css('height', containerH);
  $canvas.css('width', cw * scale);
  $canvas.css('height', ch * scale);
  if (Math.abs(containerW - cw * scale) < 2) {
    $canvas.css('top', parseInt((containerH - ch * scale) / 2));
    $canvas.css('left', 0);
  } else {
    $canvas.css('top', 0);
    $canvas.css('left', parseInt((containerW - cw * scale) / 2));
  }

}

function scalePreserveAspectRatio(canvasW, canvasH, maxW, maxH) {
  return (Math.min((maxW / canvasW), (maxH / canvasH)));
}
body {
  background-color: ivory;
}
#container {
  border: 1px solid blue;
  width: 350px;
  height: 200px;
  position: relative;
}
#canvas {
  border: 1px solid red;
  position: absolute;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<h4>Container=blue, Canvas=red</h4>
Width:&nbsp
<input type=range id=containerWidth min=100 max=500 value=350>
<br>Height:&nbsp
<input type=range id=containerHeight min=100 max=300 value=200>
<div id=container>
  <canvas id="canvas" width=300 height=150></canvas>
</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以使用什么 CSS 来缩放画布以填充其容器而不改变其纵横比? 的相关文章

  • php中的条件格式化html表与时间戳比较

    echo table style width 100 tr echo td Order td echo td Destination td echo td Location td echo td Status td echo td Time
  • 根据变量值将 LESS 编译为多个 CSS 文件

    有一个指定颜色的变量variables less文件 例如 themeColor B30F55 和一个 json构成实体列表的文件 其中每个键是一个实体 ID 键的值是该实体的颜色 例如 8ab834f32 B30F55 3cc734f31
  • 如何将udp发送到udp node.js服务器?

    我对此很陌生 所以我真的不知道我在做什么 但我已经设置了一个 node js udp 服务器 我想从客户端 来自网站 向它发送一个数据包 但我不知道如何在 javascript 中做到这一点 或者是否可能 我不是在研究如何从 Node js
  • 如何在HTML中的PHP中注释掉HTML和PHP?

    这是我想注释掉的一行代码 h1 class post title a href title a h1 一种流行的注释方法是分别注释 html 和 php 有一个更好的方法吗
  • 调整文本区域大小

    我需要使用文本区域来显示一些文本 问题是 如果我放置 4 5 行文本 就会出现滚动条 如何使用 CSS HTML 使文本区域与其内容一样大 没有滚动条 文本区域不需要动态更改其大小 我仅使用它来显示文本 我也可以使用禁用的文本区域 我希望文
  • 将 visjs 网络导出为 jpeg/png 图像

    我正在研究 Angular vis js Vis js 在画布上工作 用于创建节点和节点之间的链接 有没有办法从 visj s 画布中获取图像 jpeg png 看看这个片段 我想它会对你有所帮助 在 vis 画布下 您将看到一个 PNG
  • HTML5 历史 API

    我如何使用 HTML5 历史 api 我确实经历过https developer mozilla org en DOM Manipulated the browser history https developer mozilla org
  • 来自 JSON 的 Angular 8 动态表单

    我正在尝试从 JSON 模式递归生成动态表单 但我正在努力解决找不到表单控件的问题 这是代码示例 我收到这个错误 错误错误 找不到名称为 createdAt 的控件 我尝试了不同的方法 但仍然存在问题 我知道我错过了一些东西 所以请帮忙 任
  • 在网页上的文本框中键入内容时删除所有空格

    我如何在用户打字时即时删除输入到文本框中的空格 function var txt myTextbox var func function txt val txt val replace s g txt keyup func blur fun
  • jquery 验证错误位置

    这看起来很简单 但我无法弄清楚 我正在使用 jquery 验证插件 我验证所有文件 但我想要的是在输入文本行中显示验证消息警报 例如在电子邮件输入中 请填写电子邮件地址 但现在它出现在所有字段下 在我的html中
  • 防止浮动换行,直到元素达到最小宽度

    我有可变宽度的 HTML 布局 内容左侧有一个固定宽度的菜单 div 可变宽度 由 css max width 和 min width 设置 对于非常窄的浏览器窗口 我希望内容包裹在菜单下方 我目前通过设置来实现这一点float left在
  • 为什么需要重置浏览器?

    好吧 我知道这可能不是最好的标题why我们需要重置浏览器 因为浏览器有不同的默认设置 我的问题太长 无法放入标题中 如果每个人 90 的时间都需要使用重置样式表 为什么浏览器需要设置默认样式 无论如何我们都会删除它们 对吗 因为某些规则默认
  • 如何将此 HTML 表格布局解决方案转换为浮动 div 解决方案?

    我经常需要列出各种尺寸的项目images在左边和text在右边 像这样 替代文本 http www deviantsart com upload 7s01l5 png http www deviantsart com upload 7s01
  • 如何使用 JavaScript 获取没有 HTML 元素的纯文本?

    我的 HTML 中有 1 按钮和一些文本 如下所示 function get content I don t know how to do in here
  • 如何在背景剪辑中包含文本装饰:文本;影响?

    我在用 webkit background clip text border and color transparent在锚标记上 下划线似乎永远不可见 我想要的是将文本装饰包含在背景剪辑中 这是我的CSS background clip
  • Twitter 嵌入时间轴小部件

    我继续下载http platform twitter com widgets js http platform twitter com widgets js And the http platform twitter com embed t
  • 为什么“tbody”不设置表格的背景颜色?

    我在用 tbody 作为 CSS 选择器来设置background color在一个表中 我这样做是因为我有多个 tbody 表内的部分 它们具有不同的背景颜色 我的问题是 当使用border radius在细胞上 细胞不尊重backgro
  • 悬停时为 SVG 制作动画

    我正在尝试在悬停时为 SVG 文件设置动画 默认情况下 它可以使用 svg 函数实现出色的动画效果 例如
  • 三级十进制有序列表 CSS

    我有一个 html 中的三级有序列表 我想为其提供如下样式 1 Item 1 1 1 Item 2 1 1 1 Item 3 下一个 plunker 中有一个 html 示例 http plnkr co edit DqhZ5pJILTUHG
  • 显示覆盖以覆盖整个页面

    我有一个正在加载的网络应用程序iframe 我需要显示一个覆盖 div 来覆盖整个页面 问题是叠加层当前仅显示在iframe区域而不覆盖整个页面 我们的应用程序 子应用程序 是加载的一组应用程序的一部分iframe 你可以做这样的事情 di

随机推荐

  • IIS 管理器错误数据。 0x80090005

    当我尝试在 高级设置 中设置物理路径凭据时 收到如下错误消息 Internet 信息服务 IIS 管理器 坏数据 HRESULT 异常 0x80090005 它阻止我设置特定用户来访问网络共享文件夹 奇怪的是 我有另一台具有相同配置的服务器
  • APE 和 Node.js 之间的主要区别是什么?

    有谁用过的可以分享一下经验吗 主要区别是什么 您更喜欢哪一个 谢谢 socket io 与 APE 的不同之处 socket io 是用 javascript node js 编码的 而 APE 是用 C 编码的 我相信当你想做出贡献时 这
  • 根据属性将 JavaScript 中的对象数组拆分为单独的数组

    我有一个像这样的数组 var flightPlanCoordinates lat 37 772 lng 122 214 status walking lat 36 772 lng 123 214 status walking lat 21
  • 禁用“您所做的更改可能无法保存”弹出窗口

    我使用以下前端代码导出 csv文档 HTML
  • 在 Vim 中同时保存并运行

    我做了很多 Python 快速模拟工作 并且不断保存 w 然后运行 有没有办法将这些动作结合起来 也许是 保存并运行 命令 好的 您正在寻找的最简单形式是管道命令 它允许您在同一行上运行多个 cmdline 命令 在您的情况下 这两个命令是
  • PowerShell:从文本文件读取行,构造源文件名和目标文件名,然后复制文件

    I m a 电源外壳 http en wikipedia org wiki Windows PowerShell新手 我很想能够编写这个脚本 我有一个文本文件 其中每一行都是文件名的一部分 没有路径或扩展名 我想要一个单行循环遍历文件的每一
  • 将字符串添加到 ArrayList [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我需要确保我正在正确构建这个程序 我
  • Python 抽象类 - 如何阻止实例化?

    我有 C 背景 该语言具有一些内置的 保护开发人员 功能 我知道 Python 采用 我们都是成年人 的方法 并让开发人员有责任深思熟虑 仔细编码 也就是说 Python 建议采用约定 例如私有实例变量的前导下划线 我的问题是 除了在文档字
  • Oracle 二进制数据类型

    有没有一种类型或方法如何在oracle中以二进制级别存储数据 我对 dml at table 和 pl sql 的操作都感兴趣 目前所有二进制元素都存储为 varchar2 1000 11111 0000 1111 但操作和数据存储大小相当
  • 创建 MySQL 存储过程来更新记录

    我正在转换所有现有的 MSSQL 数据库 并且存储过程被困在一个新的存储过程中 我需要在其中更新现有记录 一旦记录插入数据库并成功发送电子邮件 或至少传递到 SMTP 服务器 就会从 Web 表单调用该过程 我在 MSSQL 中有一个工作程
  • 如何编译c程序使其不依赖任何库?

    看来即使是一个 hello world 程序也依赖于几个库 libc so 6 gt lib64 libc so 6 0x00000034f4000000 lib64 ld linux x86 64 so 2 0x00000034f3c00
  • 我可以在 PHP 中使用字符串连接来定义类 CONST 吗?

    我知道您可以使用字符串连接来创建彼此的全局常量 define FOO foo define BAR FOO bar echo BAR 将打印 foobar 但是 我在尝试使用类常量执行相同操作时遇到错误 class foobar const
  • Selenium FindElement 会阻塞,直到文件上传完成

    短篇 当我使用 SendKeys path 触发文件上传到代理元素 由 ExecuteScript 放置 然后通过 jquery fileupload 插件代理到我的隐藏元素时 文件上传正常 但是当我尝试发出FindElement 它会阻塞
  • 如何为基于http的集成测试生成覆盖率报告?

    我正在为一个项目编写集成测试 在该项目中我进行 HTTP 调用并测试它们是否成功 由于我没有导入任何模块 也没有直接调用函数 coverage py 报告的覆盖率是 0 我想知道如何为此类集成 HTTP 请求测试生成覆盖率报告 食谱大致是这
  • 在python中使用scrapy执行Javascript函数

    我对 scrapy 我正在废弃一个网站 因为我有一些锚标记 其中包含 href 属性和javascript 提交表单函数 当我单击该 javascript 函数时 将打开一个页面 我需要从中获取数据 我使用了Xpath并找到特定锚标记的 h
  • 简单的子域重定向 PHP

    我的移动应用程序有一个子域 就像http m traffic domain com http m traffic domain com现在我希望我的用户可以通过访问访问他们的页面http m traffic domain com 用户名 h
  • 当我用 menhir 生成解析器时,有没有办法导出更多东西?

    我正在使用 menhir 生成解析器 现在 它从我的 parser mly 文件生成的 parser mli 文件如下所示 The type of tokens type token huge ADT definition goes her
  • 使用 TypeScript 在 Angular 管道中使用 MapToIterable

    尝试在 Angular 中实现管道 在意识到 ngFor 不适用于地图之后 一些研究让我相信未来的功能将会解决这个问题 但与此同时 mapToIterable 管道就是答案 我有以下代码 import Pipe PipeTransform
  • 如何在Android手机中查找应用程序崩溃日志?

    如果任何 Android 应用程序崩溃 则会代表该应用程序生成一些崩溃日志 如何找到此类崩溃日志的位置 我想要 Android 设备内部的崩溃日志 而不是真正使用 Logcat 来查看崩溃日志 在 logcat 堆栈跟踪中 您可以找到异常
  • 我可以使用什么 CSS 来缩放画布以填充其容器而不改变其纵横比?

    我有一个特定尺寸的画布 比如说 300x150 我可以使用什么 CSS 来缩放画布以填充其容器 而不改变其纵横比 并将其水平和垂直居中 以获得缩放后剩余的任何额外空间 我试过这个 box sizing border box moz box