前端日常实战:130#视频演示如何使用CSS在线字体和D3制作Google&googol信息图
时间:2023-04-05 13:12:12
HTML5
效果预览在当前页面点击右侧“点击预览”按钮进行预览,点击链接全屏预览。https://codepen.io/comehop??e/pen/xaPZye互动视频本视频为互动视频,您可以随时暂停视频,编辑视频中的代码。请使用chrome、safari、edge打开观看。https://scrimba.com/p/pEgDAM/cwkpGf9源码下载每日前端实战系列完整源码请到github下载:https://github.com/comehop??e/front-end-daily-挑战代码解释定义dom,只有1个空元素,其中不包含任何文本:
导入字体文件,ProductSans是谷歌专门为品牌创建的无衬线字体:@importurl("https://fonts.googleapis.com/css?family=Product+Sans");中心显示:body{margin:0;高度:100vh;显示:弹性;对齐项目:居中;justify-content:center;}使用伪元素做一个logo,注意content的内容不是“Google”,而是“google_logo”:.logo::before{content:'google_logo';font-size:10vw;}设置字体,使用刚才介绍的在线字体,刚才页面上的“google_logo”文字已经换成了单色的logo图案:body{font-family:'productsans';}定义颜色变量::root{--blue:#4285f4;--红色:#ea4335;--黄色:#fbbc05;--green:#34a853;}设置文本遮罩效果并对文本着色:.logo::before{background-image:linear-gradient(toright,var(--blue)0%,var(--blue)26.5%,var(--red)26.5%,var(--red)43.5%,var(--yellow)43.5%,var(--yellow)61.5%,var(--blue)61.5%,var(--blue)78.5%,var(--green)78.5%,var(--green)84.5%,var(--red)84.5%,var(--red)100%);-webkit-背景剪辑:文本;-webkit-text-fill-color:transparent;}至此谷歌的logo就做好了,接下来就是googol的信息了,说明谷歌的名字来源于1后面100个字googol代表大量的意思零在dom中添加一行解释性文本和一个数字容器。容器包含5个数字,颜色变量在每个数字的内联样式中指定:
Google的名字源于单词“googol”的拼写错误,数字1后跟100个零.10000 设置描述文字Style:.desc{font-size:1.5vw;字体粗细:正常;颜色:暗灰色;margin-top:2em;}样式编号:.zeros{font-size:3vw;字体粗细:粗体;保证金-顶部:0.2em;文本对齐:居中;宽度:25.5em;word-wrap:break-word;}给数字上色:.zerosspan{color:var(--c);}轻推数字“1”使其不要太靠近后面的“0”:.zerosspan:nth-child(1){margin-right:0.2em;}至此静态布局完成,接下来使用d3批量处理数字。引入d3库,删除dom中.zeros的number子元素:最后我们将100显示在第0页,每个0有不同的颜色,为了美观,相邻的数字也应该有不同的颜色。因此,首先定义一个获取颜色的函数,可以从谷歌logo配色的4种颜色中取任意一种颜色,并有一个参数表示被排除的颜色。当指定该参数时,会从4个可选颜色中选择颜色中去掉这个颜色,然后从剩下的3个颜色中随机选择一个颜色:functiongetColor(excludedColor){letcolors=newSet(['blue','red','yellow','green'])colors.delete(excludedColor)returnArray.from(colors)[Math.floor(d3.randomUniform(0,colors.size)())]}然后,定义2常量,ZEROS是一个存放100个0的数组,ONE是一个存放数字1的对象,它有2个属性。number表示它的值为1,color表示它的颜色是蓝色:constZEROS=d3.range(100).map(x=>0)constONE={number:1,color:'blue'}接下来,通过遍历使用reduce函数的ZEROS数组,返回一个新数组numbers,它有101个元素(1后跟100个0),每个元素是1个具有数字和颜色属性的对象:letnumbers=ZEROS.reduce(function(numberObjects,d){numberObjects.push({number:d,color:getColor(numberObjects[numberObjects.length-1].color)})returnnumberObjects},[ONE])然后以numbers为数据源,使用d3批量创建dom元素,并在内联样式中写入颜色信息:d3.select('.zeros').selectAll('span').data(numberObjects).enter().append('span').style('--c',(d)=>`var(--${d.color})`).text((d)=>d.number)最后,微调内容的边距整个中心内容:.logo{margin-top:-10vh;}就大功告成了!