CSS 用一个div写个旋转的齿轮(maybe船舵)
来源:互联网 发布:怎么用dede建站 编辑:程序博客网 时间:2024/05/12 20:02
目标:用css写出如下图形
思路
- 分析一下,要写出这个图形并不难,我数数,总共有4个同心圆,和8个圆角矩形,需要8+4=12个DOM节点,似乎离一个还有很远
- 如果用border写同心圆,可以减少2个圆
- 如果加上before 和 after 伪类又可以减少2个节点
- 如果巧用box-shadow ,一个div 足矣!
第一步,画出同心圆
知识点1 :box-shadow
语法:none | [inset? && [ <offset-x> <offset-y> <blur-radius>? <spread-radius>? <color>? ] ]#
取值:
inset 默认阴影在边框外。使用inset变成内阴影,背景之上内容之下
offset-x offset-y 分别设置水平和垂直偏移量
blur-radius 模糊半径,值越大,模糊面积越大,阴影就越大越淡
spread-radius 阴影大小 取正值时,阴影扩大;取负值
color 阴影的颜色
div{ width: 200px; height: 200px; /* 设置div的box-shadow */ box-shadow: 0px 0px 0px 50px black , 0px 0px 0px 100px skyblue , 0px 0px 0px 150px black; margin: 200px auto; position: relative; border-radius: 50%; }
效果如图:1,2,3分别对应三个box-shadow的值
第二步,构建第一个伪类
div::before{ content: ""; display: block; width: 50px; height: 50px; border-radius: 10px; background: orange; }
橘黄色的小圆角矩形就被放在 div的左上角了
第三步,用box-shadow画出4个锯齿
/* 计算x 和 y的 偏移量 */box-shadow: 75px -195px 0 black,75px 345px 0 black,-195px 75px 0 black,345px 75px 0 black;
很轻松的得到了下面的图
第四步,用同样的方法画出构建第二个伪类,再画4个锯齿
这个有点偷懒,由于要转动起来,我的第二个伪类跟第一个伪类写的一模一样
div::after{ content: ""; display: block; width: 50px; height: 50px; border-radius: 10px; background: blue; position: absolute; /* 这里加上定位,让before和after位置一样,同时给div定位relative */ box-shadow: 75px -195px 0 darkblue,75px 345px 0 darkblue,-195px 75px 0 darkblue,345px 75px 0 darkblue; }
蓝色的块覆盖了刚才写的黄色的块
第五步,给伪类添加动画
先定义一个动画
@keyframes rotate{ form{ transform: rotate(0); }to{ transform: rotate(360deg); } }
给before 和 after 添加动画,同时让after 动画延迟1/8的动画时长,等转动起来就完成了!
/* before的动画 */animation: rotate2 10s linear infinite;/* after的动画 */animation: rotate2 10s linear infinite 0.15s;
最后完整代码
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title></head><body> <div></div></body><style> body{ background: skyblue; } div{ width: 200px; height: 200px; box-shadow: 0px 0px 0px 50px black , 0px 0px 0px 100px skyblue , 0px 0px 0px 150px black; margin: 200px auto; position: relative; border-radius: 50%; } div::before{ content: ""; display: block; width: 50px; height: 50px; position: absolute; border-radius: 10px; box-shadow: 75px -195px 0 black,75px 345px 0 black,-195px 75px 0 black,345px 75px 0 black; animation: rotate 10s linear infinite; /* 旋转点为同心圆的圆心 */ transform-origin: 100px 100px; } div::after{ content: ""; display: block; width: 50px; height: 50px; position: absolute; border-radius: 10px; box-shadow: 75px -195px 0 black,75px 345px 0 black,-195px 75px 0 black,345px 75px 0 black; animation: rotate2 10s linear infinite 1.25s; transform-origin: 100px 100px; } @keyframes rotate{ form{ transform: rotate(0); }to{ transform: rotate(360deg); } } @keyframes rotate2{ form{ transform: rotate(45deg); }to{ transform: rotate(405deg); } }</style></html>
but, 还是不够完美,现在实现的效果要过 1.5 秒后才能before 和 after 一起转圈圈 ,如果要同步转怎么办嘞
啊~好困,but not perfect,接着写吧 TT
第一步,重新写after 这次我们提前把8个齿轮的位置摆好,再让他们旋转
/* 1.把after定位到圆心的位置,因为后面要旋转,放在其他的位置不好计算shadow的位置 2.把旋转点也 设置在 圆心的位置 3.将after 以圆心为旋转点 旋转45° 4.要注意哦,shadow 的 x 和 y 偏移量 的坐标轴也旋转了45° */div::after{ content: ""; display: block; width: 50px; height: 50px; left: 75px; top: 75px; position: absolute; transform: rotate(45deg); border-radius: 10px; transform-origin: 25px 25px; box-shadow: -270px 0px 0 black,270px 0px 0 black,0px -270px 0 black,0px 270px 0 black; }
再给after设置 动画rotate2
animation: rotate2 10s linear infinite;
然而 转着转着就变成了这样
好像个靶子,感觉萌萌哒
第二步:给after设置新的动画
/* 还记得我们给 after 已经璇转过45°了吗?这里就不能共用一个动画了 */@keyframes rotate2{ form{ transform: rotate(45deg); }to{ transform: rotate(405deg); } }
最后贴出完整代码 后面没有了啊,我看一眼,真的没啦~~ <( ̄▽ ̄)/
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title></head><body> <div></div></body><style> body{ background: skyblue; } div{ width: 200px; height: 200px; box-shadow: 0px 0px 0px 50px black , 0px 0px 0px 100px skyblue , 0px 0px 0px 150px black; margin: 200px auto; position: relative; border-radius: 50%; } div::before{ content: ""; display: block; width: 50px; height: 50px; position: absolute; border-radius: 10px; box-shadow: 75px -195px 0 black,75px 345px 0 black,-195px 75px 0 black,345px 75px 0 black; animation: rotate 10s linear infinite; transform-origin: 100px 100px; } div::after{ content: ""; display: block; width: 50px; height: 50px; left: 75px; top: 75px; position: absolute; transform: rotate(45deg); border-radius: 10px; transform-origin: 25px 25px; background: red; box-shadow: -270px 0px 0 black,270px 0px 0 black,0px -270px 0 black,0px 270px 0 black; animation: rotate 10s linear infinite; } @keyframes rotate{ form{ transform: rotate(0); }to{ transform: rotate(360deg); } } @keyframes rotate2{ form{ transform: rotate(45deg); }to{ transform: rotate(405deg); } }</style></html>
the end….(text-align:center)
(*  ̄3)(ε ̄ *) 古德奈特~
阅读全文
0 0
- CSS 用一个div写个旋转的齿轮(maybe船舵)
- 用DIV+css写Table
- 我昨天写了个DIV+CSS的页面,做了个个人主页
- 一个DIV调用多个CSS样式
- 一个DIV调用多个CSS样式
- 一个DIV调用多个CSS样式
- Maybe SQL-Server 2005 的一个Bug
- 这次做div+css网站用的一个CSS HACK
- 一个CSS+DIV的demo
- 用PHP写的DIV+CSS日历函数
- 初学者用div+css结构写网页的几个误区
- 用css写一个向下的箭头
- 用 CSS 写一个向右的箭头
- 简单说 用CSS做一个魔方旋转的效果
- 写一个函数可以左旋转字符串的k个字符
- 自己写的DIV+CSS 表单
- 用div+css做个小企业的门户网站,哎.
- 用css写个三角形
- 从JAVA到scala(一):函数也是变量
- 利用C#生成一个简单的TIN三角网
- Bug集中营
- linux学习笔记一_2017-09-26
- Android 8.0 功能和 API
- CSS 用一个div写个旋转的齿轮(maybe船舵)
- Effective STL学习笔记-条款21
- 一.java多线程之实现方法
- Javassist学习总结
- JAVA IIntelliJ IDEA(2)-----使用Spring-boot-devTools无效解决办法
- 数据预处理之白化-Whitening
- Mysql数据库学习--时间戳
- 协议-网络层-IPv4
- 笔记