css 变形示例

一、平行四边形

背景知识:transform,伪元素
代码示例:

    <a href="#yolo" class="button">
        <div>Click me</div>
    </a>
    <button class="button">
        <div>Click me</div>
    </button>
    .button {
        position: relative;
        display: inline-block;
        padding: 0.5em 1em;
        border: 0;
        margin: 0.5em;
        background: transparent;
        color: white;
        /* text-transform 控制文本的大小写,capitalize(首字母大写), uppercase(全部大写), lowercase(全部小写) */
        text-transform: uppercase;
        text-decoration: none;
        font: bold 200%/1 sans-serif;
    }
    /*/
        用伪元素实现一个矩形,也可以使用一个冒号代替或者用after
        /*/
    
    .button::before {
        content: '';
        position: absolute;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
        z-index: -1;
        background: #58a;
        transform: skew(45deg);
    }
平行四边形效果图

二、菱形图片

背景知识:clip-path,transition,transform-origin
代码示例:

<img src="img/search_more.png" />
img {
    margin-top: 30px;
    width: 300px;
    height: 300px;
    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%);
    transform-origin: bottom;
    transform: scale(1.3);
}
菱形图片效果图

三、切角效果

背景知识:css 渐变,border-image,background-clip,calc(),polygon-clip,SVG知识点
主要介绍圆弧切角和直角切角的实现。
1、圆切角
代码示例:

