欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CSS中的形状

程序员文章站 2022-07-12 22:59:31
...

自适应的椭圆

椭圆

在日常的编写代码中可以发现给任何正方形元素设置一个足够大的 borderradius,就可以把它变成一个圆形

background: #fb3;
width: 200px;
height: 200px;
border-radius: 100px; /* >= 正方形边长的一半 */

要写出椭圆的形式就要将border-radius 这个属性后面的值改为百分比形式。这个百分比值会基于元素的尺寸进行解析,即宽度用于水平半径的解析,而高度用于垂直半径的解析。这意味着相同的百分比可能会计算出不同的水平和垂直半径。因此,如果要创建一个自适应的椭圆,我们可以把这两个半径值都设置为 50%:

border-radius: 50%;

最终,只需要这一行代码,我们就可以得到一个自适应的椭圆了

半椭圆

现在我们已经知道如何用 CSS 来生成一个自适应的椭圆了,接下来很自然地就会问到:我们是否还能生成其他常见的形状呢,比如椭圆的一部分?让我们先来思考一下半椭圆吧CSS中的形状
幸运的是,border-radius 的语法比我们想像中灵活得多。你可能会惊讶地发现 border-radius 原来是一个简写属性。我们可以为元素的每个角指定不同的值,而且还有两种方法可以做到这一点。第一种方法就是使用它所对应的各个展开式属性:

☑ border-top-left-radius
☑ border-top-right-radius
☑ border-bottom-right-radius
☑ border-bottom-left-radius

为 border-radius 属性分别指定4、3、2、1 个由空格分隔的值时,这些值是以这样的规律分配到四个角上的(请注意,对椭圆半径来说,斜杠前和斜杠后最多可以各有四个参数,这两组值是以同样的方法分配到各个角的)
CSS中的形状
把所有这些结论综合起来,我们就可以很容易地写出 CSS 代码,来生成图1中那样自适应的半椭圆

border-radius: 50% / 100% 100% 0 0;

四分之一椭圆

在创建了一个完整的椭圆和半椭圆之后,很自然的下一个问题就是如何生成四分之一椭圆(其形状如图 3 所示)。延续前面所讲的思路,我们注意到,要创建一个四分之一椭圆,其中一个角的水平和垂直半径值都需要是100%,而其他三个角都不能设为圆角。由于这四个角的半径在水平和垂直方向上都是相同的,我们甚至都不需要使用斜杠语法了。最终代码应该是这样的

border-radius: 100% 0 0 0;

你不免还会顺着往下想,是不是还能用 border-radius 来生成椭圆的其他切块(比如八分之一椭圆、三分之一椭圆)?很遗憾,你可能会失望了,因为 border-radius 属性是无法生成这些形状的。

平行四边形

让我们试着用 CSS 创建一个按钮状的平行四边形链接。我们的起点就是一个普通的块状按钮,辅以一些简单的样式。然后,我们可以通过 skew() 的变形属性来对这个矩形进行斜向拉伸:

transform: skewX(-45deg);

但是,这导致它的内容也发生了斜向变形,这很不好看,而且难读(参见图 4)。有没有办法只让容器的形状倾斜,而保持其内容不变呢?
CSS中的形状
嵌套元素方案

<a href="#yolo" class="button">
 <div>Click me</div>
</a>
.button { transform: skewX(-45deg); }
.button > div { transform: skewX(45deg); }

我们在图 3-15 中可以看到,这个方法的表现很不错,但它也意味着我们不得不添加额外的 HTML 元素。
伪元素方案

.button {
 position: relative;
 /* 其他的文字颜色、内边距等样式…… */
}
.button::before {
 content: ''; /* 用伪元素来生成一个矩形 */
 position: absolute;
 top: 0; right: 0; bottom: 0; left: 0;
 z-index: -1;
 background: #58a;
 transform: skew(45deg);
}

这个技巧不仅对 skew() 变形来说很有用,还适用于其他任何变形样式,当我们想变形一个元素而不想变形它的内容时就可以用到它。举个例子,我们把这个技巧针对 rotate() 变形样式稍稍调整一下,再用到一个正方形元素上,就可以很容易地得到一个菱形。
这个技巧的关键在于,我们利用伪元素以及定位属性产生了一个方块,然后对伪元素设置样式,并将其放置在其宿主元素的下层。这种思路同样可以运用在其他场景中,从而得到各种各样的效果

其他形状

大于号

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8"> 
		<title>画图</title>
		<style type="text/css">
            .a2{
                position: absolute;
                left: 50px;
                top: 50px;
                width: 0;
                height: 0;
                border:70px solid;
                border-color: transparent transparent transparent red;     
            }
            .a1{
                position: absolute;
                left: 50px;
                top:70px;
                width: 0;
                height: 0;
                border:50px solid;
                border-color: transparent transparent transparent #fff;
            }

		</style>
	</head>
	<body> 
        <div class="a2"></div>
		<div class="a1"></div> 
	</body>
</html>

CSS中的形状

爱心

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8"> 
		<title>画图</title>
		<style type="text/css">
			.a1{
				position: absolute;
				width: 100px;
				height: 100px;
				border-radius: 100%;
				background-color: red;
			}
			.a2{
				width: 100px;
				height: 100px;
				border-radius: 100%;
				background-color: red;
				position: absolute;
				left: 75px;
			}
			.a2::after{
				position:absolute;
				left:-83px;
				top:-16px;
				content: "";
				width:100px;
            	height:100px;
            	background-color: red;
            	transform: rotate(45deg);
           		margin:50px
			}
		</style>
	</head>
	<body>
		<div class="a1"></div>
		<div class="a2"></div>
	</body>
</html>

CSS中的形状

六芒星

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8"> 
		<title>画图</title>
		<style type="text/css">
			.a1{
				width: 0;
				height: 0;
				border:40px solid;
				border-color: transparent transparent red;
			}
			.a1::after{
				content: "";
				position: absolute;
				left: 6px;
				top: 60px;
				width: 0;
				height: 0;
				border:40px solid;
				border-color:red transparent transparent ;
			}
			}
		</style>
	</head>
	<body>
		<div class="a1"></div>
		<div class="a2"></div>
	</body>
</html>

CSS中的形状

相关标签: css自学 css