我正在参加「兔了个兔」创意投稿大赛,详情请看:「兔了个兔」创意投稿大赛
前言 📖
最近刚好在弄electron,就用electron和css写了一只桌面小兔几🐇,祝福大家兔年安康~
实现 👀
一、HTML+CSS先实现一只小兔几
由图可见,该乖兔是由几个不同的 div 经过 css 的变换组装起来的~
主要用到的
CSS属性为:border 属性(border-radius)、伪元素(before、after)、transform、动画(animation、@keyframes).
1️⃣ border-radius
- 设置四个参数的时候,第一个参数代表:左上 ,第二个参数代表:右上,第三个代表:右下,第四个参数代表左下,
border-radius:左上 右上 右下 左下. - 种比较少见的写法那就是中间用斜杠 / 分割开来,这种写法可以控制固定边的圆角, 斜杠左右都可以写四个参数,
border-radius:上1 上2 下3 下4 / 左1 右2 右3 左4.如下图所示:
- 以脸蛋为例,用 border-radius 实现
// html <div class="rabbit-face"></div> // css .rabbit-face { height: 9rem; width: 10rem; border-radius: 50% 50% 50% 50%/60% 60% 40% 40%; background-color: white; position: relative; }
2️⃣ ::before/::after 伪元素
-
在 CSS 中,::before、::after 创建一个伪元素,before 是所选元素的第一个子元素,after 是所选元素的最后一个子元素。它通常用于向具有 content 属性的元素添加装饰性内容。默认情况下,它是内联的。
-
注意 ⚠❗❗❗::before 和::after 生成的伪元素包含在元素的格式化框中,因此不应用于替换的元素,如img或br元素。 -
以眼睛为例
// html <div class="rabbit-eye rabbit-eye-left"></div> <div class="rabbit-eye rabbit-eye-right"></div> // css .rabbit-eye { border-radius: 50% 50% 50% 50%/55% 55% 45% 45%; position: absolute; z-index: 2; top: 3.75rem; height: 1.875rem; width: 1.75rem; background-color: black; transform-origin: center 70%; overflow: hidden; } /* 眼睛高光 */ .rabbit-eye::before, .rabbit-eye::after { content: ""; position: absolute; left: 50%; transform: translateX(-50%); border-radius: 100%; } .rabbit-eye::before { top: 0.125rem; height: 40%; width: 40%; background-color: white; } .rabbit-eye::after { top: 0.788rem; left: 1.256rem; height: 20%; width: 20%; background-color: white; } .rabbit-eye-left { left: 2rem; } .rabbit-eye-right { right: 2rem; }
3️⃣ transform
-
transform CSS 属性允许您旋转、缩放、倾斜或转换元素。它修改了 CSS 可视化格式化模型的坐标空间。基础包括:
- 旋转(rotate)
- 缩放(scale)
- 倾斜(skew)
- 移动(translate)
-
Syntax 语法
/* Keyword values */ transform: none; /_ Function values _/ transform: matrix(1, 2, 3, 4, 5, 6); transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); transform: perspective(17px); transform: rotate(0.5turn); transform: rotate3d(1, 2, 3, 10deg); transform: rotateX(10deg); transform: rotateY(10deg); transform: rotateZ(10deg); transform: translate(12px, 50%); transform: translate3d(12px, 50%, 3em); transform: translateX(2em); transform: translateY(3in); transform: translateZ(2px); transform: scale(2, 0.5); transform: scale3d(2.5, 1.2, 0.3); transform: scaleX(2); transform: scaleY(0.5); transform: scaleZ(0.3); transform: skew(30deg, 20deg); transform: skewX(30deg); transform: skewY(1.07rad); /_ Multiple function values _/ transform: translateX(10px) rotate(10deg) translateY(5px); transform: perspective(500px) translate(10px, 0, 20px) rotateY(3deg); /_ Global values _/ transform: inherit; transform: initial; transform: revert; transform: revert-layer; transform: unset; -
注意 ⚠❗❗❗只有可转换的元素可以被转换。也就是说,所有布局由 CSS 框模型控制的元素,除了:inline boxes,table-column boxes, andtable-column-group boxes. -
以耳朵为例
// html <div class="rabbit-ear rabbit-ear-left-wrap"> <div class="rabbit-ear-left"></div> </div> <div class="rabbit-ear rabbit-ear-right-wrap"> <div class="rabbit-ear-left"></div> </div> // css .rabbit-ear { --ear-radius-right: 50% 20%; --ear-position-left: 1rem; position: absolute; z-index: -2; bottom: 8rem; height: 2rem; width: 1.25rem; transform-origin: top center; transform: rotate(var(--ear-rotate)); } .rabbit-ear-left-wrap { --ear-rotate: -10deg; --keyframe-rotate-to: -25deg; right: calc(100% - 3.125rem); } .rabbit-ear-right-wrap { --ear-rotate: 10deg; --keyframe-rotate-to: 25deg; left: calc(100% - 7.125rem); bottom: 8.6rem; } .rabbit-ear-left { border-top-left-radius: 60% 48%; border-top-right-radius: 60% 48%; border-bottom-right-radius: 60%; border-bottom-left-radius: 60%; position: absolute; bottom: 0; left: var(--ear-position-left, auto); height: 10rem; width: 4rem; transform-origin: center bottom; transform: rotate(var(--ear-rotate)); background-color: white; overflow: hidden; perspective: 1000px; animation: rotateThing 2s ease-in-out infinite alternate; } .rabbit-ear-left::before, .rabbit-ear-left::after { content: ""; position: absolute; } .rabbit-ear-left::before { top: 2.5rem; left: 50%; height: 6rem; width: 2rem; transform: translateX(-50%); border-radius: inherit; background-color: #f5879b; opacity: 0.3; }
4️⃣ animation
-
animation 简写 CSS 属性在样式之间应用动画。它是以下合起来的的缩写.
animation-delay在开始执行动画之前将动画应用到元素的等待时间.动画可以稍后开始,从一开始立即开始,或者在动画的中途立即开始animation-delay: 250ms;animation-direction动画方向 CSS 属性设置动画应该向前、向后播放,还是在向前和向后播放序列之间来回交替播放animation-direction: normal;animation-duration动画持续时间 CSS 属性设置动画完成一个周期所需的时间长度animation-duration: 3s;animation-fill-modeanimation-fill-mode CSS 属性设置 CSS 动画在执行之前和之后如何应用样式到它的目标animation-fill-mode: forwards; animation-delay: 1s;animation-iteration-count设置动画序列在停止前应该播放的次数animation-iteration-count: 2;animation-name指定一个或多个@keyframes -rules 的名称,用于描述应用到元素上的动画。多个@keyframe at-rules 被指定为逗号分隔的名称列表。如果指定的名称与任何@keyframe at-rule 不匹配,则没有属性动画animation-name: sliding-vertically;animation-play-stateCSS 的 animation-play-state 属性用来设置动画是正在运行还是暂停animation-play-state: running/paused;animation-timing-functionCSS 的 animation-timing-function 属性设置动画如何在每个周期中进行animation-timing-function: ease
-
以兔子眨眼和晃动耳朵为例
// html 和上个例子一样 // css // 眨眼 @keyframes blink { 0%, 9%, 11%, 19%, 21%, 69%, 71%, 100% { transform: scaleY(1); } 10%, 20%, 70% { transform: scaleY(0); } } .rabbit-eye { ... /* 眨眼动画 */ animation: blink 7s infinite; } // 动耳 @keyframes rotateThing { 100% { transform: rotate(var(--keyframe-rotate-to)); } } .rabbit-ear-left { ... /* 动耳动画 */ animation: rotateThing 2s ease-in-out infinite alternate; }
css 效果图
其他小兔几部件的 css 也类似,多点耐心即可实现,完整小兔子如下:
二、搭建electron将兔子放进去
-
🐰 使用 vue cli 创建 vue 项目
-
🐰 使用 vue-cli-plugin-electron-builder 插件直接构建
-
🐰 使用 electron-icon-builder, 生成符合 Electron 的图标
-
🐰 在vue路由里加上对应的小兔几页面
-
🐰 安装好之后,配置background.js
效果展示 👀
代码链接 🔗
具体完整代码放于 gitee 上:项目地址
结语 📜
祝大家:
🐰 前“兔”无量
🐰 新的一年“兔”be fine
🐰 加油打气“兔”飞猛进
🐰 称心如意“兔”个吉利
🐰“免”young!“兔”much!
🐰“钱”“兔”无忧!