css揭秘|第三章:形状

9 篇文章 0 订阅
4 篇文章 0 订阅

自适应的椭圆

以下是个普通圆形

<!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-radiusborder-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);

在这里插入图片描述

内容也跟着倾斜了,解决方法:

  1. 两个元素,内容再倾斜回来

    <!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>
    
  2. 伪元素方案

    <!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);

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值