css小点心
本文由作者邹欣华授权网易云社区发布。
有一个在邮件中用饼图直观地显示用户的各项消费比例的需求。邮箱中不能用js,纯css实现饼图,只能通过后端模版渲染数据,所以数据越少越简单越好。
想到css3的transform的rotate属性,rotate通过对指定的角度参数对元素指定一个角度的旋转。圆形的话用border-radius就可以实现,但是怎样通过旋转生成饼图。一个完整的圆不论怎样旋转都还只是一个圆,达不到要让每一个模块按比例显示出来的效果。但是可以用多个扇形组合成一个圆,然后通过旋转的角度差,显示各自的比例。旋转以后显示需要的部分,不需要的部分就要隐藏起来。又联想到了css2的clip属性。可以利用clip裁剪出想要的部分,rotate旋转出百分占比的区域,其余的部分通过透明遮罩隐藏起来,border-radius属性实现圆形效果。
第一步得到一个小扇形。
裁剪圆的右边一半(clip:rect(0px,100px,200px,0px)),并且将右边半圆旋转20度(transform:rotate(20deg))。
第二步,接着生成多个扇形合成一个完整的圆。因为需求中不确定哪些内容需要展示,但是知道各自的数量以及总数,就可以计算出各自的占比,遮罩旋转的角度是前面所有扇形旋转角度的累加,扇形旋转的角度就是其百分比乘以360得出。
这里需要提前在css中把所有可能出现的种类及对应的颜色定义好。clip属性只能在设置了”position:absolute”或者”position:fixed”属性起作用
透明遮罩的公共样式
.hold {
position:absolute;
width:200px;
height:200px;
clip:rect(0px,200px,200px,100px);
}
扇形区域的公共样式
.pie {
position:absolute;
width:200px;
height:200px;
clip:rect(0px,100px,200px,0px);
border-radius:100px;
}
第三步,将所有的扇形渲染完成就是一个完整的饼图了。因为数据是动态的所以需要特殊处理一下占比大于50%的情况。如果第一个扇形占比大于50%,需要旋转180度之后,再写一个同样颜色的扇形区域接着之前的旋转剩余的角度。旋转角度通过后端模版计算出来,所以通过style来定义。
<div id="NVS" >
<div style="transform:rotate(180deg);"></div>
</div>
<div id="NVS" style="transform:rotate(180deg);">
<div style="transform:rotate(19.8deg);"></div>
</div>
还有一种特殊情况是扇形旋转的总角度和大于180,但是该扇形区域还有一部分未显示,需要将该部分旋转180减去前面部分的总和再写一个同样颜色的扇形区域接着之前的旋转该部分剩余的角度。
<div id="NLB" >
<div style="transform:rotate(60deg);"></div>
</div>
<div id="CDN" style="transform:rotate(60deg);">
<div style="transform:rotate(120deg);"></div>
</div>
<div id="CDN" style="transform:rotate(180deg);">
<div style="transform:rotate(90deg);"></div>
</div>
最后的结果图。
第一次接触到邮件中的需求,后来发现邮箱客户端css3的transform特性不支持,最后只能将饼图转换成图片放在页面中。并且考虑要outlook等邮箱客户端内核的不同,最好用table布局,并且图片要在页面中用img标签引入,譬如margin这样的属性会失效等。
以上只是我的思路与做法,欢迎各路大神支招改进。
附上各邮箱对css的支持情况:https://www.campaignmonitor.com/css/
免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐
更多网易技术、产品、运营经验分享请访问网易云社区。
相关文章:
【推荐】 Hadoop分布式集群的搭建
【推荐】 用双十一的故事串起碎片的网络协议(下)
【推荐】 HTTP/2部署使用
css小点心的更多相关文章
- ES6小点心第二弹——底部浮现弹窗
小点心,顾名思义,开箱即食,拿来即用. 献上第二个小点心:SlidePopup. GitHub 在线演示 GitHub 上欢迎大家来找茬^_^ 前端朋友们,今天要介绍的这款小点心牛B了.相信是个前端都 ...
- css小技巧(1)
1.-webkit-overflow-scrolling: touch; 解决ios滑动时无缓冲问题 2.::-webkit-scrollbar 设置ios滑动时是否显示滚动条 3.::selecti ...
- HTML+CSS小实战案例
HTML+CSS小实战案例 登录界面的美化,综合最近所学进行练习 网页设计先布局,搭建好大框架,然后进行填充,完成页面布局 <html> <head> <meta htt ...
- CSS小tip整理
CSS小tip整理 1.利用css在列表靠头和末尾添加箭头: /* 左箭头*/ ol a[rel="prev"]:before { content: "\00AB&quo ...
- css小细节罗列
有空时候把一些常见可能不是每个人都知道的css小细节总结了下,共勉. 1.line-height 众多周知,line-height是行高的意思,我们时常会使用类似line-height:24px;这样 ...
- css小随笔(二)与通用样式
51先在学校HTML5已经有半个多月了,然后这个星期做了一个京东的手机网站,接触到了通用样式,下面以京东的手机站为例 这两个就是京东手机站了的不同的两个板块,因为HTML5仅仅只是学完了基本标签跟cs ...
- ES6小点心之通用弹窗
小点心,顾名思义,开箱即食,拿来即用. 前端业务逻辑主要分为[交互效果]和[数据展示]两方面.数据展示可使用 MVVM 框架来实现.前端的交互效果常用的也就那么几种,比如弹窗,楼层定位,倒计时,下拉刷 ...
- iconfont字体图标和各种CSS小图标
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! iconfont字体图标 我们的需求中,很多时候会看到一些小的图形,或者叫图标,比如天猫网站中: ...
- CSS 小技巧
CSS 小技巧 一.边框内圆角 我们在设计例如按钮等控件的时候,会遇到这样的设计:只有内侧有圆角,而边框或者描边的四个角还是保持直角的形状,用以下代码可以轻松的实现. #wrapper { width ...
随机推荐
- [leetcode]269. Alien Dictionary外星字典
There is a new alien language which uses the latin alphabet. However, the order among letters are un ...
- [leetcode]29. Divide Two Integers 两整数相除
Given two integers dividend and divisor, divide two integers without using multiplication, division ...
- iOS 7.0.2 的bug记录
在iOS 7.0.2 版本上,如果从主屏幕进入webapp且webapp进入全屏模式,那么alert和修改window.location到某产品对应的itunes下载页面则无效. 可参考下面的代码示例 ...
- 类实现Parcelable接口在Intent中传递
类实现了Parcelable接口就可以在Intent中传递 只要在类的定义中实现Parcelable接口 代码 package entity; import android.os.Parcel; ...
- jquery datatables api
原文地址 学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/ ...
- tomcat用虚拟目录方式发布项目与manager页面配置
conf/Catalina/localhost:指定项目的配置信息 1.添加:ROOT.xml 听见Context节点: <Context docBase="/usr/local/to ...
- geoserver的rest服务介绍,搭建java程序
在geoserver中使用 Restlet 来提供所有的rest服务,并且geoserver中所有的在/rest目录下的请求都被看作为一个restful server,下图就是rest服务的调用过程 ...
- 配置tomcat server.xml 文件 ,虚拟路径
<Context path="/web" docBase="D:\workspace\web\src\main\webapp" reloadable=& ...
- HTML <img> 标签的 alt 属性
定义和用法 alt 属性是一个必需的属性,它规定在图像无法显示时的替代文本. 假设由于下列原因用户无法查看图像,alt 属性可以为图像提供替代的信息: 网速太慢 src 属性中的错误 浏览器禁用图像 ...
- PythonWEB框架之Flask--2
10.请求扩展 1 before_request 类比django中间件中的process_request,在青丘收到之前绑定一个函数做一些事情 #基于它做用户登录认证 @app.before_req ...