簡單圖形
矩形
div{ width: 100px; height: 100px; background-color: red; }
圓形
div{ width: 100px; height: 100px; background-color: red; border-radius: 50%; }
橢圓
【整個橢圓】
div{ width: 100px; height: 50px; background-color: red; border-radius: 50%; }
【半橢圓或半圓】
div{
width: 100px;
height: 100px;
background:red;
border-radius:50% /100% 100% 0 0 ;
}
【四分之一橢圓】
div{
width: 100px;
height: 100px;
background:red;
border-radius:100% 0 0 0 ;
}
三角形
【直角三角形】
div{ width: 0; height: 0; border: 50px solid transparent; border-bottom-color: red; }
【正三角形】
div{ width: 0; height: 0; border: 50px solid transparent; border-width: 86.6px 50px; border-bottom-color: red; }
平行四邊形
【基本圖形】
div{ margin-left: 50px; width: 100px; height: 100px; background-color: red; transform: skew(30deg); }
【改進版本】
上面的代碼中,不僅形狀發生了變形,內容也發生了變形。有兩種方法改進
1、元素嵌套
.outer{ margin-left:20px; width: 100px; height: 100px; background:red; transform:skewX(-30deg); } .inner{ transform:skewX(30deg); } </style> <div class="outer"> <div class="inner">小火柴</div> </div>
2、偽元素
把所有樣式都應用到偽元素上,然后再對偽元素進行變形
div{
position:relative;
margin-left:20px;
width: 100px;
height: 100px;
text-indent: 30px;
}
div::before{
content:'';
position:absolute;
top: 0;right: 0;left: 0;bottom: 0;
transform:skewX(-30deg);
background:red;
z-index:-1;
}
梯形
【基本版本】
div{ width: 50px; border: 50px solid transparent; border-bottom-color: red; }
【增強版本】
上面的代碼雖然簡單且巧妙,但無法在圖形內容填充文本。下面是比較復雜的增強版本
div{
height: 100px;
width: 200px;
line-height: 100px;
position:relative;
display:inline-block;
text-align: center;
color:white;
padding: .5em 1em .35em;
}
div:before{
content:'';
position:absolute;
top: 0;right: 0;bottom: 0;left: 0;
z-index:-1;
background:#58a;
transform:scaleY(1.3) perspective(.5em) rotateX(5deg);
transform-origin: bottom;
}
【梯形選項卡】
<style> a{ width: 120px; text-align: center; text-decoration: none; color:inherit; font-size: 20px } nav > a{ position:relative; display:inline-block; padding:.3em .1em 0; } nav > a:before{ content:''; position:absolute; top: 0;right: 0;left: 0;bottom: 0; z-index:-1; background:#ccc; border:1px solid black; border-radius: .5em .5em 0 0 ; box-shadow: 0 .15em white inset; transform:scaleY(1.3) perspective(.5em) rotateX(5deg); transform-origin: bottom; } </style> <nav> <a href="#">HTML</a> <a href="#">CSS</a> <a href="#">Javascript</a> </nav>
復雜圖形
多角星
【五角星】
一個大三角形底部掏掉一個小三角形;兩個前面的相同圖形疊壓
經計算,五角星的夾角為36度,若小三角形的側邊為a,則大三角形的側邊為2a(1+sin18),兩個三角形共同的底邊為2a(sin54)
<div class="box">
<div class="in"></div>
<div class="in"></div>
</div>
.box{ position: relative; } .in{ margin-left: 100px; position: relative; width: 0px; border: 10px solid transparent; border-width: 249px 81px; border-bottom-color: red; position: absolute; } .in:after{ content: ""; position:absolute; border: 10px solid transparent; border-width: 59px 81px; border-bottom-color: white; top: 133px; left: -81px; } .in:last-child{ top: 100px; left: -134px; transform: rotate(-73deg); }
【六角星】
兩個三角形疊壓
div{ position: relative; width: 0; border: 50px solid transparent; border-width: 50px 43.4px; border-bottom-color: red; } div:after{ position: absolute; content:""; width: 0; border: 50px solid transparent; border-width: 50px 43.4px; border-top-color: red; top: 16px; left: -42px; }
多邊形
【六邊形】
兩個梯形拼接
div{ position: relative; width: 50px; border: 50px solid transparent; border-bottom-color: red; } div:after{ position: absolute; content:""; width: 50px; border: 50px solid transparent; border-top-color: red; top:50px; left: -50px; }
【八邊形】
.outer{
width:100px;
height: 100px;
transform:rotate(45deg);
overflow: hidden;
}
.inner{
width:100%;
height: 100%;
transform:rotate(-45deg);
background:red;
}
【菱形】
<style> .outer{ margin:50px 0 0 50px; width:100px; height: 100px; transform:rotate(45deg); overflow: hidden; } .inner{ width:100%; height: 100%; transform:rotate(-45deg) scale(1.42); background:red; } </style>
桃心
創建一個方形div,分別用css控制div的兩個偽元素平移到正方形相鄰兩邊,圓形與邊中點重合。最后將總的div旋轉45度
<style> div{ display:inline-block; margin:50px; height: 100px; width: 100px; background-color: red; transform: rotate(-45deg); } div:before,div:after{ display:block; content:""; width: 100px; height: 100px; background-color: red; border-radius: 50%; margin-top:-50%; } div:after{ margin-left:50%; } </style>
<div></div>
切角效果
【單角】
background: linear-gradient(-45deg,transparent 5%,#58a 0);
【雙角】
background: linear-gradient(-45deg,transparent 5%,#58a 0) right,linear-gradient(45deg,transparent 5%,#58a 0) left;
background-size:50% 100%;
background-repeat:no-repeat;
【四角】
background: linear-gradient(-135deg,transparent 5%,#58a 0) top right,linear-gradient(135deg,transparent 5%,#58a 0) top left,linear-gradient(-45deg,transparent 5%,#58a 0) bottom right,linear-gradient(45deg,transparent 5%,#58a 0) bottom left;
background-size:50% 50%;
background-repeat:no-repeat;
【弧形切角】
background: radial-gradient(circle at top right,transparent 5%,#58a 0) top right,radial-gradient(circle at top left,transparent 5%,#58a 0) top left,radial-gradient(circle at bottom right,transparent 5%,#58a 0) bottom right,radial-gradient(circle at bottom left,transparent 5%,#58a 0) bottom left;
background-size:50% 50%;
background-repeat:no-repeat;
折角效果
background:linear-gradient(to left bottom,transparent 50%,rgba(0,0,0,0.4) 0) no-repeat 100% 0 /2em 2em,linear-gradient(-135deg,transparent 1.414em ,#58a 0);
餅圖效果
餅圖在網頁中的運用極為普遍,比如簡單的統計圖表、進度指示器、定時器等
【靜態效果】
<style> @keyframes spin{ to{transform: rotate(.5turn);} } @keyframes bg{50%{background:#655;}} .pie{ width: 100px;line-height: 100px; position:relative; background-color: yellowgreen; border-radius: 50%; color:transparent; text-align:center; background-image: linear-gradient(to right, transparent 50%,#655 0); } .pie:before{ content:''; position:absolute; top: 0;left: 50%; width: 50%;height: 100%; border-radius: 0 100% 100% 0 /50%; background-color: inherit; transform-origin: left; animation: spin 50s linear infinite,bg 100s step-end infinite; animation-play-state:paused; animation-delay:inherit; } </style> <div class="pie" style="animation-delay:-20s">20%</div> <div class="pie" style="animation-delay:-90s">90%</div>
【動態效果】
<style> @keyframes spin{ to{transform: rotate(.5turn);} } @keyframes bg{50%{background:#655;}} .pie{ width: 100px;height: 100px; position:relative; background-color: yellowgreen; border-radius: 50%; background-image: linear-gradient(to right, transparent 50%,#655 0); } .pie:before{ content:''; position:absolute; top: 0;left: 50%; width: 50%;height: 100%; border-radius: 0 100% 100% 0 /50%; background-color: inherit; transform-origin: left; animation: spin 3s linear infinite,bg 6s step-end infinite; animation-play-state: paused; } .pie:hover:before{ animation-play-state: running; } </style> <div class="pie"></div>
鼠標移入時,餅圖發生移動
【SVG實現】
讓圓形的周長接近於100,方便計算。r = 100/(2*PI) = 16
<style> @keyframes fillup{to{stroke-dasharray:100 100;}} svg{ width: 100px; height: 100px; transform: rotate(-90deg); background: yellowgreen; border-radius: 50%; } circle{ fill:yellowgreen; stroke:#655; stroke-width:32; stroke-dasharray: 0 100; animation: fillup 5s linear infinite; } </style> <svg viewbox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"> <circle r=16 cx=16 cy=16></circle> </svg>
最后
除了使用CSS畫圖之后,實現各種形狀更簡單的方法是使用clip-path路徑裁剪樣式
歡迎交流
