自适应的椭圆
以下是个普通圆形
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
div {
background: #fb3;
width: 200px;
height: 200px;
border-radius: 100px;
/*>=正方形边长的一半*/
}
</style>
<body>
<div><strong></strong></div>
</body>
</html>
这里尺寸是被固定好的,一旦内容发生变化,比如宽度突然增加了100px,会出现像以下情况
但是我们需要的是,如果宽高不等,这个图像自己变幻成椭圆
border-radius
可以单独指定水平和垂直半径,用一个/
分隔
border-radius:150px / 100px/*分别为宽高长度的一半
元素尺寸随着他的内容变化而变化,就不能写死长度,因此border-radius
可以接受百分比值
border-radius: 50% / 50%;
由于这俩是一样的,我们简化为以下。这一行代码可以得到一个自适应的椭圆!
border-radius: 50%;
半椭圆
第一种方法:用border-top-left-radius
、border-bottom-right
……
不过有简写,border-radius
可以一次向他提供用空格分隔的多个值,顺序和css常规顺序一样。可以为所有四个角提供完全不同的水平和垂直半径。在斜杠前指定1-4个值。
border-radius: 50% / 100% 100% 0 0;
沿着y轴劈开的椭圆
border-radius: 100% 0 0 100% / 50%;
四分之一椭圆
border-radius: 100% 0 0 0;
以上三个的灵魂就是给四个角指定不同的水平和垂直半径
平行四边形
background: #fb3;
width: 300px;
height: 200px;
transform: skew(-45deg);
内容也跟着倾斜了,解决方法:
-
两个元素,内容再倾斜回来
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <style> .father { margin: 600px; background: #fb3; width: 300px; height: 200px; transform: skew(-45deg); } .content { transform: skew(45deg); } </style> <body> <div class="father"> <div class="content">这是一个平行四边形</div> </div> </body> </html>
-
伪元素方案
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <style> div { width: 200px; height: 200px; position: relative; top: 0; left: 0; text-align: center; margin: 100px; line-height: 200px; } div::before { content: ''; position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: -1; background: #58a; transform: skew(45deg); } </style> <body> <div>这是一个平行四边形</div> </body> </html>
边框外圆角
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <style> div { width: 200px; height: 200px; position: relative; top: 0px; left: 0px; margin: 100px; line-height: 200px; border-radius: 15px; background: #000; background-clip: padding-box; } div::before { width: 100%; height: 100%; content: ''; position: absolute; top: -10px; left: -10px; /*之前写了bottom:0; right:0;这样会导致拉伸,这个伪元素会贴的他的父盒子,所以就没有那个边*/ z-index: -1; padding: 10px; background: #58a; background-clip: border-box; } </style> <body> <div>这是一个平行四边形</div> </body> </html>
菱形
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
img {
clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
}
</style>
<body>
<img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSxWpVtl-jZFomQllemWuwWIwd6uyaZduRD_w&usqp=CAU"
alt="">
</body>
</html>
点一下还能恢复正方形。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
img {
clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
transition: 1s clip-path;/*过渡*/
}
img:hover {
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
}
</style>
<body>
<img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSxWpVtl-jZFomQllemWuwWIwd6uyaZduRD_w&usqp=CAU"
alt="">
</body>
</html>
主要是 clip-path这个属性很有意思
他的值
/* Keyword values */
clip-path: none;
/* <clip-source> values */
clip-path: url(resources.svg#c1);
/* <geometry-box> values */
clip-path: margin-box;
clip-path: border-box;
clip-path: padding-box;
clip-path: content-box;
clip-path: fill-box;
clip-path: stroke-box;
clip-path: view-box;
/* <basic-shape> values */
clip-path: inset(100px 50px);
clip-path: circle(50px at 0 100px);
clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
clip-path: path('M0.5,1 C0.5,1,0,0.7,0,0.3 A0.25,0.25,1,1,1,0.5,0.3 A0.25,0.25,1,1,1,1,0.3 C1,0.7,0.5,1,0.5,1 Z');
/* Box and shape values combined */
clip-path: padding-box circle(50px at 0 100px);
/* Global values */
clip-path: inherit;
clip-path: initial;
clip-path: unset;
切角效果
叠加方法
右下角切角
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
div {
width: 200px;
height: 200px;
background: #058a;
background: linear-gradient(-45deg, transparent 15px, #58a 0);/*想不明白啊qaq*/
}
</style>
<body>
<div></div>
</body>
</html>
四个角被切掉
background: linear-gradient(135deg, transparent 15px, #58a 0) top left,
linear-gradient(-135deg, transparent 15px, #58a 0) top right,
linear-gradient(-45deg, transparent 15px, #58a 0) bottom right,
linear-gradient(45deg, transparent 15px, #58a 0) bottom left;
background-size: 50% 50%;
background-repeat: no-repeat;
弧形切角
div {
width: 300px;
height: 200px;
background: radial-gradient(circle at bottom right, transparent 15px, lightblue 0) bottom right,
radial-gradient(circle at bottom left, transparent 15px, lightblue 0) bottom left,
radial-gradient(circle at top left, transparent 15px, lightblue 0) top left,
radial-gradient(circle at top right, transparent 15px, lightblue 0) top right;
background-size: 50% 50%;
background-repeat: no-repeat;
}
内联svg与border-image的解决方案
- svg待学习
裁切路径方案
优点:设置背景方便,可以给图片切角,但是不是DRY的,而且会裁切掉文本
梯形标签页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
div {
position: relative;
display: inline-block;
padding: .5em 1em .35em;
color: white;
}
div::before {
content: "";
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: -1;
background: #58a;
transform: perspective(.5em) rotateX(5deg);
}
</style>
<body>
<div>这是一个梯形</div>
</body>
</html>
transform-origin
CSS属性让你更改一个元素变形的原点
添加了一些样式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
div {
position: relative;
display: inline-block;
padding: .5em 1em .35em;
color: black;
}
div::before {
content: "";
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: -1;
background: #ccc;
background-image: linear-gradient(hsla(0, 0%, 100%, 0.6), hsla(0, 0%, 100%, 0));
border: 1px solid rgba(0, 0, 0.4);
border-bottom: none;
border-radius: 0.5em 0.5em 0 0;
box-shadow: 0 0.15em white inset;
transform: perspective(.5em) rotateX(5deg);
transform-origin: bottom;
}
</style>
<body>
<div>project</div>
</body>
</html>
transform-origin: left;/*改一下这一句就可以得到单侧倾斜的标签页*/
简单的饼图
基于transform的解决方案
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
div {
width: 100px;
height: 100px;
border-radius: 50%;
background: yellowgreen;
/*把右边设置成棕色*/
background-image: linear-gradient(to right, transparent 50%, #655 0);
}
/*通过伪元素来起到遮盖的作用*/
div::before {
content: "";
display: inline-block;
margin-left: 50%;
height: 100%;
width: 50%;
border-radius: 0 100% 100% 0/ 50%;
transform-origin: left;
background-color: inherit;
transform: rotate(.2turn);
}
</style>
<body>
<div></div>
</body>
</html>
background-color: #655;
transform: rotate(.2turn);/*百分之七十的范围*/
动画效果
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
@keyframes spin {
to {
transform: rotate(.5turn);
}
}
@keyframes bg {
50% {
background: #655;
}
}
div {
width: 100px;
height: 100px;
border-radius: 50%;
background: yellowgreen;
background-image: linear-gradient(to right, transparent 50%, #655 0);
}
/*通过伪元素来起到遮盖的作用*/
div::before {
content: "";
display: inline-block;
margin-left: 50%;
height: 100%;
width: 50%;
border-radius: 0 100% 100% 0/ 50%;
transform-origin: left;
background-color: inherit;
animation: spin 3s linear infinite,
bg 6s step-end infinite;
}
</style>
<body>
<div></div>
</body>
</html>
角向渐变
background-image: conic-gradient(skyblue 20%, pink 0, pink 40%, yellowgreen 0);