💖CSS + JS 送学妹满屏幕小爱心

简介: 💖CSS + JS 送学妹满屏幕小爱心


故事开始

午饭时间,暗恋已久的学妹拉着我的衣袖:“学长学长,你能不能让这些爱心变成五颜六色的吗~”。


我在旁边笑开了花~~~




诶呀,口水流出来了。


我想最终效果是这样的(猜猜多少个爱心):

然后开始动手吧~

学啥本领

本文将带大家学习两个好东西:

1.生成随机色的方法;

2.Element.animate() 方法。


当然,还有撩妹技巧了~

代码走起

1. 画个小爱心

爱心怎么画,不是咱们本文重点,so,SVG搞起:

<div id="heart">
  <svg t="1587910011145" class="icon" viewBox="0 0 1024 1024" version="1.1" 
       xmlns="http://www.w3.org/2000/svg" p-id="1253" width="32" height="32"
  >
    <path d="M677.51936 192.03072c113.1008 0 204.8 91.6992 204.8 204.77952 0 
             186.91072-370.3296 435.15904-370.3296 435.15904S141.68064 592.67072 141.68064 
             396.81024c0-140.78976 91.6992-204.77952 204.77952-204.77952 68.11648 0 
             128.28672 33.40288 165.5296 84.55168C549.24288 225.4336 609.41312 192.03072 
             677.51936 192.03072z" p-id="1254"
    ></path>
  </svg>
</div>

小爱心出来了:

2. 画一大堆爱心

现在删除到之前的 SVG 标签,换成动态生成咯~~

let heartList = '';
const n = 99;
for(let i = 0; i <= n; i++){
    heartList += `
      <svg t="1587910011145" class="icon" viewBox="0 0 1024 1024" version="1.1" 
           xmlns="http://www.w3.org/2000/svg" p-id="1253" width="32" height="32">
        <path d="M677.51936 192.03072c113.1008 0 204.8 91.6992 204.8 204.77952 0 
                 186.91072-370.3296 435.15904-370.3296 435.15904S141.68064 592.67072 141.68064 
                 396.81024c0-140.78976 91.6992-204.77952 204.77952-204.77952 68.11648 0 
                 128.28672 33.40288 165.5296 84.55168C549.24288 225.4336 609.41312 192.03072 
                 677.51936 192.03072z" p-id="1254"
        ></path>
      </svg>
    `
}
document.getElementById('heart').innerHTML = heartList;

一大堆小爱心出现啦:


3. 打造魔法棒

接下来我们要打造一把魔法棒,能让我们这些小爱心变成各种各样的颜色。

没错,这把魔法棒,就是用来生成随机颜色。


方法很多,我搜集以下几种简单好用的生成随机颜色的方法,基本我们业务随便一个都能用:

function getRandomColor(){
    const r = Math.floor(Math.random()*255);
    const g = Math.floor(Math.random()*255);
    const b = Math.floor(Math.random()*255);
    return 'rgba('+ r +','+ g +','+ b +',0.8)';
}
function getRandomColor(){
    return '#'+Math.floor(Math.random()*16777215).toString(16);
}
function getRandomColor(){
    return '#' + (function(color){    
        return (color +=  '0123456789abcdef'[Math.floor(Math.random()*16)])    
        && (color.length == 6) ?  color : arguments.callee(color);    
    })('');
}
function getRandomColor(){
    return '#'+'0123456789abcdef'.split('').map(
        (v,i,a) => i>5 ? null : a[Math.floor(Math.random()*16)] 
    ).join('');
}
function getRandomColor(){
    return '#'+('00000'+(Math.random()*0x1000000<<0).toString(16)).slice(-6);
}
function getRandomColor(){
    const colorAngle = Math.floor(Math.random()*360);
    return 'hsla('+ colorAngle +',100%,50%,1)';
}
function getRandomColor(){
    return (function(m,s,c){
        return (c ? arguments.callee(m,s,c-1) : '#') +
        s[m.floor(m.random() * 16)]
    })(Math,'0123456789abcdef',5)
}

随机色真好玩~

4. 五颜六色!变~

