>  기사  >  웹 프론트엔드  >  미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3

미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3

PHPz
PHPz원래의
2017-04-04 11:02:211956검색

머리말
이틀 전 CSS3를 이용한 미니언 애니메이션 구현에 대한 블로그를 올렸는데, 구현된 CSS3 애니메이션은 Zokuu.com에서 찾은 미니언 그림 jpg 형식의 그림을 기반으로 했고, PS를 사용하여 애니메이션이 필요한 부분을 잘라내고 마지막으로 애니메이션 효과를 완성합니다. 하지만 사실 원래 의도는 사진을 이용해 애니메이션을 만드는 즐거움을 경험해 보는 것이었지만, 자료를 찾을 수 없어서 가장 어리석은 방법을 사용하여 내 필요에 부응할 수밖에 없었습니다. 시청할 수 있습니다. 하지만 마음속으로는 여전히 완벽함을 거부할 수 없어서 CSS3를 사용하여 미니언을 그리고 비슷한 애니메이션 효과를 얻기 위해 하룻밤을 보냈습니다.

텍스트
자, 아래 두 사진의 차이점을 살펴보겠습니다.

미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3


미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3


물론 사이즈도 확실히 다르고, 입이나 머리카락도 다르다고 말씀하시는 분들이 많을 텐데요. 다른. 그러나 실제로 가장 큰 차이점은 좀 더 생생한 예를 사용하는 것입니다. 이들은 두 아이입니다. 첫 번째 아이는 슈퍼마켓 선반에서 가져온 것이고, 다른 하나는 제가 태어났습니다. 출산하는 방법? ——CSS3를 사용하세요!

태어날 때 움직일 수 있어야 합니다. 그렇지 않으면 어릴 때 죽게 됩니다. 그래서 사진을 몇 장 더 찍어보니 이렇습니다.

미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3


어때요? 손과 발 애니메이션이 아직 그다지 유사하지는 않지만 영리한 인간의 두뇌는 여전히 의미를 알아낼 수 있습니다! 오늘은 미니언을 낳는 방법을 배워보겠습니다.

먼저 모든 사람이 볼 수 있도록 HTML 구조를 나열해 보겠습니다.

<p class="wrapper"><!-- 容器 -->
        <p class="littleH"><!-- 小黄人 -->
            <p class="bodyH"><!-- 身体 -->
                <p class="trousers"><!-- 裤子 -->
                    <p class="condoleBelt"><!-- 吊带 -->
                        <p class="left"></p>
                        <p class="right"></p>
                    </p>
                    <p class="trousers_top"></p><!-- 裤子突出的矩形部分 -->
                    <p class="pocket"></p><!-- 裤袋 -->
                    <!-- 三条线 -->
                    <span class="line_left"></span>
                    <span class="line_right"></span>
                    <span class="line_bottom"></span>
                </p>
            </p>
            <p class="hair"><!-- 头发 -->
                <span class="left_hair_one"></span>
                <span class="left_hair_two"></span>
            </p>
            <p class="eyes"><!-- 眼睛 -->
                <p class="leftEye"><!-- 左眼 -->
                    <p class="left_blackEye">
                        <p class="left_white"></p>
                    </p>
                </p>
                <p class="rightEye"><!-- 右眼 -->
                    <p class="right_blackEye">
                        <p class="right_white"></p>
                    </p>
                </p>
            </p>
            <p class="mouse"><!-- 嘴巴 -->
                <p class="mouse_shape"></p>
            </p>
            <p class="hands"><!-- 双手 -->
                <p class="leftHand"></p>
                <p class="rightHand"></p>
            </p>
            <p class="feet"><!-- 双脚 -->
                <p class="left_foot"></p>
                <p class="right_foot"></p>
            </p>
            <p class="groundShadow"></p><!-- 脚底阴影 -->
        </p>
    </p>

알겠습니다. 각 위치에 목적을 표시해 두었으니 조금만 이해하시면 됩니다. 당신의 마음에는 대략적인 모델이나 계층 구조가 있습니다.

다음 단계는 흥미로운 소식입니다. . . 차근차근 설명하고 차근차근 구현해보겠습니다.

먼저 컨테이너와 전체에 간단한 스타일 설정을 해주세요.

body{
    margin: 0;
    padding:0;
}
.wrapper{
    width: 300px;
    margin:100px auto;
}
.litteH{
    position: relative;
}
.bodyH{
    position: absolute;
    width: 240px;
    height: 400px;
    border:5px solid #000;
    border-radius: 115px;
    background: rgb(249,217,70);
    overflow: hidden;
    z-index: 2;
}

그 중 .bodyH는 주로 그림을 그리는 작업입니다. 미니언의 몸과 몸의 비율이 매우 중요합니다. 이제 실행하여 효과를 확인하세요.

미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3


