• [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 {
                 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 {
                     55%;
                    height: 55%;
                }
    
            .topdiv {
                padding-left: 12px;
                min-height: 700px;
                background-color: #fff;
                overflow: hidden;
            }
    
            .topdiv-zoom {
                overflow: auto;
                 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来控制的,至于通过手势来实现,那只能在之后慢慢往上面添加了。

    效果图

    放大后的邮件内容,可以拖放

    后话

    之后会实现邮件内容的手势缩放的功能,目前通过单击按钮实现的也是最简单的。

  • 相关阅读:
    AVCODEC_MAX_AUDIO_FRAME_SIZE 未定义标识符
    ffmpeg -使用总结
    ubuntu 编译安装ffmpeg
    转-查看Linux CPU个数,核心,线程数
    fpga是什么
    div自适应水平垂直居中的方法
    css百分比问题——`top`、`left`、'translate'的百分比参照谁?
    经典面试题:二分查找/折半查找
    JavaScript预解析
    React--组件
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/5888923.html
Copyright © 2020-2023  润新知