最后,我们修改前面 SVG 的代码片段,加入 getRandomColor 方法的调用:

for(let i = 0; i <= n; i++){
    heartList += `
      <svg t="1587910011145" class="icon" viewBox="0 0 1024 1024" version="1.1" 
           xmlns="http://www.w3.org/2000/svg" p-id="1253" width="32" height="32"
      fill="${getRandomColor()}"
   >
        <path d="M677.51936 192.03072c113.1008 0 204.8 91.6992 204.8 204.77952 0 
                 186.91072-370.3296 435.15904-370.3296 435.15904S141.68064 592.67072 141.68064 
                 396.81024c0-140.78976 91.6992-204.77952 204.77952-204.77952 68.11648 0 
                 128.28672 33.40288 165.5296 84.55168C549.24288 225.4336 609.41312 192.03072 
                 677.51936 192.03072z" p-id="1254"
        ></path>
      </svg>
    `
}

99 个小爱心,水灵灵的!

5. 动起来吧!

这时候,每个爱心都静静躺着页面,是时候让它们动起来啦,为了学妹~


继续改造前面 SVG 代码,为每个 SVG 标签添加连续 ID 值:

for(let i = 0; i <= n; i++){
    heartList += `
      <svg id="heart_${i}" t="1587910011145" class="icon" viewBox="0 0 1024 1024" version="1.1" 
           xmlns="http://www.w3.org/2000/svg" p-id="1253" width="32" height="32"
      fill="${getRandomColor()}"
   >
        <path d="M677.51936 192.03072c113.1008 0 204.8 91.6992 204.8 204.77952 0 
                 186.91072-370.3296 435.15904-370.3296 435.15904S141.68064 592.67072 141.68064 
                 396.81024c0-140.78976 91.6992-204.77952 204.77952-204.77952 68.11648 0 
                 128.28672 33.40288 165.5296 84.55168C549.24288 225.4336 609.41312 192.03072 
                 677.51936 192.03072z" p-id="1254"
        ></path>
      </svg>
    `
}

生命随机放大倍数,并设置动画效果:

let getRandomNum = () => Math.floor(Math.random()*2+1);
setTimeout(function(){
    for (let i = 0; i <= n; i++) {
        const item = `heart_${i}`;
        document.getElementById(item).animate([
            // keyframes translateY(0px)
            { transform: `scale(${getRandomNum()})` },
            { transform: `scale(${getRandomNum()})` },
            { transform: `scale(${getRandomNum()})` },
            { transform: `scale(${getRandomNum()})` },
            { transform: `scale(${getRandomNum()})` },
            { transform: `scale(${getRandomNum()})` },
        ], {
            // timing options
            duration: 5000,
            iterations: Infinity
        });
    }
}, 100)

然后,小爱心们动起来啦。


6. 飞起来吧~

接下来,要让这些小爱心飞起来~



下面贴代码。

html,body{
    overflow: hidden;
    width: 100%;
    height: 100%;
    margin: 0;
}
#heart{
    position: relative;
}
.item{
    position: absolute;
}

逻辑修改:

let heartList = ''; 
const n = 666; // 总爱心数
// 生成随机颜色
function getRandomColor() {
    return (function (m, s, c) {
        return (c ? arguments.callee(m, s, c - 1) : '#') +
            s[m.floor(m.random() * 16)]
    })(Math, '0123456789abcdef', 5)
}
// 生成爱心列表
for(let i = 0; i <= n; i++){
    heartList += `
      <svg id="heart_${i}" class="item" t="1587910011145" class="icon" viewBox="0 0 1024 1024" version="1.1" 
           xmlns="http://www.w3.org/2000/svg" p-id="1253" width="32" height="32"
      fill="${getRandomColor()}"
   >
        <path d="M677.51936 192.03072c113.1008 0 204.8 91.6992 204.8 204.77952 0 
                 186.91072-370.3296 435.15904-370.3296 435.15904S141.68064 592.67072 141.68064 
                 396.81024c0-140.78976 91.6992-204.77952 204.77952-204.77952 68.11648 0 
                 128.28672 33.40288 165.5296 84.55168C549.24288 225.4336 609.41312 192.03072 
                 677.51936 192.03072z" p-id="1254"
        ></path>
      </svg>
    `
}
// 随机放大倍数
const getRandomNum = (scale) => Math.floor(Math.random()*scale+1);
const boxWidth = window.innerWidth;
const boxHeight = window.innerHeight;
setTimeout(function(){
    for (let i = 0; i <= n; i++) {
        const item = `heart_${i}`;
        const width = getRandomNum(boxWidth);
        const height = getRandomNum(boxHeight);
        const cWidth = getRandomNum(1000) - width;
        const cHeight = getRandomNum(1000) - height;
        document.getElementById(item).animate([
            { transform: `scale(${getRandomNum(2)})`,left: `0px`, top: `0px` },
            { transform: `scale(${getRandomNum(2)})`,left: `${boxWidth/2}px`, top: `${boxHeight/2}px` },
            { transform: `scale(${getRandomNum(2)})`,left: `${cWidth * 2}px`, top: `${cHeight * 2}px` },
        ], {
            duration: 9000,
            iterations: Infinity,
            easing: 'ease-in-out'
        });
    }
}, 100)
document.getElementById('heart').innerHTML = heartList;

聪明的你,再配上BGM,浪漫~


还能做更多有意思的小玩意,靠各位发挥啦。

故事结束

继续~



目录
相关文章
|
26天前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
14天前
|
前端开发 JavaScript
如何在 JavaScript 中访问和修改 CSS 变量?
【10月更文挑战第28天】通过以上方法,可以在JavaScript中灵活地访问和修改CSS变量,从而实现根据用户交互、页面状态等动态地改变页面样式,为网页添加更多的交互性和动态效果。在实际应用中,可以根据具体的需求和场景选择合适的方法来操作CSS变量。
|
5天前
|
缓存 前端开发 JavaScript
优化CSS和JavaScript加载
Next.js和Nuxt.js在优化CSS和JavaScript加载方面提供了多种策略和工具。Next.js通过代码拆分、图片优化和特定的CSS/JavaScript优化措施提升性能;Nuxt.js则通过代码分割、懒加载、预渲染静态页面、Webpack配置和服务端缓存来实现优化。两者均能有效提高应用性能。
|
5天前
|
前端开发 JavaScript
用HTML CSS JS打造企业级官网 —— 源码直接可用
必看!用HTML+CSS+JS打造企业级官网-源码直接可用,文章代码仅用于学习,禁止用于商业
32 1
|
10天前
|
前端开发 JavaScript 安全
HTML+CSS+JS密码灯登录表单
通过结合使用HTML、CSS和JavaScript,我们创建了一个带有密码强度指示器的登录表单。这不仅提高了用户体验,还帮助用户创建更安全的密码。希望本文的详细介绍和代码示例能帮助您在实际项目中实现类似功能,提升网站的安全性和用户友好性。
21 3
|
14天前
|
前端开发 JavaScript UED
如何使用 JavaScript 动态修改 CSS 变量的值?
【10月更文挑战第28天】使用JavaScript动态修改CSS变量的值可以为页面带来更丰富的交互效果和动态样式变化,根据不同的应用场景和需求,可以选择合适的方法来实现CSS变量的动态修改,从而提高页面的灵活性和用户体验。
|
20天前
|
JSON 移动开发 数据格式
html5+css3+js移动端带歌词音乐播放器代码
音乐播放器特效是一款html5+css3+js制作的手机移动端音乐播放器代码,带歌词显示。包括支持单曲循环,歌词显示,歌曲搜索,音量控制,列表循环等功能。利用json获取音乐歌单和歌词,基于html5 audio属性手机音乐播放器代码。
72 6
|
2月前
|
前端开发 JavaScript
HTML+JavaScript+CSS DIY 分隔条splitter
HTML+JavaScript+CSS DIY 分隔条splitter
|
2月前
|
JavaScript 前端开发
JavaScript HTML DOM - 改变CSS
JavaScript HTML DOM - 改变CSS
28 4
用CSS+JavaScript打造网页中的选项卡
用CSS+JavaScript打造网页中的选项卡