表白神器

程序猿都是怎么表白的呢?
当然是用咱们高大上的代码啦,咱们今天就用js来做一个动态效果,实现的效果是这样的
http://www.iqiyi.com/w_19s8vbb4vp.html
首先,我们看一下这个总共包含两大部分:
一部分是上面文字部分,另一部分是下面跳动的心,所以我们创建两个盒子,分别装这两部分东西

Hearts

然后给textCon设置样式,和文字大小:

*{
   margin: 0;
   padding:0;
}
html,body{
    width:100%;
    height:100%;
    text-align: center;
}
.textCon{
    width:170px;
    height:60px;
    margin:50px auto;
}
.text{
    font-size:48px;
}

就是现在这效果:


image.png

紧接着给heart设置样式,并绘制爱心图案。
爱心就是一个正方形和两个圆相互组成,先设置heart为一个正方形:

.heart{
    width:50px;
    height:50px;
    background-color:#cc2a5d;
    margin:50px auto;
}
image.png

再给heart用伪元素选择器画两个圆:

.heart::before,
.heart::after{
    content:'';
    width:100%;
    height:100%;
    background-color:#cc2a5d;
    border-radius: 50%;
}

现在的两个圆在正方形这个盒子中中,我们看不到,我们给它的父元素一个相对定位:

    position: relative;

再给这两个圆一个绝对定位,让它在它的父元素中待在同一位置,方便下面给它们两个位移出一半:

position: absolute;
top:0;
left:0;
image.png

现在没啥变化,只是让两个圆脱离文档流,不会被挤出盒子,然后给两个圆分别设置一个位移,让它们各显示一半:

.heart::before{
    transform: translateX(-50%);
}
.heart::after{
    transform: translateY(-50%);
}
image.png

这样一个爱心就画好了,但是它现在是倾斜的,所以我们需要给它一个旋转:

    transform: rotate(45deg);
image.png

现在,大的框架已经完成,下面就需要给它加动态效果了,我们先给这个大心一个跳动的效果:

@keyframes heart{
    0%{
        transform: scale(0.8) rotate(45deg);
        opacity: 0.8;
    }
    50%{
        transform: scale(1) rotate(45deg);
        opacity: 1;
    }
    100%{
        transform: scale(0.8) rotate(45deg);
        opacity: 0.8; 
    }
}

并且给心设置一个跳动的方式:

   animation: heart 1s ease-in infinite;

写在heart标签中,这样心的跳动效果就完成了。
然后在写字体上面浮现的小心心

.textCon .item{
    position: absolute;
    opacity: 0;
    background-color:#cc2a5d;
    transform: rotate(45deg);
    animation: hearts 3s ease-in infinite;
}
.textCon .item::before,
.textCon .item::after{
    content:'';
    width:100%;
    height:100%;
    background-color:#cc2a5d;
    position: absolute;
    top:0;
    left:0;
    border-radius: 50%; 
}
.textCon .item::before{
    transform: translateX(-50%);
}
.textCon .item::after{
    transform: translateY(-50%);
}

给textCon一个相对定位,让这些小心心在这个盒子范围内由上至下位移的动态效果:

@keyframes hearts{
    0%{
        opacity: 0;
        transform: translateY(0%) rotate(45deg);
    }
    20%{
        opacity: 0.8;
        transform: translateY(-20%) rotate(45deg);
    }
    100%{
        opacity: 0;
        transform: translateY(-1000%) rotate(45deg);
    }
}

接下来咱们写js部分,在js中绘制小心心数量并设置出现和消失效果:

var box = document.getElementsByClassName('textCon')[0];
    function init() {
        var width = box.offsetWidth;
        var count = parseInt(width / 50 * 5);
        for (var i = 0; i < count; i++) {
            var size = parseInt(ran(60, 120) / 10);
            var ele = document.createElement('div');
            ele.classList.add('item');
            ele.style.width = size + 'px';
            ele.style.height = size + 'px';
            ele.style.left = ran(0, 95) + '%';
            ele.style.top = ran(20, 80) + '%';
            ele.style.animationDelay = ran(0, 30) / 10 + 's';
            box.appendChild(ele);
        }
    }
    function ran(min, max) {
        min = parseInt(min);
        max = parseInt(max);
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }
 init();

配合上面位移的动态效果就实现了由下至上位移出现并消失的效果。
到这就能实现我们上面看到的效果了。赶紧去试试吧。

小编能力有限,存在不足或不全,请大家指出,共同学习与交流。

你可能感兴趣的:(表白神器)