本想起一個(gè)嘩眾取寵的標(biāo)題镰烧,但轉(zhuǎn)念一想拢军,還是求真務(wù)實(shí)一點(diǎn),用內(nèi)容說話怔鳖。今天我們拋開JS茉唉,不用SVG,單純使用CSS來一步一步地制作響應(yīng)式的仿真眼球结执。
先睹為快
- 最終效果
靜態(tài)眼球模型
|
浮動(dòng)的眼球
|
---|
繪制眼球基礎(chǔ)球體
- html
<body>
<div class="eye_container">
<div class="eye">
</div>
</div>
</body>
- css
body {
background-image: radial-gradient(ellipse at 50% 0%, #eef 0, #888 100%);
min-height: 100vh;
display: flex;
flex-wrap: nowrap;
flex-direction: row;
align-items: center;
justify-content: center;
}
.eye_container {
width: 200px;
height: 200px;
}
.eye {
position: relative;
width: 100%;
height: 100%;
border-radius: 50%;
background-image: radial-gradient(circle at 45% 45%, #fff 41%, #ccc 83%);
}
- 通過
.eye_container
來定義眼球的邊界懂傀,通過它來控制眼球的大小。 - 通過
radial-gradient(徑向漸變)
蜡感,由中心點(diǎn)輻射開進(jìn)行顏色漸變蹬蚁,這里選取中心點(diǎn)偏左(45%)處開始漸變恃泪,通過灰色漸變構(gòu)造出立體感。
描繪虹膜基礎(chǔ)輪廓
- html
<body>
<div class="eye_container">
<div class="eye">
<div class="eye_iris">
</div>
</div>
</div>
</body>
- css
.eye_iris {
position: absolute;
top: 25%;
left: 25%;
width: 50%;
height: 50%;
border-radius: 50%;
box-shadow: 0 0 5px 0 #000;
background: radial-gradient(circle at center, #b86e29 32%, #94c7d4 42%, #1c0a24 112%);
}
通過三種顏色構(gòu)成的徑向漸變構(gòu)造出虹膜的基礎(chǔ)輪廓缚忧,同時(shí)通過box-shadow制作虹膜邊框的模糊特效悟泵。
制作四根睫狀肌
- html
<body>
<div class="eye_container">
<div class="eye">
<div class="eye_iris">
<ul class="eye_ciliary">
<li class="eye_ciliary_item"><span></span></li>
</ul>
</div>
</div>
</div>
</body>
- css
.eye_ciliary {
display: block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
transform: rotateZ(1deg);
}
.eye_ciliary_item {
display: block;
width: 100%;
height: 100%;
position: absolute;
top: 50%;
margin-top: -50%;
}
.eye_ciliary_item span {
display: block;
width: 100%;
height: 100%;
position: absolute;
}
.eye_ciliary_item:before,
.eye_ciliary_item:after,
.eye_ciliary_item span:before,
.eye_ciliary_item span:after {
content: "";
display: block;
width: 100%;
height: 100%;
position: absolute;
background-color: #000;
opacity: 0.1;
}
.eye_ciliary_item:before {
transform: scale(0.025, 0.7) rotate(45deg);
}
.eye_ciliary_item:after {
transform: scale(0.7, 0.025) rotate(45deg);
}
.eye_ciliary_item span:before {
transform: rotate(45deg) scale(0.025, 0.7) rotate(45deg);
}
.eye_ciliary_item span:after {
transform: rotate(-45deg) scale(0.025, 0.7) rotate(45deg);
}
-
li
的:before
、:after
偽元素及span
的:before
闪水、:after
偽元素構(gòu)成四個(gè)同虹膜一般大小的正方形糕非。 - 將這4個(gè)正方形通過變換得到菱形,首先正方形向不同的方向旋轉(zhuǎn)球榆,然后往較長(zhǎng)的一邊拉長(zhǎng)朽肥,另外一邊收縮得到菱形。
- 根據(jù)勾股定理持钉,我們假設(shè)虹膜的矩形邊長(zhǎng)為
1
衡招,則可以得到虹膜的直徑為0.7
(1/√2=0.707106...
),故此處將較長(zhǎng)的邊縮放為原來的0.7
倍每强,正好填充滿虹膜直徑始腾。
增加更多的睫狀肌
- html
<body>
<div class="eye_container">
<div class="eye">
<div class="eye_iris">
<ul class="eye_ciliary">
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
</ul>
</div>
</div>
</div>
</body>
- css
.eye_ciliary_item:nth-child(2) {
transform: rotateZ(5deg);
}
.eye_ciliary_item:nth-child(3) {
transform: rotateZ(10deg);
}
.eye_ciliary_item:nth-child(4) {
transform: rotateZ(15deg);
}
.eye_ciliary_item:nth-child(5) {
transform: rotateZ(20deg);
}
.eye_ciliary_item:nth-child(6) {
transform: rotateZ(25deg);
}
.eye_ciliary_item:nth-child(7) {
transform: rotateZ(30deg);
}
.eye_ciliary_item:nth-child(8) {
transform: rotateZ(35deg);
}
.eye_ciliary_item:nth-child(9) {
transform: rotateZ(40deg);
}
我們假設(shè)兩條睫狀肌之間的角度偏差為5度,則一共需要360/5 = 72
條睫狀肌空执,而根據(jù)上個(gè)步驟浪箭,一個(gè)li
可在四個(gè)象限產(chǎn)生總數(shù)為8條的睫狀肌,因此我們此處構(gòu)造了72/8 = 9
個(gè)li
辨绊。
繪制瞳孔
- html
<body>
<div class="eye_container">
<div class="eye">
<div class="eye_iris">
<ul class="eye_ciliary">
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
</ul>
<ul class="eye_ciliary eye_ciliary_sub">
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
</ul>
</div>
</div>
</div>
</body>
- css
.eye_ciliary_sub {
width: 60%;
height: 60%;
top: 20%;
left: 20%;
}
.eye_ciliary_sub .eye_ciliary_item:before,
.eye_ciliary_sub .eye_ciliary_item:after,
.eye_ciliary_sub .eye_ciliary_item span:before,
.eye_ciliary_sub .eye_ciliary_item span:after {
opacity: 1;
}
與虹膜的睫狀肌制作一樣來制作瞳孔奶栖,只是通過縮小體積和調(diào)整透明度是的中間部分的顏色更加深暗。
瞳孔增加高光
- html
<body>
<div class="eye_container">
<div class="eye">
<div class="eye_iris">
<ul class="eye_ciliary">
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
</ul>
<ul class="eye_ciliary eye_ciliary_sub">
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
</ul>
<div class="eye_reflect"></div>
<div class="eye_reflect eye_reflect_sec"></div>
<div class="eye_reflect eye_reflect_sub"></div>
</div>
</div>
</div>
</body>
- css
.eye_reflect {
position: absolute;
top: 30%;
left: 30%;
width: 20%;
height: 15%;
border-radius: 50%;
transform: rotate(-35deg);
background-image: radial-gradient(circle at center, #fff 0%, #fff 40%, rgba(255,255,255,0) 100%);
z-index: 2;
opacity: .9;
}
.eye_reflect_sec {
top: 58%;
left: 50%;
width: 12%;
height: 6%;
background-image: radial-gradient(ellipse at center, #fff 0%, #fff 10%, rgba(255,255,255,0) 100%);
transform: rotate(35deg);
}
.eye_reflect_sub {
width: 80%;
height: 80%;
top: 0;
left: 0;
margin-left: -10%;
margin-top: -10%;
background-image: none;
background-color: rgba(255,255,255, .1);
z-index: 3;
}
通過兩個(gè)小的橢圓漸變及一個(gè)大的透明的圓形徑向漸變來表現(xiàn)出高光门坷,同時(shí)通過調(diào)整旋轉(zhuǎn)角度將其放置在合適的位置宣鄙。
添加陰影
角膜陰影
- css
.eye_iris {
top: 15%;
left: 15%;
box-shadow: 0 0 5px 2px rgba(0,0,0,0.4), 5px 5px 5px 0 rgba(0,0,0,0.5) inset;
}
這邊增加了角膜內(nèi)陰影,然后通過改變虹膜的位置調(diào)節(jié)眼球的轉(zhuǎn)向使之更靠近光源默蚌,讓角膜陰影顯得更加自然冻晤。
眼球陰影
- html
<body>
<div class="eye_container">
<div class="eye">
<div class="eye_iris">
<ul class="eye_ciliary">
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
</ul>
<ul class="eye_ciliary eye_ciliary_sub">
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
<li class="eye_ciliary_item"><span></span></li>
</ul>
<div class="eye_reflect"></div>
<div class="eye_reflect eye_reflect_sec"></div>
<div class="eye_reflect eye_reflect_sub"></div>
</div>
</div>
<div class="shade"></div>
</div>
</body>
- css
.eye_iris {
background-image: radial-gradient(circle at center, #b86e29 32%, #94c7d4 42%, #1c0a24 200%);
}
.eye:before, .eye:after {
content: "";
display: block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 50%;
}
.eye:before {
opacity: .75;
mix-blend-mode: color-burn;
background-image: radial-gradient(circle at 45% 45%, #ffe 30%, #222 67%, #558 80%);
z-index: 10;
}
.eye:after {
mix-blend-mode: overlay;
background-image: radial-gradient(circle at 65% 65%, #000 20%, rgba(0,0,0,0) 40%);
z-index: 4;
opacity: 0.5;
}
.shade {
position: relative;
width: 130%;
height: 10%;
margin: 0 2em;
border-radius: 80% 60%;
background-image: radial-gradient(ellipse at center, #000 0%, rgba(0,0,0, 0.6) 30%, rgba(0,0,0, 0) 70%);
z-index: 1;
}
- 利用
.eye
的:befoer
和:after
偽元素構(gòu)造出球體上的背光陰影 - 通過
.shade
制作球體在下方的投影
增加浮動(dòng)效果
- css
.eye_iris {
-webkit-animation: eye_iris_shade ease-in-out 1.5s infinite;
animation: eye_iris_shade ease-in-out 1.5s infinite;
}
.eye:after {
-webkit-animation: eye_shade ease-in-out 1.5s infinite;
animation: eye_shade ease-in-out 1.5s infinite;
}
.eye {
-webkit-animation: float ease-in-out 1.5s infinite;
animation: float ease-in-out 1.5s infinite;
}
.shade {
-webkit-animation: shade ease-in-out 1.5s infinite;
animation: shade ease-in-out 1.5s infinite;
}
@-webkit-keyframes float {
0% {
-webkit-transform: translateY(0);
transform: translateY(0);
}
50% {
-webkit-transform: translateY(1em);
transform: translateY(1em);
}
100% {
-webkit-transform: translateY(0);
transform: translateY(0);
}
}
@keyframes float {
0% {
-webkit-transform: translateY(0);
transform: translateY(0);
}
50% {
-webkit-transform: translateY(1em);
transform: translateY(1em);
}
100% {
-webkit-transform: translateY(0);
transform: translateY(0);
}
}
@-webkit-keyframes shade {
0% {
-webkit-transform: translateY(0) translateX(1em);
transform: translateY(0) translateX(1em);
opacity: .5;
}
50% {
-webkit-transform: translateY(1em) translateX(-1em) scale(.9);
transform: translateY(1em) translateX(-1em) scale(.9);
opacity: 1;
}
100% {
-webkit-transform: translateY(0) translateX(1em);
transform: translateY(0) translateX(1em);
opacity: .5;
}
}
@keyframes shade {
0% {
-webkit-transform: translateY(0) translateX(1em);
transform: translateY(0) translateX(1em);
opacity: .5;
}
50% {
-webkit-transform: translateY(1em) translateX(-1em) scale(.9);
transform: translateY(1em) translateX(-1em) scale(.9);
opacity: 1;
}
100% {
-webkit-transform: translateY(0) translateX(1em);
transform: translateY(0) translateX(1em);
opacity: .5;
}
}
@-webkit-keyframes eye_shade {
0% {
opacity: .2;
}
50% {
opacity: .5;
}
100% {
opacity: .2;
}
}
@keyframes eye_shade {
0% {
opacity: .2;
}
50% {
opacity: .5;
}
100% {
opacity: .2;
}
}
@-webkit-keyframes eye_iris_shade {
0% {
-webkit-box-shadow: 0 0 3px 1px rgba(0,0,0,0.4), 5px 5px 5px 0 rgba(0,0,0,0.2) inset;
box-shadow: 0 0 3px 1px rgba(0,0,0,0.4), 5px 5px 5px 0 rgba(0,0,0,0.2) inset;
}
50% {
-webkit-box-shadow: 0 0 3px 1px rgba(0,0,0,0.4), 5px 5px 5px 0 rgba(0,0,0,0.5) inset;
box-shadow: 0 0 3px 1px rgba(0,0,0,0.4), 5px 5px 5px 0 rgba(0,0,0,0.5) inset;
}
100% {
-webkit-box-shadow: 0 0 3px 1px rgba(0,0,0,0.4), 5px 5px 5px 0 rgba(0,0,0,0.2) inset;
box-shadow: 0 0 3px 1px rgba(0,0,0,0.4), 5px 5px 5px 0 rgba(0,0,0,0.2) inset;
}
}
@keyframes eye_iris_shade {
0% {
-webkit-box-shadow: 0 0 3px 1px rgba(0,0,0,0.4), 5px 5px 5px 0 rgba(0,0,0,0.2) inset;
box-shadow: 0 0 3px 1px rgba(0,0,0,0.4), 5px 5px 5px 0 rgba(0,0,0,0.2) inset;
}
50% {
-webkit-box-shadow: 0 0 3px 1px rgba(0,0,0,0.4), 5px 5px 5px 0 rgba(0,0,0,0.5) inset;
box-shadow: 0 0 3px 1px rgba(0,0,0,0.4), 5px 5px 5px 0 rgba(0,0,0,0.5) inset;
}
100% {
-webkit-box-shadow: 0 0 3px 1px rgba(0,0,0,0.4), 5px 5px 5px 0 rgba(0,0,0,0.2) inset;
box-shadow: 0 0 3px 1px rgba(0,0,0,0.4), 5px 5px 5px 0 rgba(0,0,0,0.2) inset;
}
}
- 在動(dòng)畫的不同階段調(diào)節(jié)透明度,及陰影位置大小來調(diào)節(jié)陰影的效果绸吸,靠近光源時(shí)鼻弧,透明度變大,沿X軸拉長(zhǎng)惯裕,遠(yuǎn)離光源時(shí)温数,透明度變小,沿著X軸縮短蜻势。