<div class="scoop-corners">圆弧切角的实现:用径向渐变实现;注意:径向渐变中的语法所表示的意思</div>
.scoop-corners {
    margin-top: 10px;
    background: #58a;
    background: radial-gradient(circle at top left, transparent 15px, #58a 0) top left,
                radial-gradient(circle at top right, transparent 15px, #58a 0) top right,
                radial-gradient(circle at bottom right, transparent 15px, #58a 0) bottom right,
                radial-gradient(circle at bottom left, transparent 15px, #58a 0) bottom left;
    background-size: 50% 50%;
    background-repeat: no-repeat;
    
    padding: 1em 1.2em;
    max-width: 12em;
    color: white;
    font: 130%/1.6 Baskerville, Palatino, serif;
}
圆弧切角效果图

2、直角切角
有三种实现方案:
2.1 方案一:利用线性渐变解决;需要注意的是:各个方位角所代表的角度。
代码示例:

<div class="bevel-corners-gradients">方案一:利用线性渐变解决;需要注意的是:各个方位角所代表的角度。</div>
.bevel-corners-gradients {
    background: #58a;
    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;
    
    padding: 1em 1.2em;
    max-width: 12em;
    color: white;
    font: 150%/1.6 Baskerville, Palatino, serif;
}
直角切角方案一效果图

2.2 方案二:border-image 与内联SVG:需要对 SVG 的语法进行学习和 polygon多边形函数构图原理的进一步深入。
代码示例:

<div class="bevel-corners">方案2:border-image 与内联SVG:需要对 SVG 的语法进行学习和 polygon多边形函数构图原理的进一步深入</div>
.bevel-corners {
    margin-top: 10px;
    border: 20px solid transparent;
    border-image: 1 url('data:image/svg+xml,\
                            <svg xmlns="http://www.w3.org/2000/svg" width="6" height="6" fill="%2358a">\
                            <polygon points="0,1 1,0 5,0 6,1 6,5 5,6 1,6 0,5" />\
                            </svg>');
    background: #58a;
    background-clip: padding-box;
    
    padding: .2em .3em;
    max-width: 12em;
    color: white;
    font: 150%/1.6 Baskerville, Palatino, serif;
}
直角切角方案二效果图

2.3 方案三: 路径裁切解决方案:最大的缺陷是不可维护性,需要借用预处理器才能更好的维护,但是它可以使用任意类型的背景。
代码示例:

<div class="bevel-corners-clipped">方案三:路径裁切解决方案:最大的缺陷是不可维护性,需要借用预处理器才能更好的维护,但是它可以使用任意类型的背景</div>
.bevel-corners-clipped {
    margin-top: 10px;
    background: #58a;
    -webkit-clip-path: 
        polygon(20px 0, calc(100% - 20px) 0, 100% 20px, 100% calc(100% - 20px),
        calc(100% - 20px) 100%,
        20px 100%, 0 calc(100% - 20px), 0 20px);
    clip-path:
            polygon(20px 0, calc(100% - 20px) 0, 100% 20px, 100% calc(100% - 20px),
            calc(100% - 20px) 100%,
            20px 100%, 0 calc(100% - 20px), 0 20px);
    
    padding: 1em 1.2em;
    max-width: 12em;
    color: white;
    font: 150%/1.6 Baskerville, Palatino, serif;
}
直角切角方案三效果图

四、折角效果

背景知识:伪元素,transform,css 渐变
代码示例:

<div class="note1">此效果需要注意的:1、需要借助伪元素来实现,2、在不同角度的折角需要利用三角函数来计算折角的宽高。3、在变形过程中的顺序问题,要先平移在旋转,4、为了可复用性需要借助scss,而scss不支持三角函数,需要借助compass框架</div> 
.note1 {
    position: relative;
    max-width: 30em;
    padding: 2em;
    background: #58a;
    background: linear-gradient(-150deg, transparent 1.5em, #58a 0);
    border-radius: .5em;
}
.note1::before {
    content: "";
    position: absolute;
    top: 0;
    right: 0;
    background: linear-gradient(to left bottom, transparent 50%, rgba(0, 0, 0, .2) 0, rgba(0, 0, 0, .4)) 100% 0 no-repeat;
    width: 1.7em;
    height: 3em;
    -webkit-transform: translateY(-1.3em) rotate(-30deg);
        -moz-transform: translateY(-1.3em) rotate(-30deg);
        -ms-transform: translateY(-1.3em) rotate(-30deg);
            -o-transform: translateY(-1.3em) rotate(-30deg);
            transform: translateY(-1.3em) rotate(-30deg);
    transform-origin: bottom right;
    border-bottom-left-radius: inherit;     
    box-shadow: -.2em .2em .3em -.1em rgba(0, 0, 0, .15);
}
折角效果图

五、梯形标签页

背景知识:伪元素,transform
代码示例:

    <nav>
        <a href="#">Home</a>
        <a href="#" class="selected">Projects</a>
        <a href="#">About</a>
    </nav>
    <main>
        Content area
    </main>
    nav {
        position: relative;
        z-index: 1;
        padding-left: 1em;
    }

    nav > a {
        position: relative;
        display: inline-block;
        padding: .3em 1em 0;
        color: inherit;
        text-decoration: none;
        margin: 0 -.3em;
    } 

    nav > a::before,
    main {
        border: .1em solid rgba(0,0,0,.4);
    }

    nav a::before {
        content: ''; /* To generate the box */
        position: absolute;
        top: 0; right: 0; bottom: 0; left: 0;
        z-index: -1;
        border-bottom: none;
        border-radius: .5em .5em 0 0;
        background: #ccc linear-gradient(hsla(0,0%,100%,.6), hsla(0,0%,100%,0));
        box-shadow: 0 .15em white inset;
        transform: scale(1.1, 1.3) perspective(.5em) rotateX(3deg);
        transform-origin: bottom;
    }

    nav a.selected { z-index: 2;}

    nav a.selected::before {
        background-color: #eee;
        margin-bottom: -.08em;
    }

    main {
        display: block;
        margin-bottom: 1em;
        background: #eee;
        padding: 1em;
        border-radius: .15em;
    }
    nav.left > a::before {
        transform: scale(1.2, 1.3) perspective(.5em) rotateX(5deg);
        transform-origin: bottom left;
    }

    nav.right { padding-left: 2em; }

    nav.right > a::before {
        transform: scale(1.2, 1.3) perspective(.5em) rotateX(5deg);
        transform-origin: bottom right;
    }
梯形标签页

六、简单的饼图

背景知识:css 渐变,transform,css 动画
代码示例:

    <div class="pie"></div>
    .pie {
        width: 100px; height: 100px;
        border-radius: 50%;
        background: yellowgreen;
        background-image: linear-gradient(to right, transparent 50%, currentColor 0);
        color: #655;
    }

    .pie::before {
        content: '';
        display: block;
        margin-left: 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;
    }

    @keyframes spin {
        to { transform: rotate(.5turn); }
    }
    @keyframes bg {
        50% { background: currentColor; }
    }

简单的饼图

这里需要注意动画的形成原理。
css 变形规范参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 1、属性选择器:id选择器 # 通过id 来选择类名选择器 . 通过类名来选择属性选择器 ...
    Yuann阅读 1,615评论 0 7
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,730评论 0 2
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,301评论 0 11
  • 在介绍有关transform相关的知识之前,先来讲一下transform-origin的用法以及关于角度的几种取值...
    跪键盘的小泰迪阅读 1,203评论 0 2
  • 1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi阅读 5,119评论 3 23