我如何使用 html 和 css 创建弯曲的 3D 对象

2023-12-19

我有一个 html/css 3d 对象,如图 2 所示。我想让它稍微弯曲一点,如图 1 所示

有人知道如何实现它吗?或者是否有其他技术可以塑造这些 3D 对象?

这是图 2 中我的对象的代码:

.container {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}

.cube {
  background: #dc2e2e;
  width: 200px;
  height: 50px;
  position: relative;
  margin: 50px;
  transform: rotate(32deg);
}

.cube::before {
  content: '';
  display: inline-block;
  background: #f15757;
  width: 200px;
  height: 2px;
  transform: skewX( -80deg);
  position: absolute;
  top: -2px;
  left: 6px;
}

.cube::after {
  content: '';
  display: inline-block;
  background: #9e1515;
  width: 12px;
  height: 50px;
  transform: skewY(-10deg);
  position: absolute;
  top: -1px;
  left: 100%;
}
<div class="container">
  <div class="cube"></div>
</div>

从 div 元素创建弧线并不那么简单。另外,使用 div 标签创建形状和图形也不是一个好方法,您应该使用可扩展矢量图形(SVG)、HTML Canvas、WebGL 或任何其他 JS 库。

使用 div 标签,您可以通过添加底部边框半径来创建底部圆弧:

.cube {
  background: #dc2e2e;
  width: 200px;
  height: 50px;
  position: relative;
  margin: 50px;
  box-shadow: 0px 10px 16px -6px black;
  border-bottom-left-radius: 50%;
  border-bottom-right-radius: 50%;
}
<div class="container">
<div class="cube"></div>
</div>

但是您无法使用边框顶部半径实现顶部圆弧,因为使用它会创建相反方向的圆弧,从而创建椭圆形而不是拱形。

您可以做的一件事是用另一个白色的 div 标签覆盖矩形的上部,以创建类似拱形的效果。

.arch {
  width: 200px;
  overflow: hidden;
}
.lowerarc {
  width: 240px;
  position: relative;
  right: -10px;  
  left: -20px;
  height: 80px;
  background-color: black; 
  border-bottom-left-radius: 50%;
  border-bottom-right-radius: 50%;
}
.upperarc {
  height: 80px;
  position: relative;
  width: 240px;
  top: -120px;
  right: -10px;
  left: -20px;
  background-color: white; 
  border-bottom-left-radius: 50%;
  border-bottom-right-radius: 50%; 
}
<div class="arch">
  <div class="lowerarc"></div>
  <div class="upperarc"></div>
</div>

但看起来不太好。因此使用 div 可能不是获得所需结果的最佳方法。

尝试使用 SVG 代替: 在下面的示例中,我们通过绘制像素值并使用特定颜色填充形状,使用直线和曲线创建拱门。

M means move to, L to create a line, Q to draw curves, and z to close the path and the number corresponding to it are the values in pixel

<svg width="200">
<path d="M0,0 L0,50 Q100,80 200,50 L200,0 Q100,25 0, 0z" fill="black" />
</svg>

在下面的代码中,我们仅创建一条厚度为 50 像素的曲线。

<svg viewBox="0 0 1000 400">
  <path d="M 60,250 C 60,150 150,50 250,50" fill="none" 
stroke="green" stroke-width="50"></path>
</svg>

使用画布: Canvas 与 Svg 类似,但它使用 javascript 来创建路径和图形。

var canvas = document.getElementById('canvas');
var c = canvas.getContext('2d');

c.beginPath();
c.moveTo(60, 0);
c.lineTo(10, 0);
c.quadraticCurveTo(0, 170, 170, 250);
c.lineTo(195, 210);
c.quadraticCurveTo(50, 150, 60, 0);
c.fill();
<canvas id="canvas" width="622" height="1080"></canvas>

虽然 SVG 和 Canvas 仅用于创建 2D 图形,但您仍然可以一起使用 2D 对象来创建类似 3D 的幻觉。

var canvas = document.getElementById('canvas');
var c = canvas.getContext('2d');

