本文讲述的原理和相关demo
  • 扇形DIV的使用——实现雷达扫描图
  • DIV环形布局—实现loading圈
  • 动画的向量合成—实现抛物线动画
  • 无限滚动动画—实现跑马灯效果
  • perspective和transform的运用——实现卡片翻转
 
话不多说,请看。
 

扇形DIV的使用——实现雷达扫描图

在一些杀毒或文件扫描类的软件上,我们可能会看到一些雷达扫描的UI样式,例如下图所示
 
如果我们要通过CSS该如何去实现话,我们的想法一般是先画个扇形,然后给它加上渐变。
实现渐变的方式很简单,但我们该如何实现一个扇形呢?
 
我们可以通过一些技巧实现这一点,请看:
没错,我们可以通过skew函数,将黄色的div倾斜,然后溢出部分通过overflow:hidden遮住就可以了。
  • 锐角扇形:deg<0,向右边倾斜,即可得到锐角扇形
  • 钝角扇形:deg>0, 向左边倾斜,即可得到钝角扇形
 
代码如下
// CSS代码
@keyframes rotateAnimate {
from {
transform: rotate(0deg) skew(-30deg)
} to {
transform: rotate(360deg) skew(-30deg)
}
} .fan-wrapper {
overflow: hidden;
position: relative;
margin: 100px;
width: 200px;
height: 200px;
border-radius: 50%;
background: red;
} .fan {
position: absolute;
right:;
animation: rotateAnimate 2s linear infinite;
/* 这一行很重要,设置左下角为旋转点 */
transform-origin: 0% 100%;
width: 100px;
height: 100px;
background: blue;
}
// HTML代码
<div class="fan-wrapper">
<div class="fan"></div>
</div>
 
实现效果如下图所示
(因为篇幅有限,渐变就不加了2333)
 

DIV环形布局—实现loading圈

 
loading加载条是常见的一种UI组件,如下图所示
而要实现它,就需要考虑怎么把一堆小圆等距地布局在一个“大圆”的边框上,也就是DIV的环形布局的问题。
当然我们可以通过暴力测量解决,但很麻烦且不优雅,而且如果小圆的数量变化的话要重新测一遍。
我的解决办法如下:
 
第一步:根据圆的数量计算相邻圆和圆心形成的夹角
例如假设我们需要排列8个圆,那么夹角为360度 / 8 = 45度。图示如下,每个数字代表以该位置为圆心放一个小圆
 
第二步:以外部DIV左下角为原点,批量计算小圆圆心的横纵坐标
批量算出所有圆的相对坐标,我们以编号8的圆为例,假设半径R和X轴的逆时针夹角为θ,则有以下等式
(cos/sin可能有正负,而等式同样成立)
第三步,外部div相对定位,内部小圆绝对定位,并且将步骤二中计算的X/Y作为小圆的bottom和left去设置
这一步也是批量完成,下图以编号8的圆为例
 
代码
CSS/HTML代码如下:
我们在一个父div内部放8个子div。父div相对定位,而子div绝对定位
// CSS代码
.circles {
position: relative;
margin: 50px;
width: 200px;
height: 200px;
} .circle {
position: absolute;
width: 20px;
height: 20px;
border-radius: 50%;
background: black;
}
// HTML
<div class="circles">
<div class="circle circle1"></div>
<div class="circle circle2"></div>
<div class="circle circle3"></div>
<div class="circle circle4"></div>
<div class="circle circle5"></div>
<div class="circle circle6"></div>
<div class="circle circle7"></div>
<div class="circle circle8"></div>
</div>
 
JS代码如下
第一步:编写calcXYs方法: 以外部DIV左下角为原点,批量计算小圆圆心的横纵坐标
/**
* R:大圆半径,2*R = 外部正方形的边长
* r:在大圆边上等距排列的小圆的半径
* counts: 圆的数量
* 返回值:
* [
* [x1,y1],
* [x2,y2],
* ...
* ]
*/
function calcXYs(R, r, counts) {
// 当前度数
let deg = 0;
// 单位度数,两小圆和圆心的夹角
const pDeg = 360 / counts;
// 存放返回结果
const arr = [];
for (let i = 0; i < counts; i++) {
// 度数以单位度数递增
deg = pDeg * i;
// Math.sin接收的参数以 π 为单位,需要根据360度 = 2π进行转化
const proportion = Math.PI / 180;
// 以外部DIV左下角为原点,计算小圆圆心的横纵坐标
let Y = R + R * Math.sin(proportion * deg);
let X = R + R * Math.cos(proportion * deg);
// 存放结果
arr.push([X, Y, deg]);
}
return arr;
}
 
第二步:编写resizeCircles方法: 根据上一步的结果:调整绝对定位的小圆的位置
/**
* R,r,counts:含义同上
* selector: 获取所有小圆的标志符
* 作用:根据上一步的坐标计算结果,调整绝对定位的小圆的位置
*/
function resizeCircles(selector, R, r, counts) {
// 获取所有小圆NodeList的选择器
let list = document.querySelectorAll(selector);
//调用calcXYs方法
const XYs = calcXYs(R, r, counts);
// 遍历每个小圆的XY坐标
for (let i = 0; i < list.length; i++) {
const [X, Y] = XYs[i];
const e = list[i];
// 修改小圆距离外部DIV底部和左边的距离
e.style.left = X + "px";
e.style.bottom = Y + "px";
}
}
 
