纯 CSS 制作赛博朋克 2077 “故障风”按钮

大家好,我是 Steven。

虽然我不打机,但我都知道 赛博朋克 2077 这个游戏,在它的网页上,有一个 Available Now 的按钮,当游标移到它之上的时候,会有一个好像故障的毛刺效果。

这一期,我们就会模仿并且实现这个效果。

这个教程的视频版在 https://www.bilibili.com/video/BV15A411s7cX ,欢迎三连关注!

编写 HTML 代码

打开 CodePen 编辑器 ( https://codepen.io ),在 HTML 的部份加入 <button> 标签,按钮的标题是 AVAILABLE NOW。

CSS 的部分

然后到 CSS 的部份,加入 body 标签,用 Flexbox 的方法将内容设定为上下左右置中。然后背景颜色,设定为黄色,加入 button 选择器,宽度设定为 380px,而高度设定为 86px,文字大小设定为 36px

然后我想换一种字型,到 Google Font 网站上,选择了 Bebas Neue 这个字型,将载入字体的代码贴到 HTML 内,然后将 CSS 字体的设定套用到 button 选择器内。

好了,将左下角变为斜角可以怎样做呢,一开始我想用 clip-path 去实现,但我想了又想,好像有一种更简单的方法,就是透过 linear-gradient 设定背景图片了。设定 backgroundlinear-gradient(),角度设定为 45deg,然后由透明色的 50%,切换为红色的 50%,这样 50% 前的部份就会透明,而 50% 后的部份就是红色,做到一个颜色分割的效果。

那我们要将红色的部份占大多数,只需要将 50% 改为 5%,就可以做到左下的斜角了。

然后框线设定为 0,文字颜色设定为白色,letter-spacing 字距设定为 3px,然后我觉得文字的上下有点不对齐,设定 line-height88px,这样就好一点了。

然后设定右边的亮蓝色边,将 box-shadow 设定为 6px 0px 0px #00E6F6,再将 outline 设定为 transparent,这样当点击按钮的时候,就不会有浏览器预设的按钮边框了。

现在按钮的样式大致上都实现了,那么怎样实现当游标移到它之上的时候,出现的那些毛刺效果呢?我们先在这个按钮上,重叠一个一模一样的按钮
要实现这一步,我会使用 Pseudo 伪类选择器。

实现变色层

加入 button::after 选择器,将 content 设定为 AVAILABLE NOW,然设 display 设定为 blockposition 设定为 absolute,当这里的 position 设定为 absolute,我们就回到 button 选择器里面,将 position 设定为 relative,这样它才可以根据按钮去定位,然后上下左右,都设定为 0,其余样式都与原来的按钮相同,所以在 button 选择器后面,加入逗号,button::after 就可以了。

这个叠在上面的按钮,我们会透过 clip-path(),裁剪其中一些部份出来,然后配合 transform 进行一些位移,再透过 animation 去达到动画的效果。所以我们会先在这一层做好变色的效果,首先是左下的斜角,会突显一些蓝色出来,将透明色的比例改为 3%,然后在中间加入一个亮蓝色,由 3%5%,然后就是中间的文字,加入 text-shadow 文字阴影,在左边加入一个黄色,右边加入一个蓝色,大致上就是这样了。

图形切割

下一步就是处理图形分割的部份,加入 clip-path,套用 inset(),里面的设定值有 4 个,分别代表上右下左,即是要向内缩小多少的意思。先设定为 80% -6px 0 0,右边设定为 -6px 的原因是,右边有一个亮蓝色的边框,由于它不计算在容器的范围内,所以要将右边设定为负数。

由于现在是完全重叠的状态,切割了也不明显,加入 transform: translate(-20px, 10px) 稍为移开一点,就可以清楚看到正在切割的是哪个部份了。先将这个切片储存到 CSS 变数中,名为 slice-1

第二个切片的数值是 50% -6px 30% 0,储存为 slice-2。第三个切片的数值是 10% -6px 85% 0,是上面的部份,储存为 slice-3。第四个切片的数值是 40% -6px 43% 0,都是文字的部份,储存为 slice-4。再做多一个切片就好了,第五个的数值是 80% -6px 5% 0,是下方的部份,储存为 slice-5

再新增一个预设值,50% 50% 50% 50%,储存为 slice-0,那我们这里 clip-path 的设定值改为 var(--slice-0),并且将 transform 移除就可以了。

其实这里所做的切片的位置和数量是挺随机的,大家可以根据想达到的效果自行更改数值。

动画制作

最后,制作动画的部份,新增 @keyframes glitch 定义一个动画名为 glitch,这里我分为 11 个部份,0%,10%,20%,如此类推,一直至到 100%。然后在每一个部份都设置 clip-path()transform()clip-path() 就随机套用一个切片,而 transform() 就定义一些随机值,稍为移动一下就可以了。

@keyframes glitch {
  0% {
    clip-path: var(--slice-1);
    transform: translate(-20px, -10px);
  }
  
  10% {
    clip-path: var(--slice-3);
    transform: translate(10px, 10px);
  }
  
  20% {
    clip-path: var(--slice-1);
    transform: translate(-10px, 10px);
  }
  
  30% {
    clip-path: var(--slice-3);
    transform: translate(0px, 5px);
  }
  
  40% {
    clip-path: var(--slice-2);
    transform: translate(-5px, 0px);
  }
  
  50% {
    clip-path: var(--slice-3);
    transform: translate(5px, 0px);
  }
  
  60% {
    clip-path: var(--slice-4);
    transform: translate(5px, 10px);
  }
  
  70% {
    clip-path: var(--slice-2);
    transform: translate(-10px, 10px);
  }
  
  80% {
    clip-path: var(--slice-5);
    transform: translate(20px, -10px);
  }
  
  90% {
    clip-path: var(--slice-1);
    transform: translate(-10px, 0px);
  }
  
  100% {
    clip-path: var(--slice-1);
    transform: translate(0);
  }
}

keyframes 的部份设定好了,加入 button:hover::after 选择器,当游标移到按钮之上的时候,触发动画,设定 animation,时间是 1 秒,动画名称是 glitch。试试看,基本上是可以了。

不过,这个是故障的效果呢,动画怎么会这么流畅,我们为它加一个设定,让它变得十分卡顿。设定 animation-timing-function 为 steps(2, end),数字越小,就越卡顿,大家可以试试。

我们来看看这个案例的完成效果

以上,就是今集要介绍的全部内容。


请关注 CodingStartup 起码课

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • 一、CSS入门 1、css选择器 选择器的作用是“用于确定(选定)要进行样式设定的标签(元素)”。 有若干种形式的...
    宠辱不惊丶岁月静好阅读 1,595评论 0 6
  • _________________________________________________________...
    fastwe阅读 448评论 0 0
  • ## 你可能会用到的css属性 > css语言相对简单,css的属性值就这么多,没有太多逻辑性,没有算法,熟记各个...
    流年_7fec阅读 238评论 0 0
  • 本文章主要整理了html入门的基础知识点 图片 <img> img { border-radiuds: 3px; ...
    壞忎阅读 285评论 0 3
  • 九、CSS隐藏元素的几种方法(至少说出三种) Opacity:元素本身依然占据它自己的位置并对网页的布局起作用。...
    天行健_96e7阅读 407评论 0 0