c.fillStyle="rgba(0, 0, 25, 0.7)";
c.beginPath();
c.moveTo(10, 0);
c.lineTo(0, 5);
c.quadraticCurveTo(-10, 180, 170, 260);
c.lineTo(195, 220);
c.lineTo(195, 210);
c.quadraticCurveTo(30, 250, 60, 0);
c.fill();

c.fillStyle="rgb(200, 210, 200)";
c.beginPath();
c.moveTo(60, 0);
c.lineTo(10, 0);
c.quadraticCurveTo(0, 165, 170, 250);
c.lineTo(195, 210);
c.quadraticCurveTo(50, 135, 60, 0);
c.fill();
<canvas id="canvas" width="622" height="1080"></canvas>
<script src="main.js">
</script>

SVG 和 Canvas 代码看起来很吓人,但其实并不像看起来那么困难。您可以阅读文档或观看 Youtube 教程来正确学习。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何使用 html 和 css 创建弯曲的 3D 对象 的相关文章

  • webglcontextcreationerror事件:是否同步触发?

    Is the webglcontextcreationerror 事件 https developer mozilla org en US docs Web Events webglcontextcreationerror同步触发还是异步触
  • 单击时获取元素的 id(php、jquery、ajax、javascript)

    抱歉 这是我的第一个项目 我学到了很多东西 因此 如果有人可以帮助我 我将不胜感激 我的项目中有这个侧边栏 其中包含 rss 链接 我必须使用 ajax 因此每次用户单击任何 rss 链接时 提要都会出现在屏幕上 这是我的侧边栏代码 div
  • 如何将表情符号水平居中?

    在非视网膜显示屏上 unicode 表情符号字符似乎溢出了其边界框 但在视网膜显示屏上 它仍保留在字符边界内 那么如何在视网膜和非视网膜显示屏上将表情符号水平居中在 div 中呢 非视网膜 Retina 这适用于视网膜屏幕 但在非视网膜显示
  • 仅使用 HTML 正确填充电子邮件

    对于作业 我需要放置一个form在我的网页中 并让表单填充一封电子邮件供用户发送 我在四处搜寻后写下了这个
  • 非常基本的 JS 编码,是否有 SoundManager2?

    我想在我的网站上包含一个具有以下属性的音频 可能的视频播放器 必须可通过 div 通过 CSS 设计样式 可以读取所有ID3信息 可以从数据库中提取文件 可能是 GoDaddy 的 Easy Database 无闪光 可转移至智能手机等 我
  • 如何使选择框水平和垂直居中

    我正在尝试将选择框水平和垂直居中 这是 jsfiddle http jsfiddle net j3r9Lp81 http jsfiddle net j3r9Lp81 CSS div currency text align center HT
  • MUI 组件上的渐变边框

    我没能找到相当于border image source css 我的目标是在按钮组件上渲染边框渐变 这是添加渐变边框的方法button成分 V5 const options shouldForwardProp prop gt prop gr
  • 方向改变后的javascript最大视口高度Android和iOS

    目标 查找设备的最大视口高度 包括设备的空间address bar这样我们就可以动态调整 min body 的大小并将内容向上推 问题 移动浏览器处理方向状态的方式不同 方向变化时更新 DOM 属性的方式也不同 使用 JavaScript
  • 如何根据另一个动态下拉列表的值创建动态下拉列表?

    我有一个下拉菜单 当我选择一个选项时 它会创建一个动态下拉菜单 到目前为止 一切都很好 但我想创建另一个动态下拉列表 现在基于另一个动态下拉列表的值 我该怎么做 第一个动态下拉列表有效 我猜第二个无效 因为动态变量 div 没有静态 ID
  • 光标:属性值无效

    我已经找这个很久了 可悲的是 我发现的所有内容都不适合我 我的自定义光标在 Firefox 上不起作用 我有一个漂亮的 无效属性值 同样在 Firefox 开发版中我也遇到了同样的错误 但显示了光标 Chrome 没问题 显示没有任何错误
  • 拖放 HTML5 jQuery:带有 JSON 的 e.dataTransfer.setData()

    这是我的拖拽 dragstart function e this css opacity 0 5 e dataTransfer effectAllowed move e dataTransfer setData application js
  • 如何检测浏览器中操作系统是否处于深色模式?

    如同 如何检测 OS X 是否处于深色模式 https stackoverflow com questions 25207077 how to detect if os x is in dark mode 仅适用于浏览器 有没有人发现是否有
  • 更改 3 列显示的比例:表格/表格单元格

    我有这个简单的设置 container display table width 70 text align center div border 1px solid 336 column display table cell div clas
  • 标记内的值发生变化时调用函数

    JavaScript 有没有什么方法可以在段落标记的值更改时调用函数 概述 HTML p 00 00 p
  • 带有针织滑轨的垂直滚动条可实现长功能

    是否可以使用knitr幻灯片制作垂直滚动条以实现长功能 使用xaringan https slides yihui name xaringan 自定义样式 我正在根据上一个问题尝试一些选项如何使垂直滚动条出现在RMarkdown代码块中 h
  • 如何使用 Angular CLI 添加应用程序范围的 CSS 文件?

    我想向我的 Angular 2 应用程序添加一些分片样式 例如字体和配色方案等将在任何地方使用的东西 过去 我总是通过在索引页面添加这样的标签来完成此操作 这不适用于 CLI 用于为应用程序提供服务的任何内容 我尝试在构建后手动将 css
  • 使用 htaccess 重写规则重定向后 CSS 未加载

    我有以下用户个人资料网址的简写 RewriteRule w profile php name of user 1 当我这样做时 该网站使用适当的 css 文件进行样式设置site com name of user 但当我这样做的时候却不是s
  • Antd select 元素:如何禁用输入?

    我正在尝试使用模式 multiple 的选择元素 我希望禁用输入 这意味着用户只能在现有选项之间进行选择 而不能输入文本 我该怎么做呢 我的元素 import Select from antd import antd dist antd c
  • 如何从 HTML 中的列数据而不是行数据创建表格?

    根据这篇文章W3学校 http www w3schools com html html tables asp 可以像这样在 HTML 中创建一个基本表格 table border 1 tr td row 1 cell 1 td td row
  • Bootstrap - 为反向行模式创建移动自适应

    我想用 Bootstrap 创建一个反向效果 第一行 左边是文字 右边是图像 第二行 左边是图片 右边是文字 第三行 左边是文字 右边是图片 第四行 左边是图片 右边是文字 而且这种情况一直持续下去 它在大型设备上看起来非常漂亮 但当它在设

