服务过美国总统竞选的非传统投票UI [解析及DEMO]

需求在这里  服务过美国总统竞选的非传统投票UI

需要实现这样的效果

=================正文开始=====================================

这些天一直在忙,抽空把代码完成了。和大家分享一下实现。

大家先在chorme上看一下DEMO吧,在线DEMO地址 http://codepen.io/arfeizhang/full/liIHa

(DEMO只是为了说明原理,所以没做浏览器兼容,请大家在chrome上体验下)

DEMO看着还可以吧,我们开始分析啦~

这种非常规的UI,在底层还是由常规的元素组成,在实现上,需要前端开发者想办法,创造(没错,是创造,在现在常规资源的基础上进行组合创造)出非常规的效果。

接下来,我们切入正题。

看到效果图后,我分析了一下,打算这样搭元素结构。最外面一个div,作为这个ui的最外层,里面再来三个div,两个用来放置左右直角梯形(里面再放图片和文字元素),余下的一个做成中间的faceoff图标。

html代码结构是这个样子。

 1 <div id="faceoff">
 2     <div id="person1" class="pic_wrap">
 3         <div class="pic">
 4          <div class="desc">
 5           <div class="content">
 6             Raised in Bloomfield Hills, Michigan, by his parents George and Lenore Romney, Mitt Romney spent two and a half years in France as a Mormon missionary starting in 1966. In 1969 he married Ann Davies, with whom he has had five sons. By 1971, Romney had participated in the political campaigns of both of his parents. He earned a Bachelor of Arts at Brigham Young and in 1975.
 7         </div>
 8           <div class="title">Mitt Romney</div>
 9         </div>
10       </div>
11     </div>
12 <div id="faceoffIcon">FACEOFF</div>
13     <div id="person2" class="pic_wrap">
14      <div class="pic">
15         <div class="desc">
16           <div class="title">Barack Obama</div>
17           <div class="content">
18                    Born in Honolulu, Hawaii, Obama is a graduate of Columbia University and Harvard Law School, where he served as president of the Harvard Law Review. He was a community organizer in Chicago before earning his law degree. He worked as a civil rights attorney and taught constitutional law at the University of Chicago Law School from 1992 to 2004.
19                </div>
20         </div>
21       </div>
22     </div>
23 </div>

接着来解决直角梯形UI,我想着可以这样实现:把一个矩形进行沿x轴歪斜(skew),这个矩形就会变成个棱形(如下图),然后我们把左尖角或右尖角遮住,就变成直角梯形了(相当于切掉左/右角)。不过在过程中发现了一个问题:形状达到我们要求了,但随之而来的问题是,里面的图像也扭曲了,就像下面这样。

这个好办,我们把图像再扭回来就是了。来,反向扯一下。OK!现在正常了。

直角梯形的原理,如下图所示:

补充一句,这种做法还可以做这种非常规ui

PS.还可以用webkit clip来实现非常规形状,大家可以查下它的用法。

做好了形状,接着来完成文字部分,这种非常规排版方式,adobe有过提议(CSS Shape),但目前CSS Shape只能在Webkit Nightly和Chrome Canary浏览器中实现,等以后等普及后,我们可以做出类似于这种效果。

因为浏览器支持度不够,我们要实现非常规的UI,还是得用别的办法。plusice同学提出,我们可以在文字中插入一些&nbsp;(空格)达到这个效果,这种方法可行,但难点是,需要找到插入点和应插入的空格数量。

我用另一种办法达到了这个效果,给大家看三张图,大家就能理解了:

上面最后一张图,为了方便大家看,我把介绍内容给移了一下。大家应该看出来了吧,我是利用一些透明的占位元素(这里加了红色边框是为了使大家看得清楚),将介绍给挤成我们要的形状。

这种做法需要解决的是,这些占位元素的宽度各是多少?这里我们借助程序来实现。

1 //依据角的邻边算对边长度
2 function getWidth(height) {
3   return Math.tan(deg * Math.PI / 180) * height;
4 }
5 // 依据行数得到角的邻边长度,进而算得对边长度
6 function getWidthByLineIndex(i) {
7   return getWidth(i * lineHeight);
8 }