확인 , 몸은 이미 거기에 있으니 이제 빨리 바지를 입으세요!

.bodyH .condoleBelt{
    position: absolute;
}
.bodyH .trousers{
    position: absolute;
    bottom: 0;
    width: 100%;
    height: 100px;
    border-top: 6px solid #000;
    background: rgb(32,116,160);
}
.trousers_top{
    width: 160px;
    height: 60px;
    border:6px solid #000;
    border-bottom: none;
    border-radius: 0 0 5px 5px;
    background: rgb(32,116,160);
    position: absolute;
    bottom: 100px;
    left:34px;
}

그중 .trousers_top은 직사각형 부분인데 바지를 입으면 어떤 모습일까요?

미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3


지금은 어떻게 봐도 캡슐같아 아니 어서 수정해봐 서스펜더, 그렇지 않으면 바지가 떨어질 것입니다. 무엇을 떨어뜨릴지:

.bodyH .condoleBelt .left,
.bodyH .condoleBelt .right{
    width: 100px;
    height: 16px;
    border:5px solid #000;
    background: rgb(32,116,160);
    position: absolute;
    top:-90px;
    left:-35px;
    z-index: 2;
    -webkit-transform:rotate(45deg);
}
.bodyH .condoleBelt .left{
    top:-88px;
    left:165px;
    -webkit-transform:rotate(-45deg);
}
.bodyH .condoleBelt .left:after,
.bodyH .condoleBelt .right:after{
    content: '';
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: #000;
    position: absolute;
    top:4px;
    left:88px;
}

.bodyH .condoleBelt .left:after{
    left:5px;
}

이 부분은 주로 두 개의 슬링(왼쪽에 하나, 왼쪽에 하나)을 구현하는 것입니다. 그런 다음 의사 요소 뒤에 작은 검은 점을 구현합니다. on the sling:

미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3


안녕하세요, 이제 괜찮아 보이기 시작했습니다. 바지 주머니와 잘린 가장자리:

.pocket{
    width: 60px;
    height: 45px;
    border:6px solid #000;
    border-radius: 0px 0px 25px 25px;
    position: absolute;
    bottom:65px;
    left:84px;
}
.line_right{
    width: 30px;
    height: 30px;
    border-bottom-left-radius: 100px;
    border-bottom:6px solid #000;
    border-left:6px solid #000;
    position: absolute;
    left: 0;
    bottom:60px;
    -webkit-transform:rotate(-75deg);
}
.line_left{
    width: 30px;
    height: 30px;
    border-bottom-right-radius: 100px;
    border-bottom:6px solid #000;
    border-right:6px solid #000;
    position: absolute;
    right: 0;
    bottom:63px;
    -webkit-transform:rotate(75deg);
}
.line_bottom{
    height: 40px;
    border:3px solid #000;
    border-radius: 3px;
    position: absolute;
    left:118px;
    bottom: 0px;
}

먼저 렌더링을 보세요:

미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3


좋아요, 2점 참고 사항:

1 .바지를 몸체 안에 넣은 다음 .bodyH에 Overflow:hidden을 추가하여 오버플로에 대해 걱정할 필요가 없고 바지의 효과를 쉽게 얻을 수 있습니다. ;

2. 바지 양쪽에 두 개의 곡선 부분이 있는 것을 볼 수 있습니다. 직사각형의 모서리에 둥근 효과를 준 다음 인접한 두 변의 테두리 스타일만 설정하여 이 효과를 얻었습니다. 물론 각도를 회전시키면 더 간단한 효과를 얻을 수 있습니다.

계속해서 다음과 같은 눈 부분을 구현해 보겠습니다.

아아아아

눈 부분은 먼저 안경을 그린 다음 검은 눈알, 흰색 점을 그립니다. 마지막으로 안경 프레임을 그렸습니다. :after 의사 요소를 사용하여 눈 프레임을 구현했습니다. 렌더링은 다음과 같습니다.

미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3


입이 가장 헷갈렸는데 결국엔 가능하더군요. :

rree

먼저 직사각형 모서리 중 하나를 둥글게 만들어 입 모양을 시뮬레이션한 다음 회전합니다.

미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3


결과는 다음과 같습니다. 이렇게 해서 원하는 효과를 얻으려면 윗부분을 덮어야 하므로 다음을 사용합니다. 마스킹 효과를 얻기 위해 의사 요소 뒤에:

