眾所周知,在CSS3中產生了諸多優秀的特性,現在就來分享一下我這段時間對於這些特性的效果實踐,希望對大家有所啟發。
挑戰1: 畫一個對話方塊
要畫一個對話方塊,首先來學習做一個三角形。其實非常的簡單。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.triangle{
width: 0;
height: 0;
border: 50px solid;
border-color: #f00 #0f0 #ccc #00f;
}
</style>
</head>
<body>
<div class="triangle"></div>
</body>
</html>
複製程式碼
出現如下效果:
估計你已經知道border的構成原理,然後只需改一行程式碼:// 四個引數對應 :上 右 下 左
border-color: transparent transparent #ccc transparent;
複製程式碼
於是就只剩下面的三角形部分啦!
現在來利用三角形技術做對話方塊:<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.dialog {
position: relative;
margin-top: 50px;
margin-left: 50px;
padding-left: 20px;
width: 300px;
line-height: 2;
background: lightblue;
color: #fff;
}
.dialog::before {
content: '';
position: absolute;
border: 8px solid;
border-color: transparent lightblue transparent transparent;
left: -16px;
top: 8px;
}
</style>
</head>
<body>
<div class="dialog">這是一個對話方塊鴨!</div>
</body>
</html>
複製程式碼
效果如下:
挑戰2: 畫一個平行四邊形
利用skew特性,第一個引數為x軸傾斜的角度,第二個引數為y軸傾斜的角度。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.parallel {
margin-top: 50px;
margin-left: 50px;
width: 200px;
height: 100px;
background: lightblue;
transform: skew(-20deg, 0);
}
</style>
</head>
<body>
<div class="parallel"></div>
</body>
</html>
複製程式碼
大家可以自己動手試試。 效果如下:
挑戰3: 用一個div畫五角星
對於這個五角星而言,我們可以拆分成三個部分,想一想是不是這樣? 那我們現在就來實現這三個部分。 對於最上面的三角,我們在第一個部分已經實現了三角形,這個不難。但是下面的兩個如何實現呢?其實也非常的簡單,想一想,下面這兩個是不是就是一個向上的三角形旋轉而來呢?明白了這一點,就可以動手實現啦!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
#star {
position: relative;
margin: 200px auto;
width: 0;
height: 0;
border-style: solid;
border-color: transparent transparent red transparent;
border-width: 70px 100px;
transform: rotate(35deg);
}
#star::before {
position: absolute;
content: '';
width: 0;
height: 0;
top: -128px;
left: -95px;
border-style: solid;
border-color: transparent transparent red transparent;
border-width: 80px 30px;
transform: rotate(-35deg);
}
#star::after {
position: absolute;
content: '';
width: 0;
height: 0;
top: -45px;
left: -140px;
border-style: solid;
border-color: transparent transparent red transparent;
border-width: 70px 100px;
transform: rotate(-70deg);
}
</style>
</head>
<body>
<div id="star"></div>
</body>
</html>
複製程式碼
效果如下:
你沒看錯,這就是CSS3的威力!
挑戰4: 畫一個愛心?
看起來好像不容易下手,我們先來分解一下這個心形的結構:
是兩個形狀相同的部分,對其中一種稍微旋轉一下:
現在就來構造這個部分:<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.heart {
width: 100px;
height: 90px;
position: relative;
margin: 100px auto;
}
.heart::before {
content: '';
position: absolute;
width: 50px;
height: 90px;
background: red;
border-radius: 50px 45px 0 0;
/* 設定旋轉中心 */
transform-origin: 0 100%;
transform: rotate(-45deg);
}
.heart::after {
content: '';
position: absolute;
width: 50px;
height: 90px;
top: -35px;
left: -35px;
background: red;
border-radius: 50px 45px 0 0;
/* 設定旋轉中心 */
transform-origin: 0 100%;
transform: rotate(45deg);
}
</style>
</head>
<body>
<div class="heart"></div>
</body>
</html>
複製程式碼
效果如下:
同樣一個div完成了這個效果,是不是非常酷炫呢:)挑戰5: 畫一個八卦陣
還是來分解它的結構:按照之前的思路,估計你也有想法了,這個時候依然可以用偽類來畫出兩個小的圓,那麼問題來了,像這種顏色不同的同心圓如何用CSS表達呢?
其實很簡單,根據border-radius可以影響padding的形狀這一規則,外面的一圈用border來表達,而中間利用白色的背景顏色將padding填滿,寬度和高度都可以設為0。
另一個問題是:大圓的效果如何實現? 有兩種實現思路,一種是用border-left來表示左邊的半圓,右邊的半圓利用本身的寬度。 第二種方案其實是從《CSS揭祕》獲得的靈感,可以利用linear-gradient顏色漸變的屬性來調整。
接下來編碼實現:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
body{
background-color: #ccc;
}
/* 大圓部分第一種思路 (注意下面的小圓定位要調整下)*/
/* .bagua{
position: relative;
width: 150px;
height: 300px;
margin: 100px auto;
border-radius: 50%;
background-color: #fff;
border-left: 150px solid #000;
} */
/* 大圓部分第二種思路 */
.bagua{
position: relative;
width: 300px;
height: 300px;
margin: 100px auto;
border-radius: 50%;
background-color: #000;
/*從0-50%用背景色,50%開始到100%用#fff */
background-image: linear-gradient(to right, transparent 50%, #fff 50%);
}
.bagua::before{
content: '';
position: absolute;
left: 75px;
width: 0;
height: 0;
padding: 25px;
border-radius: 50%;
border: 50px solid #000;
background: #fff;
background-clip: padding-box;
}
.bagua::after{
content: '';
position: absolute;
top: 150px;
left: 75px;
width: 0;
height: 0;
padding: 25px;
border-radius: 50%;
border: 50px solid #fff;
background: #000;
background-clip: padding-box;
}
</style>
</head>
<body>
<div class="bagua"></div>
</body>
</html>
複製程式碼
效果如下:
挑戰6: 超級棒棒糖
這裡直接擺出效果吧:
其中利用了兩個CSS3中非常重要的屬性————線性漸變和徑向漸變。 其中圓形部分利用radial-gradient屬性,也就是徑向漸變,棒子的顏色利用linear-gradient,之前已經用過,也就是線性漸變。
程式碼參考如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.linear{
width: 300px;
height: 300px;
margin: 20px auto;
border-radius: 50%;
/* 重複性徑向漸變 */
background-image: repeating-radial-gradient(red 0px, green 30px, orange 40px);
position: relative;
}
.linear::after{
content: '';
position: absolute;
top: 100%;
left: 50%;
width: 10px;
height: 500px;
border-radius: 0 0 10px 10px;
/* 線性漸變 */
background-image: linear-gradient(to top, red 20%, orange 40%, lightblue 60%, green 80%);
}
</style>
</head>
<body>
<div class="linear"></div>
</body>
</html>
複製程式碼
挑戰7:跳動的位元組
先亮出效果:
相當於是一個loading的效果。其實實現起來是非常簡單的,這裡直接用animation-delay即可控制五個元素的錯落感。直接貼上程式碼,大家可以參考一下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
<style>
.spinner{
margin: 100px auto;
width: 50px;
height: 50px;
text-align: center;
font-size: 10px;
}
.spinner > div{
display: inline-block;
background-color: rgb(43, 128, 226);
height: 100%;
width: 5px;
margin-right:1px;
animation: bytedance 1s infinite;
}
.spinner >div:nth-child(2) {
background-color: rgb(49, 84, 124);
animation-delay: -0.9s;
}
.spinner >div:nth-child(3) {
background-color: rgb(88, 128, 173);
animation-delay: -0.8s;
}
.spinner >div:nth-child(4) {
background-color: rgb(88, 128, 173);
animation-delay: -0.7s;
}
.spinner >div:nth-child(5) {
background-color: rgb(142, 187, 240);
animation-delay: -0.6s;
}
@keyframes bytedance{
0%, 40%, 100%{
transform: scaleY(0.4);
}
20%{
transform: scaleY(1);
}
}
</style>
</head>
<body>
<div class="spinner">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
</body>
</html>
複製程式碼
挑戰8: 漣漪緩動效果
這裡顯然可以分解成兩個圓,仍然是利用animation-delay來實現錯落感。 當一個圓縮小為0的時候,另一圓剛好擴充套件為最大,依次規律迴圈。<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Loading</title>
<style>
.spinner{
width: 60px;
height: 60px;
position: relative;
margin: 100px auto;
}
.spinner > div{
width: 100%;
height: 100%;
opacity: 0.6;
border-radius: 50%;
background-color: lightblue;
position: absolute;
top: 0;
left: 0;
animation: loading 1.4s infinite ease-in;
}
.spinner > div:nth-child(2){
animation-delay: -0.7s;
}
@keyframes loading{
0%, 100% {
transform: scale(0.0);
}
50% {
transform: scale(1.0);
}
}
</style>
</head>
<body>
<div class="spinner">
<div></div>
<div></div>
</div>
</body>
</html>
複製程式碼
通過這些有趣的挑戰,相信你已經體會到CSS3世界的奇妙了,但是但是,有部分屬性並不是所有的瀏覽器都支援,保守起見,最好在CSS3新特性名之前加上瀏覽器的字首,本文側重效果的實現,相容這塊暫不做處理。
作為前端工程師,平時通常拿CSS做頁面佈局,甚至有時候會出現很多莫名其妙的bug,於是很多人不太願意來寫CSS,但實際上更多的時候是因為我們瞭解不夠,功夫不到家,才會覺得這個東西不友好,感到不喜歡,當你開始擺脫門外漢的姿態,真正踏進那個廣袤的世界,能夠對它的各種特點信手拈來,又會情不自禁地愛上這個東西。因此,有時候我們缺少的不是能力,而是一種包容的心態。
這篇文章只是起一個拋磚引玉的作用,希望對你有啟發,當然,CSS3的世界遠比我們想象中要豐富的多,我之後也會做更多的分享,讓大家領略CSS之美。