这个程序的作用是,依据索引值生成一些依次递增或递减的span并把它加入到介绍div内。我们需要预定好角度值deg,这里我定义的是13度,和页面上的直角梯形角度一致。

文本内容完成了,接下来做遮罩。使鼠标在图片上面时,介绍内容滑下来。这个一般是用改变dom的属性实现的,但不是本文的重点,我就偷个懒直接用css3 动画来做了。

 1 #person1>.pic:hover>.desc {
 2     -webkit-animation: left-show 0.8s 0s normal forwards;
 3     -webkit-animation-timing-function: ease-in;
 4 }
 5 #person1>.pic>.desc {
 6     -webkit-animation: left-hide 0.8s 0s normal forwards;
 7     -webkit-animation-timing-function: ease-out;
 8 }
 9 #person2>.pic:hover>.desc {
10     -webkit-animation: right-show 0.8s 0s normal forwards;
11     -webkit-animation-timing-function: ease-in;
12 }
13 #person2>.pic>.desc {
14     -webkit-animation: right-hide 0.8s 0s normal forwards;
15     -webkit-animation-timing-function: ease-out;
16 }
17 @-webkit-keyframes left-show {
18     from {
19         margin-top: -440px;
20     }
21     to {
22         margin-top: 0px;
23     }
24 }
25 @-webkit-keyframes left-hide {
26     from {
27         margin-top: 0px;
28     }
29     to {
30         margin-top: -440px;
31     }
32 }
33 @-webkit-keyframes right-show {
34     from {
35         margin-top: 440px;
36     }
37     to {
38         margin-top: 0px;
39     }
40 }
41 @-webkit-keyframes right-hide {
42     from {
43         margin-top: 0px;
44     }
45     to {
46         margin-top: 440px;
47     }
48 }

hover滑动动画

恩,上下滑动功能正常,鼠标响应区域和文本内容也是直角梯形。好了,我们把它完成了!!!活动下手~~~~~~~ 等等,有个问题,被我们旋转的左右部分div,斜边出现了锯齿,还是比较明显的。

好吧,抱着追求完美的心态,我们来解决这个问题。将元素3d变换不仅可以开启硬件加速,让元素脱离文档流,提升性能,还可以达到我们的目的-反锯齿。但缺点是,字会有点模糊(因为它会把在上面的图或文字等内容当成图片纹理来贴图),不过这个小瑕疵比锯齿好得多。如果大家有别的方法完美消锯齿,也请告诉我。

好,收摊。现在各位感觉到了,实现这个UI其实也不难,要用点巧即可。实现方法不止一种,我感觉我虽然实现了这个需求,但我相信还有别的更优雅的办法。此文仅做抛砖引玉,大家如果有别的实现方法,和我分享下哟。 :)