.eyes{
    position: relative;
    z-index: 3;
}
.eyes .leftEye,.eyes .rightEye{
    width: 85px;
    height: 85px;
    border-radius: 50%;
    border:6px solid #000;
    background: #fff;
    position: absolute;
    top:60px;
    left: 27px;
}
.eyes .leftEye{
    left: 124px;
}
.eyes .leftEye .left_blackEye,
.eyes .rightEye .right_blackEye{
    width: 40px;
    height: 40px;
    border-radius: 50%;
    background: #000;
    position: absolute;
    top:24px;
    left:22px;
}
.eyes .leftEye .left_blackEye .left_white,
.eyes .rightEye .right_blackEye .right_white{
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background: #fff;
    position: absolute;
    top:7px;
    left:17px;
}
.eyes .leftEye .left_blackEye .left_white{
    top:4px;
    left:17px;
}
.eyes .leftEye:after,
.eyes .rightEye:after{
    content: '';
    width: 28px;
    height: 18px;
    background: #000;
    position: absolute;
    left:-30px;
    top:37px;
    -webkit-transform:skewX(20deg) rotate(7deg);
}
.eyes .leftEye:after{
    left:89px;
    top:37px;
    -webkit-transform:skewX(-20deg) rotate(-7deg);
}

이 장소는 천천히 조정해야 합니다. 적절한 위치, 시뮬레이션 다이어그램은 다음과 같습니다.

미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3


红色部分就是遮罩了,也是一个矩形,设置了底边框,实现和嘴巴下半部分形成闭合效果,现在我们就可以把颜色改成肤色就行了:

.mouse .mouse_shape:after{
    content: '';
    width: 70px;
    height: 32px;
    border-bottom:5px solid #000;
    border-radius:35px 26px 5px 5px;
    background: rgb(249,217,70);
    position: absolute;
    top:-16px;
    left:3px;
    -webkit-transform:rotate(34deg);
    -webkit-animation: mouse_mask 5s ease-in-out infinite;
}

效果图如下:

미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3


接下来实现双手部分,这一部分不难,就是两个圆角矩形,旋转了角度,然后层级低于身体的层级就行,然后再通过:after伪元素实现胳膊关节处就搞定了。

.hands{
    position: relative;
}
.hands .leftHand,
.hands .rightHand{
    width: 80px;
    height: 80px;
    border:6px solid #000;
    border-radius: 25px;
    background: rgb(249,217,70);
    position: absolute;
    top:220px;
    left:-23px;
    -webkit-transform:rotate(40deg);
}
.hands .leftHand{
    left:182px;
    top:220px;
    -webkit-transform:rotate(-40deg);
}
.hands .leftHand:after,
.hands .rightHand:after{
    content: '';
    width: 6px;
    border:3px solid #000;
    border-radius: 3px;
    position: absolute;
    left:13px;
    top:50px;
    -webkit-transform:rotate(90deg);
}

.hands .leftHand:after{
    left:53px;
    top:50px;
    -webkit-transform:rotate(-90deg);
}

效果图如下:

미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3


再接下来就是双脚的部分了,主要就是鞋面的设计,我是通过一个矩形,然后设置不同的圆角值,加上一点点的旋转来模拟的,这一块的话,怎么做我都觉得不是很像,所以最后差不多我就妥协了。

.feet{
    position: relative;
}
.feet .left_foot,
.feet .right_foot{
    width: 36px;
    height: 50px;
    border-bottom-right-radius: 6px;
    border-bottom-left-radius: 9px;
    background: #000;
    position: absolute;
    top: 406px;
    left:88px;
    -webkit-transform-origin: right top;
}
.feet .left_foot{
    border-bottom-right-radius: 9px;
    border-bottom-left-radius: 6px;
    left:130px;
    -webkit-transform-origin: left top;
}
.feet .left_foot:after,
.feet .right_foot:after{
    content: '';
    width: 60px;
    height: 35px;
    border-radius: 20px 10px 21px 15px;
    background: #000;
    position: absolute;
    left:-36px;
    top:14.4px;
    -webkit-transform:rotate(5deg);
}
.feet .left_foot:after{
    border-radius: 10px 20px 15px 21px;
    left:13px;
    -webkit-transform:rotate(-5deg);
}

效果图如下:

미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3


本来是不想画头发的,感觉怪难的,最后尝试了一下,还是能出个样子,那就添加上去吧。原理跟裤子左右两边的实现原理是一样的,只是参数值不一样罢了,大家参考代码琢磨一下:

.hair{
    position: relative;
}
.left_hair_one{
    width: 130px;
    height: 100px;
    border-radius: 50%;
    border-top:8px solid #000;
    position: absolute;
    left:17px;
    top:-17px;
    -webkit-transform:rotate(27deg);
}
.left_hair_two{
    width: 80px;
    height: 80px;
    border-radius: 50%;
    border-top:6px solid #000;
    position: absolute;
    left:45px;
    top:-10px;
    -webkit-transform:rotate(15deg);
}

补充脚底阴影部分:

.groundShadow{
    width: 200px;
    height: 2px;
    border-radius: 50%;
    background: rgba(0,0,0,0.3);
    box-shadow: 0 0 2px 4px rgba(0,0,0,0.3);
    position: relative;
    top: 455px;
    left:25px;
}