最后我们只需要调用resizeCircles方法就可以啦
resizeCircles(".circle", 60, 20, 8);
实现效果如下
 
让loading图标动起来
好,现在布局完成了,那我们该怎么去让这个loading图标“动起来”呢?
  1. 给每个圆设置animation实现明暗变化,例如可以设置黑色的背景色然后动态变化opacity
  2. animation属性可以设置delay实现动画延迟播放,我们依次给圆设置等距的delay,例如1s,2s,3s...
  3. 给animation属性设置alternate,表示往复播放,设置infinite,表示无限循环播放

@keyframes k {
from {
opacity: 1;
} to {
opacity: 0;
}
}
.circle1 {
animation: k 1s ease 0s alternate infinite;
} .circle2 {
animation: k 1s ease 0.2s alternate infinite;
} .circle3 {
animation: k 1s ease 0.4s alternate infinite;
}
// circle4 ~ circle8同理,delay以0.2s递增
 
Demo
 

动画的向量合成—实现抛物线动画

 
在饿了么,或者淘宝天猫之类的购物外卖相关的APP里,我们可能会看到类似于下面这种的抛物线的动画。
 
如果要实现这种平抛效果,需要一点基础的高中物理知识。
平抛运动由水平方向的两种运动合成而得到
  • 水平方向: 匀速直线运动
  • 垂直方向:初速度为0的匀加速直线运动
如下所示
 
如果我们通过图像捕捉的方式就可理解的更清楚了,从下面的图可以看到:
水平方向的速度是不变的,而垂直方向的速度是不断加快的
好,下面终于可以讲下CSS的实现思路了
CSS实现原理
  1. 设置两个div:外层div和内层div
  2. 外层div设置横向匀速运动的动画
  3. 内层div设置纵向的匀加速直线运动的动画,加速过程可以用cubic-bezier设置
 
cubic-bezier又叫做贝塞尔曲线,它可接收四个参数,来规定动画的速度变化过程,使用方法如下
transition-timing-function: cubic-bezier(0.1, 0.7, 1.0, 0.1);
 
我们可以通过下面这个官方网站去设置速度变化曲线,然后获取生成的四个参数
 
具体代码如下:
 // HTML
<div id="outer">
<div id="inner"></div>
</div>
<button id='btn'>抛物线效果</button>
// CSS
#outer {
transition: all 1.5s linear;
} #inner {
width: 30px;
height: 30px;
border-radius: 50%;
background: red;
transition: all 1.5s cubic-bezier(.54, .11, .95, .68);
} .outer-active {
transform: translateX(300px);
} .inner-active {
transform: translateY(300px) scale(0.3);
}
JS
document.getElementById("btn").onclick = function() {
document.getElementById("outer").classList.add("outer-active");
document.getElementById("inner").classList.add("inner-active");
};
 
效果如下
 
 
 

无限滚动动画—实现跑马灯效果

当文本过长时候,我们可能需要做成跑马灯效果,然后无限滚动播放。
 
因为marquee这个HTML元素被废弃了,所以一般情况下我们需要手动通过动画去实现跑马灯
实现图示如下,注意开始位置和结束位置是不可见的
 
// HTML
<div class="marquee">
<p>ABCDEFGHIJKLMN</p>
</div>
// CSS
@keyframes marquee {
from {
transform: translateX(-200px)
} to {
transform: translateX(200px)
}
} .marquee {
overflow: hidden;
margin: 100px;
width: 200px;
} .marquee p {
animation: marquee 3s linear infinite;
}
 
结果
 
 

perspective和transform的运用——实现卡片翻转

卡片翻转三要素
  • transform: rotateY(x deg) 翻转卡片
  • backface-visibility:hidden 翻转后隐藏背面,重要!必须要加
  • perspective:增加透视和立体效果
 
// HTML
<div id="img-wrapper">
<img src='./timg.jpg' id='img1' class="img disable-img1" />
<img src='./timg2.jpg' id='img2' class="img" />
</div> // CSS
#img-wrapper {
perspective: 1200px;
position: relative;
height: 479px;
} #img1,
#img2 {
position: absolute;
transition: all 1s linear;
backface-visibility: hidden;
} #img1 {
transform: rotateY(-180deg);
} #img-wrapper:hover #img1 {
transform: rotateY(-360deg);
} #img-wrapper:hover #img2 {
transform: rotateY(-180deg);
}
 
结果
 