所有代码如下:

  1 <!DOCTYPE HTML>
  2 <html manifest="" lang="en-US">
  3 <head>
  4     <meta charset="UTF-8">
  5         <title>Faceoff</title>
  6         <style type="text/css">
  7 div#faceoff {
  8     overflow: hidden;
  9     width: 710px;
 10 }
 11 .pic>.desc {
 12     background-color: rgba(0, 0, 0, 0.5);
 13     color: white;
 14 }
 15 .pic>.desc>.content {
 16     font-size: 22px;
 17     line-height: 26px;
 18     word-break: break-all;
 19 }
 20 .pic>.desc>.title {
 21     font-size: 30px;
 22     margin-bottom: 20px;
 23 }
 24 .pic_wrap {
 25     -webkit-transform: skewX(-13deg) translateZ(0);
 26     overflow: hidden;
 27     width: 353px;
 28     height: 480px;
 29     position: relative;
 30 }
 31 #person1 {
 32     left: -87px;
 33     float: left;
 34 }
 35 #person1>.pic {
 36     width: 461px;
 37     height: 480px;
 38     background: url("resources/1.jpg") no-repeat;
 39     background-position: -51px 0px;
 40     background-size: 620px 480px;
 41     -webkit-transform: skewX(13deg);
 42 }
 43 #person1>.pic>.desc {
 44     width: 312px;
 45     float: left;
 46     margin-left: 90px;
 47     margin-top: -440px;
 48 }
 49 #person1>.pic>.desc>.title {
 50     text-align: left;
 51     padding-left: 5px;
 52 }
 53 #person1>.pic>.desc>.content {
 54     padding: 2px;
 55     height: 440px;
 56 }
 57 #person2 {
 58     left: -57px;
 59 }
 60 #person2>.pic {
 61     width: 361px;
 62     height: 480px;
 63     background: url("resources/2.jpg") no-repeat;
 64     background-position: 20px -25px;
 65     background-size: 376px 540px;
 66     -webkit-transform: skewX(13deg);
 67     margin-left: -100px;
 68 }
 69 #person2>.pic>.desc {
 70     width: 320px;
 71     float: right;
 72 }
 73 #person2>.pic>.desc>.title {
 74     text-align: right;
 75     padding-right: 5px;
 76 }
 77 #person2>.pic>.desc>.content {
 78     padding-right: 2px;
 79     height: 440px;
 80 }
 81 .space {
 82     /* border: 1px solid red;*/
 83     height: 22px;
 84 }
 85 .space.left {
 86     float: left;
 87     clear: left;
 88 }
 89 .space.right {
 90     float: right;
 91     clear: right;
 92 }
 93 #faceoffIcon {
 94     width: 80px;
 95     height: 80px;
 96     position: absolute;
 97     background-color: red;
 98     border: 3px solid white;
 99     border-radius: 40px;
100     top: 194px;
101     left: 247px;
102     z-index: 2;
103     color: white;
104     line-height: 80px;
105     text-align: center;
106     font-weight: bold;
107 }
108 #faceoff:hover>#faceoffIcon {
109     display: none;
110 }
111 #person1>.pic:hover>.desc {
112     -webkit-animation: left-show 0.8s 0s normal forwards;
113     -webkit-animation-timing-function: ease-in;
114 }
115 #person1>.pic>.desc {
116     -webkit-animation: left-hide 0.8s 0s normal forwards;
117     -webkit-animation-timing-function: ease-out;
118 }
119 #person2>.pic:hover>.desc {
120     -webkit-animation: right-show 0.8s 0s normal forwards;
121     -webkit-animation-timing-function: ease-in;
122 }
123 #person2>.pic>.desc {
124     -webkit-animation: right-hide 0.8s 0s normal forwards;
125     -webkit-animation-timing-function: ease-out;
126 }
127 @-webkit-keyframes left-show {
128     from {
129         margin-top: -440px;
130     }
131     to {
132         margin-top: 0px;
133     }
134 }
135 @-webkit-keyframes left-hide {
136     from {
137         margin-top: 0px;
138     }
139     to {
140         margin-top: -440px;
141     }
142 }
143 @-webkit-keyframes right-show {
144     from {
145         margin-top: 440px;
146     }
147     to {
148         margin-top: 0px;
149     }
150 }
151 @-webkit-keyframes right-hide {
152     from {
153         margin-top: 0px;
154     }
155     to {
156         margin-top: 440px;
157     }
158 }
159
160     </style>
161 </head>
162 <body>
163   <div id="faceoff">
164     <div id="person1" class="pic_wrap">
165         <div class="pic">
166          <div class="desc">
167           <div class="content">
168             Raised in Bloomfield Hills, Michigan, by his parents George and Lenore Romney, Mitt Romney spent two and a half years in France as a Mormon missionary starting in 1966. In 1969 he married Ann Davies, with whom he has had five sons. By 1971, Romney had participated in the political campaigns of both of his parents. He earned a Bachelor of Arts at Brigham Young and in 1975.
169         </div>
170           <div class="title">Mitt Romney</div>
171         </div>
172       </div>
173     </div>
174 <div id="faceoffIcon">FACEOFF</div>
175     <div id="person2" class="pic_wrap">
176      <div class="pic">
177         <div class="desc">
178           <div class="title">Barack Obama</div>
179           <div class="content">
180                    Born in Honolulu, Hawaii, Obama is a graduate of Columbia University and Harvard Law School, where he served as president of the Harvard Law Review. He was a community organizer in Chicago before earning his law degree. He worked as a civil rights attorney and taught constitutional law at the University of Chicago Law School from 1992 to 2004.
181                </div>
182         </div>
183       </div>
184     </div>
185 </div>
186
187 <script type="text/javascript">
188 //角度为13度
189 var deg = 13,
190   //占位元素的高
191   lineHeight = 22,
192   //元素高
193   contentHeight = 460,
194   //占位元素个数(行数)
195   lineCount = Math.ceil(contentHeight / lineHeight),
196   //相邻两个占位元素的宽度偏移量
197   lineOffset = getWidth(lineHeight),
198   //最大占位容器宽度,右侧的占位容器从大到小递减,左侧的占位元素从小到大递增
199   lineMaxWidth = getWidth(contentHeight);
200
201 //用占位容器来填充形状
202 function SetShape(isRight) {
203   var oFrag = document.createDocumentFragment();
204   if (isRight) {
205     for (var i = 0; i < lineCount; i++) {
206       var op = document.createElement("span");
207       op.classList.add("space");
208       op.classList.add("left");
209       // 右侧的占位容器从大到小递减
210       op.style.width = (lineMaxWidth - i * lineOffset) + "px";
211       oFrag.appendChild(op);
212     }
213     document.querySelector("#person2 .desc").insertBefore(oFrag, document.querySelector("#person2 .content"));
214   } else {
215     for (var i = 0; i < lineCount; i++) {
216       var op = document.createElement("span");
217       op.classList.add("space");
218       op.classList.add("right");
219       // 左侧的占位元素从小到大递增
220       op.style.width = (i * lineOffset) + "px";
221       oFrag.appendChild(op);
222     }
223     document.querySelector("#person1 .desc").insertBefore(oFrag, document.querySelector("#person1 .content"));
224   }
225
226 }
227 //依据角的邻边算对边长度
228 function getWidth(height) {
229   return Math.tan(deg * Math.PI / 180) * height;
230 }
231 // 依据行数得到角的邻边长度,进而算得对边长度
232 function getWidthByLineIndex(i) {
233   return getWidth(i * lineHeight);
234 }
235 SetShape(false);
236 SetShape(true);
237 </script>
238
239     </body>
240     </html>

