news 2026/5/17 2:14:54

html+css+js 实现衣服颜色自定义更换的换装系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
html+css+js 实现衣服颜色自定义更换的换装系统

创建项目

如图所示创建一个基本的html项目 我们就叫 outfit-change

导入图片

一共有三张图片 分别是 原图 衣服图和腰带图 如图所示 无水印的图片大家可以去https://www.doitwiki.com/article/details/181203990710272 里面下载大家自行导入即可

效果模拟

首先我们是把原图设置为背景图 需要注意的是 大家如果是自己扣的图衣服图片的位置和尺寸不要变, 然后 我们把衣服和 腰带覆盖到原图上面 用定位的方式,我们把衣服设置一下背景颜色 通过mask蒙版的方式进行设置 再用 mix-blend-mode的方式保留衣服的纹理效果 代码如下

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <style type="text/css"> .box { position: relative; width: 250px; height: 200px; margin: 0 auto; margin-top: 150px; background: url(./img/body.png) no-repeat center/contain; } .skirt { width: 100%; position: absolute; inset: 0; /* 让背景图宽度撑满容器 */ } .belt-img { background-color: green; mask: url("./img/belt.png") no-repeat center/contain; mix-blend-mode: multiply; } .clothes-img { background-color: red; mask: url("./img/clothes.png") no-repeat center/contain; mix-blend-mode: multiply; } </style> </head> <body> <div class="box"> <div class="skirt belt-img"></div> <div class="skirt clothes-img"></div> </div> </body> </html>

自定义完整效果

代码如下 大概意思就是通过css变量来进行改变颜色 其他的原理和上一步一样

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>换装</title> <style type="text/css"> :root { /* 使用 CSS 变量管理颜色,方便 JS 实时修改 */ --clothes-c1: #ff4757; --clothes-c2: #ff6b81; --belt-color: #2f3542; } body { background-color: #f0f2f5; margin: 0; height: 100vh; display: flex; justify-content: center; align-items: center; font-family: system-ui, sans-serif; } .container { display: flex; align-items: center; gap: 60px; /* 侧边栏与模特之间的间距 */ } /* --- 模特展示区 --- */ .model-view { position: relative; width: 320px; height: 480px; /* 身体原图作为底层背景 */ background: url("./img/body.png") no-repeat center/contain; filter: drop-shadow(0 15px 25px rgba(0,0,0,0.1)); } .layer { position: absolute; inset: 0; /* 统一遮罩配置:不重复、居中、自适应大小 */ -webkit-mask-repeat: no-repeat; -webkit-mask-position: center; -webkit-mask-size: contain; mask-repeat: no-repeat; mask-position: center; mask-size: contain; /* 混合模式保留底图纹理:暗部叠加 */ mix-blend-mode: multiply; } .clothes-layer { background: linear-gradient(135deg, var(--clothes-c1), var(--clothes-c2)); -webkit-mask-image: url("./img/clothes.png"); mask-image: url("./img/clothes.png"); } .belt-layer { background: var(--belt-color); -webkit-mask-image: url("./img/belt.png"); mask-image: url("./img/belt.png"); } /* --- 侧边选择面板 --- */ .control-box { background: #fff; padding: 20px; border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.05); width: 140px; } .section-title { font-size: 12px; color: #94a3b8; font-weight: bold; display: block; margin-bottom: 15px; letter-spacing: 1px; } .color-item { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; } /* 美化 input color */ input[type="color"] { -webkit-appearance: none; border: none; width: 28px; height: 28px; cursor: pointer; background: none; padding: 0; } input[type="color"]::-webkit-color-swatch { border: 2px solid #f1f5f9; border-radius: 6px; } .label-text { font-size: 13px; color: #475569; } </style> </head> <body> <div class="container"> <div class="control-box"> <span class="section-title">衣服</span> <div class="color-item"> <input type="color" id="cp1" value="#ff4757"> <span class="label-text">色调 1</span> </div> <div class="color-item"> <input type="color" id="cp2" value="#ff6b81"> <span class="label-text">色调 2</span> </div> </div> <div class="model-view"> <div class="layer clothes-layer"></div> <div class="layer belt-layer"></div> </div> <div class="control-box"> <span class="section-title">腰带</span> <div class="color-item"> <input type="color" id="bp1" value="#2f3542"> <span class="label-text">单色</span> </div> </div> </div> <script> // 缓存根节点提升性能 const rootStyle = document.documentElement.style; // 衣服控制:处理两个色块合并为渐变 const handleClothesChange = () => { rootStyle.setProperty('--clothes-c1', document.getElementById('cp1').value); rootStyle.setProperty('--clothes-c2', document.getElementById('cp2').value); }; // 皮带控制:直接修改变量 const handleBeltChange = (e) => { rootStyle.setProperty('--belt-color', e.target.value); }; // 绑定事件 document.getElementById('cp1').oninput = handleClothesChange; document.getElementById('cp2').oninput = handleClothesChange; document.getElementById('bp1').oninput = handleBeltChange; </script> </body> </html>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 14:09:27

校平技术的“极限运动“:当板材走向极端

一、极薄之困&#xff1a;0.1mm的"柔弱"与"倔强"当金属板材薄到0.1mm级别时&#xff0c;它表现出的物理特性已经完全不同于普通板材。刚度的断崖式下跌板材的抗弯刚度与厚度的三次方成正比。一块0.1mm厚的不锈钢薄板&#xff0c;其刚度仅为1mm厚板的千分之…

作者头像 李华
网站建设 2026/5/15 23:28:07

5 种核心 UI 导航设计:从空间利用到用户体验的优化指南

导航设计的本质是一场关于 “选择” 的设计。我们需要在 “展示更多功能” 与 “保持界面简洁” 之间找到动态平衡&#xff0c;通过对用户行为的洞察和对场景的深度理解&#xff0c;构建出既高效又人性化的导航系统&#xff0c;让用户在探索产品的过程中&#xff0c;感受到流畅…

作者头像 李华
网站建设 2026/5/11 22:04:34

深入理解 Claude Code:架构、上下文与工具系统

引言 在上一篇文章中,我们通过 Todo List 项目体验了 Claude Code 的强大能力。你可能会好奇:为什么 Claude Code 能如此"聪明"地理解需求、规划任务、执行操作?它是如何在不同文件间穿梭自如,记住上下文,并在出错时自我修复的? 理解这些原理并不是为了"炫技…

作者头像 李华
网站建设 2026/5/2 3:24:29

Agentic AI在交通:提示工程架构师解析交通事故预测落地

Agentic AI在交通&#xff1a;提示工程架构师解析交通事故预测落地 一、引入&#xff1a;当早高峰的十字路口遇到“智能哨兵” 清晨7点30分&#xff0c;北京中关村路口。一辆外卖电动车急着赶单&#xff0c;无视红灯冲向路口&#xff1b;与此同时&#xff0c;一辆载着孩子的校…

作者头像 李华
网站建设 2026/5/11 14:37:01

C++中的对象池模式

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第…

作者头像 李华