最后就是最初的效果了:

미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3


这时大家可能会问:然后呢?不是还会动的吗?

是的,这里我就大概讲一下实现的思路吧:

1.头发:头发我想实现的是被小风轻轻地吹起来,然后很快就塌下去,所以吹起和下塌分配的时间很关键;

2.眼睛:眼睛我设想的场景是小黄人在悠闲地走路,然后不时左右看一下两边的风景,所以眼睛转动很悠哉,所以分配的时间可以稍微长一点点;

3.嘴巴:让嘴巴动起来确实比较难,因为要动的话,遮罩也得实时跟着改变,而且不能露馅,所以最后实现的是当它往左边看了一下之后卖了一下萌;

4.双手和双脚:这部分确实很难逼真,本来脚就不是正常的走路状态,所以只能按卓别林老爷爷的走路方式模拟一下,而且左右脚动作是紧接实现而不是同步实现。双手的话,我是简单模拟人在走路时有摆手的自然惯性,而且是左脚配右手,右脚配左手。考虑到它的双手是放在背后的,所以我的摆动幅度设置为非常小,有效果但不明显。

OK,我就直接把动画代码放上来吧:

.left_hair_one{
    -webkit-animation: lefthair 2s ease-in-out infinite;
}
@-webkit-keyframes lefthair{
    0%,25%,31%,100%{
    }
    30%{
        -webkit-transform: rotate(31deg) translate3d(-3px,-1px,0);
    }
}
.eyes .leftEye .left_blackEye,
.eyes .rightEye .right_blackEye{
    -webkit-animation: blackeye 5s ease-in infinite;
}
@-webkit-keyframes blackeye{
    0%,20%,50%,70%,100%{
        -webkit-transform: translateX(0px);
    }
    30%,40%{
        -webkit-transform: translateX(15px);
    }
    80%,90%{
        -webkit-transform: translateX(-15px);
    }
}
.eyes .leftEye .left_blackEye .left_white,
.eyes .rightEye .right_blackEye .right_white{
    -webkit-animation: whiteeye 5s ease-in-out infinite;
}
@-webkit-keyframes whiteeye{
    0%,20%,50%,70%,100%{
        -webkit-transform: translateX(0px);
    }
    30%,40%{
        -webkit-transform: translate3d(3px,4px,0);
    }
    80%,90%{
        -webkit-transform: translate3d(-15px,4px,0);
    }
}
.mouse .mouse_shape{
    -webkit-animation: mouse 5s ease-in-out infinite;
}
@-webkit-keyframes mouse{
    40%,43%{
        width: 45px;
        height: 25px;
        top:180px;
    }
    0%,35%,48%,100%{
        width: 55px;
        height: 35px;
        top:175px;
        -webkit-transform:rotate(-35deg);
    }
}
.mouse .mouse_shape:after{
    -webkit-animation: mouse_mask 5s ease-in-out infinite;
}
@-webkit-keyframes mouse_mask{
    40%,43%{
        width: 60.5px;
        top:-19.3px;
        left:1.5px;
    }
    0%,35%,48%,100%{
        width: 70px;
        top:-16px;
        left:3px;
        -webkit-transform:rotate(33deg);
    }
}
.hands .rightHand{
    -webkit-animation:rightHand .8s ease-in-out infinite;
}
@-webkit-keyframes rightHand{
    0%,50%,100%{
        -webkit-transform: rotate(40deg);
    }
    30%{
        -webkit-transform: rotate(37deg) translateX(1px);
    }
}
.hands .leftHand{
    -webkit-animation:leftHand .8s ease-in-out infinite;
}
@-webkit-keyframes leftHand{
    0%,50%,100%{
        -webkit-transform: rotate(-40deg);
    }
    80%{
        -webkit-transform: rotate(-37deg) translateX(-1px);
    }
}
.feet .right_foot{
    -webkit-animation: rightfoot .8s ease-in-out infinite;
}
@-webkit-keyframes rightfoot{
    0%,50%,100%{
        -webkit-transform: rotate(0deg);
    }
    80%{
        -webkit-transform: rotate(10deg);
    }
}
.feet .left_foot{
    -webkit-animation: leftfoot .8s ease-in-out infinite;
}
@-webkit-keyframes leftfoot{
    0%,50%,100%{
        -webkit-transform: rotate(0deg);
    }

    30%{
        -webkit-transform: rotate(-10deg);
    }
}

篇幅比较大,代码看多了会乱,如果觉得自己懒得整理的话,可以直接到我的github上下载这个简单又好玩的案例吧:https://github.com/JR93/littleHuang

谢谢!

위 내용은 미니언을 그리고 애니메이션 효과를 얻는 순수 CSS3의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.