faceoff全部代码

素材两张(尺寸已缩小,可右键下载源图):

本文是博主Arfei Zhang原创,欢迎转载。转载请注明转自博客园,并附上本文链接http://www.cnblogs.com/arfeizhang/p/faceoffdemo.html,谢谢!

服务过美国总统竞选的非传统投票UI [解析及DEMO]

时间: 2024-10-04 19:46:55

服务过美国总统竞选的非传统投票UI [解析及DEMO]的相关文章

服务过美国总统竞选的非传统投票UI

12年初,我参与了一个项目(在项目中主要负责实现下面说到的一个需求),这个项目针对美国国内用户,主要作用是投票. 这个项目会用于美国的一些民众评选,其中,包括奥巴马和罗姆尼竞选美国总统的民意调查和美国明星奖项评选. US团队喜欢叫它faceoff,有对决的意思. 好吧,既然取名有点剑拔弩张,设计也会磨剑擦枪,设计稿大概是这个样子.(项目现在已经下线了,我按回忆做了一个简单的样子作为参考) 当时win8的metro风格出来有一阵子,类似的设计已不鲜见,一般是图上面一个overlay,overlay

马克·扎克伯格回应:Facebook操纵美国总统选举

[阅读原文] 作者:海洋 在美国总统选举期间,Facebook假新闻泛滥,例如:一名联邦调查局特工因希拉里克林顿(Hillary Clinton)的电子邮件泄漏被谋杀或教皇支持特朗普.外界指责,Facebook未能及时截止假新闻的传播,致使房地产大亨特朗普在美国总统选的真人秀中取胜. 在美国总统选举之后,Facebook首席执行官马克·扎克伯格登上2016科技经济大会(Techonomy16)的讲台,就公众担心Facebook未采取足够措施制止消息流中假新闻泛滥一事作出回应. "就我个人而言,相

美国总统也阻止不了的世纪交易:AT&T收购时代华纳

