[css]通过transform缩放邮件客户端h5页面
摘要
最近一直在折腾邮件通知的东东,大概逻辑就是如果有新邮件,向收件人的app推送一条服务号消息,并且在单击该消息的时候,需要展示邮件的详情。
技术
这里是使用Exchange EWS API来实现的,通知的时候,只获取该邮件的标题,发件人信息,当用户单击查看详情的时候,拉取邮件详情,由于Exhcnage2012版本不支持纯文本格式的邮件内容,所以,在拉取的邮件信息是html格式的。这里面就涉及到如何自适应展示的问题。
中间尝试了几种对table,img做特殊处理方式,在我前面文章中也提到了这方面的内容,感兴趣的可以移步。但都不是特别的完美。总有一些页面中有些特别的标签,也有特别存在的table包裹img,这个时候发现缩放起来就不行了,也有导致图片高度拉伸变形的。
最后,和同事尝试了缩小整个邮件内容的方式。
首先需要摘取去html,body,head标签的邮件内容。
这里封装了一个简单的方法,可以实现:
private string SubEmailHtml(string html) { html = html.Replace("</head>", "").Replace("</body>", "").Replace("</html>", "").Replace("<head>", ""); int htmlStartIndex = html.IndexOf("<html"); int htmlEndIndex = html.IndexOf(">", htmlStartIndex); html = html.Substring(htmlEndIndex + 1); int bodyStartIndex = html.IndexOf("<body"); string htmlPart1 = html.Substring(0, bodyStartIndex); string htmlPart2 = html.Substring(bodyStartIndex); bodyStartIndex = htmlPart2.IndexOf("<body"); int bodyEndIndex = htmlPart2.IndexOf(">", bodyStartIndex); html = htmlPart1 + htmlPart2.Substring(bodyEndIndex + 1); return html; }
最后将返回的邮件内容塞入页面的div容器中。
<div class="topdiv" id="topdiv"> <div class="email-content" id="mailContent"> @Html.Raw(@Model.MailContent) </div> </div>
css代码片段
<style> .btn-zoom { width: 50px; height: 50px; position: fixed; border-radius: 999px; bottom: 60px; right: 12px; background: rgba(0,0,0,0.4); z-index: 99999; text-align: center; line-height: 50px; } .btn-zoom img { width: 55%; height: 55%; } .topdiv { padding-left: 12px; min-height: 700px; background-color: #fff; overflow: hidden; } .topdiv-zoom { overflow: auto; width: 100%; min-height: 1050px; } .email-content { margin-top: 12px; overflow: hidden; display: inline-block; background-color: #fff; background-position: center top; background-size: 100%; background-image: url('@Url.Scrpit("~/Content/Images/print_bg.png")'); } </style>
通过js控制是否进行缩放,如果内容宽度大于了手机屏幕的宽度,则进行缩放,否则原样展示邮件内容。
var $content = $("#mailContent"); var screenWidth = window.screen.width; console.log("screenWidth", screenWidth); var x = 1; var contentWidth = $content.width(); console.log("$content.width", $content.width()); var emailHtml = $("#topdiv").html(); if (contentWidth > screenWidth) { $("#dvzoom").css("display", "block"); x = (screenWidth - 24) / contentWidth; $("#topdiv").css("height", ($content.height() * x) + 50 + "px"); console.log(x); //transform:translate3d(0px,0px,0px) scale3d(0.1,0.5,1) $content.css("transform", "translate3d(0px,0px,0px) scale3d(" + x + "," + x + ",1)").css("transform-origin", "0px 0px 0px"); }; var isClick = false; var first = 1; $("#dvzoom").click(function () { isClick = !isClick; if (first == 1) { $content.css("-webkit-transition", "all .25s ease-in-out"); }; first++; // 相当于 if ($("#topdiv").hasClass("topdiv")) { $("#topdiv").removeClass("topdiv").css("overflow", "auto"); $content.css("overflow", "auto").css("display", ""); $("#topdiv").addClass("topdiv-zoom"); } else { $("#topdiv").removeClass("topdiv-zoom"); $("#topdiv").addClass("topdiv").css("overflow", "auto"); $content.css("overflow", "hidden").css("width", contentWidth + 'px').css("display", "inline-block"); }; if (isClick) { $("#dvzoom").find('img').attr("src", '@Url.Scrpit("~/Content/Images/full-screen-back.png")'); $content.css("transform", "translate3d(0px,0px,0px) scale3d(1,1,1)").css("transform-origin", "0px 0px 0px").css('margin-top', '0px'); } else { console.log(x); $("#dvzoom").find('img').attr("src", '@Url.Scrpit("~/Content/Images/full-screen.png")'); //$("#topdiv").css("overflow", "hidden").css("width", "100%").css("min-height", "1050px"); $content.css("transform", "translate3d(0px,0px,0px) scale3d(" + x + "," + x + ",1)").css("transform-origin", "0px 0px 0px"); }; });
这里是通过一个悬浮的放大缩小div来控制的,至于通过手势来实现,那只能在之后慢慢往上面添加了。
效果图
放大后的邮件内容,可以拖放
后话
之后会实现邮件内容的手势缩放的功能,目前通过单击按钮实现的也是最简单的。
-
博客地址:http://www.cnblogs.com/wolf-sun/
博客版权:如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。
分类:
[HTML/CSS]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
2015-09-20 [实战]MVC5+EF6+MySql企业网盘实战(2)——用户注册
2013-09-20 [Asp.Net]状态管理(ViewState、Cookie)