CSS动效集锦,视觉魔法的碰撞与融合(三)的更多相关文章

  1. CSS动效集锦,视觉魔法的碰撞与融合(二)

    引言 长久以来,我认识到.CSS,是存在极限的.正如曾经替你扛下一切的那个男人,也总有他眼含热泪地拼上一切,却也无法帮你做到的事情,他只能困窘地让你看到他的无能为力,怅然若失. 然后和曾经他成长的时代 ...

  2. CSS特效集锦:视觉魔法的碰撞与融合(二)

    引言 长久以来,我认识到.CSS,是存在极限的.正如曾经替你扛下一切的那个男人,也总有他眼含热泪地拼上一切,却也无法帮你做到的事情,他只能困窘地让你看到他的无能为力,怅然若失. 然后和曾经他成长的时代 ...

  3. CSS动效集锦,视觉魔法的碰撞与融合(一)

    前言 在本文中我讲述了7种CSS的动效,它们也许看起来并不惊艳,但是我认为却足够传达本文的理念:编写一些特殊的CSS样式的时候需要不拘于常理,要用特殊的认识角度看待标签和样式属性,从而用「绕个弯」的方 ...

  4. js+css 动效+1的效果

    点击数值 +1 的动效 vue data:{ timer: null,plus:''// 次数 } method:{ animate(plus) { var _this = this; clearIn ...

  5. css动效库animate.css和swiper.js

    animate.css https://daneden.github.io/animate.css/ 学习的文档:http://www.jq22.com/jquery-info819 腾讯团队的JXa ...

  6. 前端必须收藏的CSS3动效库!!!

    现在的网站和App的设计中越来越重视用户体验,而优秀的动效则能使你的应用更具交互性,从而吸引更多用户的使用. 如果你对CSS3中定义动效还不熟练,或希望采用更加简单直接的方式在你的应用中引入动效的话, ...

  7. 【总结】前端必须收藏的CSS3动效库!!!

    现在的网站和App的设计中越来越重视用户体验,而优秀的动效则能使你的应用更具交互性,从而吸引更多用户的使用. 如果你对CSS3中定义动效还不熟练,或希望采用更加简单直接的方式在你的应用中引入动效的话, ...

  8. 前端读者 | 前端用户体验-UI动效设计

    本文来自互联网 @羯瑞 整理 UI动效现如今在 APP 和网页中几乎已经成为了基本的组成部分,经过仔细打磨的 UI动效对于整个界面的提升是显著的. 动效呈现出状态切换的过程,展现了元素之间的逻辑关系, ...

  9. CSS揭秘—打字动效(四)

    前言:     所有实例均来自<CSS揭秘>,该书以平时遇到的疑难杂症为引,提供解决方法,只能说秒极了,再一次刷新了我对CSS的认知 该书只提供了关键CSS代码,虽然有在线示例代码链接,但 ...

随机推荐

  1. 【codeforces 764A】Taymyr is calling you

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  2. Java 学习笔记(14)—— 文件操作

    java文件操作主要封装在Java.io.File中,而文件读写一般采用的是流的方式,Java流封装在 java.io 包中.Java中流可以理解为一个有序的字符序列,从一端导向到另一端.建立了一个流 ...

  3. HDU1166 敌兵布阵 BZOJ1012 最大数[树状数组]

    一.前置知识-树状数组 树状数组(binary indexed tree)是一种简洁的代码量很小的数据结构,能够高效的处理前缀区间上的问题.在很多情况下能写树状数组解决的就不用码半天线段树了. 树状数 ...

  4. springboot 动态修改定时任务

    1.静态定时 1)启动类加上注解@EnableScheduling @EnableAsync @EnableScheduling @SpringBootApplication @MapperScan( ...

  5. IDEA到期了?不用怕,最新的永久激活送给你

    今天发现好多人的IDEA激活码都到期了,IDEA社区版又不能满足开发需求,因此写这篇IDEA的激活文章,希望对大家有用. 以下方法的破解文件的是永久破解的,不存在过期时间. 当然,有条件还是买正版授权 ...

  6. 编译GLib C程序

    编译GLib C程序 GLib是GTK +所需的实用程序库,但也可以在非GUI应用程序中独立使用.本文介绍如何在Linux中编译使用GLib的C程序.它还显示了如何为系统上安装的GLib版本安装正确的 ...

  7. delphi7 如何描述窗体上的全部控件

    在delphi开发中,经常需要用到窗体中控件的name名来进行对象方法或属性的调用,所以如何对delphi窗体进行简洁,清楚,完整的描述就很重要.最好能不看界面也能进行界面编码,具体如下表所示: xx ...

  8. DNS自述:我是如何为域名找到家的

    对于互联网一代的我们,一出生就学会使用电脑.当我们对着浏览器地址栏输入www.baidu.com的时候,百度的首页就出现在面前.但你可曾想过,为什么我们输入www.baidu.com就可以弹出百度首页 ...

  9. 低功耗蓝牙(BLE)——概述

    1. 概述   蓝牙协议是由SIG制定并维护的无线通信协议,蓝牙协议栈是蓝牙协议的具体实现.各厂商都根据蓝牙协议实现了自己的一套函数库--蓝牙协议栈,所以不同厂商的蓝牙协议栈之间虽然存在差别,但是都遵 ...

  10. 2019版Idea如何激活

    1.下载jar包 链接: https://pan.baidu.com/s/1w4B4_hmiiueNDJMjYKaFyQ 提取码: fkpx 2.修改·vmoptions 1.Help" - ...