作者: 茱莉叶 [IT战略家]   美总统反对,AT&T仍信心十足 AT&T 850亿美元收购时代华纳早已宣布达成交易,但如今却因美国总统特朗普的上台而可能被搁置. 在总统大选之时,特朗普就对此笔交易持反对态度,认为这项收购很可能引发重大行业垄断,对消费者利益造成严重损害.并且,特朗普多次指控时代华纳旗下的CNN对媒体新闻不公平覆盖,这层关系很是紧张.特朗普表示在任期间都不会同意此类交易的发生,还想试图打破已达成交易的康卡斯特公司-NBC环球公司的并购. 事实上,特朗普的言论有些破坏政府的

积压压:特朗普就任美国总统后或将加入亚投行

积压压商城11月更新:日前,据亚投行行长金立群指出,特朗普出任美国总统之后可能会重新考虑加入中国牵头的亚投行.特朗普就任美国总统后或加入亚投行,但没多少股份了.据悉,此前,美国当选总统特朗普的高级顾问伍尔西10日称,奥巴马反对亚投行是一个"战略性错误",美国甚至应该更热情的对待"一带一路"战略. 积压压商城了解到金立群表示,不管美国在一开始是多么厌恶亚投行,都不能排除特朗普掌权后加入的可能性. "我听到奥巴马政府一位高层官员在称赞亚投行.在特朗普当选后,有

名人励志故事&#183;美国总统林肯的一生

Reference http://blog.sina.com.cn/s/blog_647ed7510102vrca.html 原文地址:https://www.cnblogs.com/VIPlued/p/8340076.html

微服务 SpringBoot 2.0(二):配置文件解析

properties我用了好多年,你却让我用yml,这是什么鬼 -- Java面试必修 引言 上一篇介绍了Spring Boot的轻松入门项目构建,对Spring Boot的特性有了初步了解.但如果要想玩得很熟练的话就请看接下来的文章,这样有助于后续我们快速的构建企业级应用,打怪咱得先熟悉地图对吧 配置详解 工具 SpringBoot版本:2.0.4 开发工具:IDEA 2018 Maven:3.3 9 JDK:1.8 配置文件类型 本文主要讲解SpringBoot的配置文件,常用的配置文件类型

2016年总统选举的预测

ASA的美国总统竞选 在这个大选之年,美国统计协会(ASA)将学生竞赛和总统选举放在一起,将学生预测谁是2016年总统大选的赢家准确的百分比作为比赛点.详情见: http://thisisstatistics.org/electionprediction2016/ 获取数据 互联网上有很多公开的民调数据.可以下面的网站获取总统大选的相关数据: http://projects.fivethirtyeight.com/2016-election-forecast/national-polls/ 其他

对IBM,阿里巴巴,麻省理工,google的报道

IBM 1. IBM作为老牌企业,一直在引领者技术方面的变革.当IBM再一次从自我革新开始,期望能够更快的将认知计算和云推广给自己的合作伙伴和用户们,以帮助他们在新的转型期内,能够快人一步. 但是,我们所知的以往传统的合作伙伴模式已经不能更好的匹配现阶段的一些新情况.IBM自己也提出了对于合作伙伴计划的升级.在大会期间我采访到了IBM全球合作伙伴事业部.软件渠道副总裁Michael Gerentine,IBM全球合作伙伴事业部.硬件渠道副总裁Sergio Amoni以及IBM大中华区副总裁.全球

宁远:让群众过个“暖心”的好年h7

省委派驻永州两会现场督导组组长.省委组织部副部长蔡建和到会指导并在主席台前排就座. 特朗普当天还在推特上再次说,美国情报机构领导人强烈表示,没有任何证据显示网络袭击影响了2016年美国总统选举结果,投票机没有遭到破坏.他还指责遭到网络袭击的民主党全国委员会在网络防护方面有重大过失.{res 专家解读:巡视"回马枪"成效显著.中央巡视工作不断创新形式,加大力度.截至目前,中央巡视组已经巡视了240多个党组织,实现了对地方.央企.金融单位和中央国家机关四个板块的巡视全覆盖. 以四川金阳为例