随机推荐

  • 如何使用 OrmLite 将非可选 NULL 参数传递给存储过程

    我正在针对已发布存储过程进行访问的现有 SQL Server 数据库使用 OrmLite 这些 SP 之一采用 3 个 int 参数 但预计其中一个或另一个将为 null 但是 没有任何参数被声明为可选 这是我尝试过的代码 using ID
  • Shopify API:如何向客户发送有关正在发货的产品的电子邮件?

    我正在尝试通过更新订单履行情况向客户发送一封包含订单跟踪信息的电子邮件 但该电子邮件未发送出去 我可以检索履行情况并添加跟踪代码 它可以正确保存 但状态不会更新 fulfillment id 3252574519475 shopify or
  • 如何使用 Django 重命名模型?

    假设我有这个模型 class Foo models Model name models CharField max length 255 我想将其重命名为Bar 我应该采取什么步骤 我该如何处理The following content t
  • Rails 开发服务器速度慢,加载简单页面需要很长时间

    有类似的线程关于 Rails 在开发模式下速度缓慢 但这些线程中的解决方案对我来说没有任何区别 我尝试安装可以提高性能的 gem 并修改配置文件 但没有成功 我刚刚开始使用 Rails 因此我正在运行 Rails 入门 指南 这是一个小博客
  • 自定义分区问题

    有人可以指导我如何解决这个问题吗 给定一个集合 S 其中有 k 个元素 现在我们必须将集合S分为x个子集 使得每个子集中的元素数量差不大于1 并且每个子集的总和应尽可能接近 示例1 10 20 90 200 100 必须分为 2 个子集 解
  • 从 byte[] 创建一个临时 java.io.File

    我必须使用现有的方法 例如saveAttachment Attachment attachment where Attachment has a File attribute 我的问题是我正在检索byte 我想用这种方法保存它 怎样才能拥有
  • RedirectMatch 在 htaccess 中不起作用

    我正在尝试从以下位置重定向我的页面 from http domain com article php id 23232 http domain com article php id 23232 to http domain com arti
  • 使用 beautifulsoup 从页面中抓取表格,找不到表格

    我一直在尝试从桌子上刮下来here http www payscale com college salary report bachelors page 65但在我看来 BeautifulSoup 找不到任何桌子 I wrote impor
  • 在嵌套字典中获取特定键的值的优雅方法?

    我有一个Python 嵌套字典 我可以访问A像这样的元素 D 0 detLog n A 其中 n 是从 0 到的长度detLog 在 Matlab 中我可以使用这样的东西 D 0 detLog A 意思是 对于所有元素 Python中有类似
  • Maven scm 连接器 subclipse 的替代品(不适用于 subclipse1.8)?

    因此 对于我的项目 我需要 Subclipse 1 8 x 这很好 但 subclipse 的 Maven SCM 处理程序仅与 Subclipse 1 6 x 兼容 我喜欢这个插件 因为它会自动加载模块 并检测它们 所以你可以在 svn
  • 如何在输出缓冲区时查看包含文件中的 php 错误?

    使用输出缓冲区时出现空白屏幕 并且包含的 文件中存在语法错误 PHP 不显示输出缓冲区中的错误 如何查看php输出缓冲区语法错误 在我的项目中我使用了 如果文件不存在则隐藏错误 但如果文件确实存在并且有致命错误 它们也不会显示 这是代码示例
  • 在 Git 中回滚

    我已经提交并推送了几个补丁 A1 gt A2 gt A3 gt A4 头部 每个人都将这些变更集拉到他们的本地副本中 现在我们想要 回滚 到 A2 并从那里继续开发 基本上抛弃 A3 和 A4 最好的方法是什么 从工作副本的根目录只需执行以
  • 模板化组合框的“默认”文本

    我有一个基于数据模板的组合框 其中包含如下复选框
  • 使用 JavaScript 读取 KMZ

    如何使用 JavaScript 读取 KMZ 而非 KML 中的内容 那么您需要看看是否可以解压缩文件 我会看看这个堆栈溢出帖子 https stackoverflow com questions 2095697 unzip files u
  • 如何知道 SwiftUI 中的安全文本字段何时获得焦点或失去焦点?

    我想知道 我们如何检测 SecureTextField 是否失去焦点或获得焦点 目前我正在使用点击手势来检查是否获得焦点并相应地更改边框颜色 但有时颜色会发生变化但编辑不会开始 SecureField Password text viewM
  • 收到错误消息“Android sdk 内容加载器卡在 0%”

    当我打开时Eclipse它显示消息Android sdk content loader 0 怎么解决这个问题呢 我已自动关闭项目构建并清理了工作区中的所有项目 有人可以告诉我为什么我会收到此错误吗 我也遇到了类似的问题 我尝试了很多方法 但
  • 更改 jstree 中的 AJAX 选项并从服务器重新加载树

    我正在使用 ajax 在 jsTree 中加载 XML 平面树 因此声明如下所示 工作正常 jstree jstree xml data data xmlFlatData ajax type POST async true url loc
  • 将子进程重定向到变量作为字符串[重复]

    这个问题在这里已经有答案了 使用以下命令 它会打印 640x360 gt gt gt command subprocess call mediainfo Inform Video Width x Height Users Desktop 1
  • 用于从 IP 中提取国家/地区代码的良好 php API? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想知道是否有人有过在 IP 上进行 whois 并从该 IP 中提取国家 地区代码的经验 想知道什么
  • 我如何使用 html 和 css 创建弯曲的 3D 对象

    我有一个 html css 3d 对象 如图 2 所示 我想让它稍微弯曲一点 如图 1 所示 有人知道如何实现它吗 或者是否有其他技术可以塑造这些 3D 对象 这是图 2 中我的对象的代码 container position absolu