当前位置: 首页 > news >正文

HTML + CSS 创建图片倒影的 5 种方法

HTML + CSS 创建图片倒影的 5 种方法

目标:掌握多种生成“图片倒影 / Reflection”效果的实现思路,理解兼容性、性能差异与最佳实践,方便在真实业务(商品展示、相册、登陆页面视觉强化)中安全使用。


总览对比

方法 核心技术 代码量 兼容性 动态内容适配 可控性 适用场景
1. -webkit-box-reflect 私有 CSS 属性 最少 仅 WebKit (Chrome / Safari / Edge) 自动 快速 Demo / 营销页
2. 伪元素 + transform: scaleY(-1) 标准 CSS 所有现代浏览器 良好 高(可自定义遮罩) 通用首选
3. 伪元素 + mask-image / -webkit-mask CSS Mask Safari / Chromium (Firefox 部分实验) 良好 很高(渐隐更自然) 高端展示
4. SVG 复制 + 渐变遮罩 内联 SVG 全面 (IE 除外) 良好 很高(滤镜/形变) 复杂视觉 / 批量渲染
5. Canvas 二次绘制 <canvas> 全面 需手动重绘 最高(像素级) 动态生成 / 后处理

选择建议:

  1. 追求最少代码 & 不顾部分浏览器:用 1。
  2. 需要兼容性 + 易维护:用 2。
  3. 想要柔和渐隐过渡、无多余 DOM:用 3。
  4. 大型可视化 / 复杂滤镜链:用 4。
  5. 需要最终导出合成图 / 动态内容(如生成分享海报):用 5。

方法一:-webkit-box-reflect(最简单 / 兼容性受限)

<style>.reflect-webkit {width: 240px;-webkit-box-reflect: below 6px linear-gradient(to bottom, rgba(0, 0, 0, 0.25), transparent70%);}
</style>
<img class="reflect-webkit" src="demo.jpg" alt="Product" />

说明:

  • 语法:-webkit-box-reflect: <direction> <offset> <mask>
  • linear-gradient 充当倒影的渐隐遮罩。
    优点:单行 + 自动跟随宽高。
    缺点:仅 WebKit 内核(Firefox 不支持)。
    适合:临时视觉增强、非核心信息。

方法二:伪元素复制 + 反转(推荐通用方案)

思路:利用容器包裹图片,伪元素 ::after 再绘制同一张图像,垂直翻转并添加渐变。

<div class="reflection-box"><img src="demo.jpg" alt="Phone" />
</div><style>.reflection-box {position: relative;width: 240px;}.reflection-box img {display: block;width: 100%;}.reflection-box::after {content: '';position: absolute;left: 0;right: 0;top: 100%;height: 100%;background: url('demo.jpg') center/cover no-repeat;transform: scaleY(-1);transform-origin: top;opacity: 0.6;/* 渐隐叠加 */mask-image: linear-gradient(to bottom,rgba(0, 0, 0, 0.8),rgba(0, 0, 0, 0));-webkit-mask-image: linear-gradient(to bottom,rgba(0, 0, 0, 0.8),rgba(0, 0, 0, 0));}
</style>

处理动态 src:

  • 如果图片 URL 需动态绑定,可用行内 style="--src:url('xxx')" + background: var(--src) 或用 JS 设置伪元素。
  • 亦可直接复制 <img> 节点再 scaleY(-1),如下:
<div class="reflect-wrap"><img src="demo.jpg" alt="Phone" class="origin" 
http://www.xdnf.cn/news/1455139.html

相关文章:

  • 大数据毕业设计选题推荐-基于大数据的儿童出生体重和妊娠期数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • 加密货币武器化:恶意npm包利用以太坊智能合约实现隐蔽通信
  • 性能堪比claude sonnet4,免费无限使用!claude code+魔搭GLM4.5在ubuntu上安装完整流程
  • Cadence OrCAD Capture绘制复用管脚封装的方法图文教程
  • 蔚来8月狂卖3.1万辆,反超理想引热议!
  • C++ opencv+gstreamer编译,C++ opencv4.5.5+gstreamer1.0 -1.24.12 编译 ,cmake 4.0.0
  • OpenCV: Mat存储方式全解析-单通道、多通道内存布局详解
  • 0904网络设备配置与管理第二次授课讲义
  • 如何用仓库路线完成一个音视频实战项目:FFmpeg + SDL 简易播放器
  • 把开发环境丢云上,我的电脑风扇再也没转过!
  • 【EasyExcel】Excel工具类2.0
  • C++ STL 中 `std::list` 双向链表容器的几个关键成员函数:`empty()`、`front()` 和 `pop_front()`
  • 【机器学习】HanLP+Weka+Java算法模型
  • 指针高级(3)
  • Redlock:为什么你的 Redis 分布式锁需要不止一个节点?
  • ​浏览器存储
  • 设计模式:中介者模式(Mediator Pattern)
  • 力扣190:颠倒二进制位
  • MySQL主从复制进阶(GTID复制,半同步复制)
  • SpringMVC —— 响应和请求处理
  • 手写 Tomcat
  • STM32启动模式配置
  • 一个开源的企业官网简介
  • RTSP H.265 与 RTMP H.265 的差异解析:标准、扩展与增强实现
  • 设备监控系统如何为重工业实现设备预测性维护
  • 【智谱清言-GLM-4.5】StackCube-v1 任务训练结果不稳定性的分析
  • uniapp中使用echarts并且支持pc端的拖动、拖拽和其他交互事件
  • 案例精述 | 防护即智能 Fortinet赋能英科全栈安全重构实践
  • [晕事]今天做了件晕事91,glibc,rand之前必须设置种子
  • AI+Java 守护你的钱袋子!金融领域的智能风控与极速交易