【freeCodeCamp】 random quote machine 随机格言显示器 json调用

喵的,这个随机格言显示器用了我好长的时间,因为不想做的那么简单,怎么也要酷炫一点对不对。然后在改了一个星空插件的基础上做出了这玩意
星之语
做这个需要完成完成:

  1. 功能#1: 点击一个按钮就生存一个新的随机引用短语。
  2. 功能#1: 点击一个按钮就把这个引用短语发到twitter中。

其实就这两点来说还是比较简单的,第一个是对于在freeCodeCamp前面知识的综合复习
第二个是对于分享接口的使用,同时这个项目还涉及到json的调用
我手头有的有:一个星空的canvas插件:
星空
用于绘制一个可以旋转的星空
本来是想单纯把这个当背景用,但是这样的话效果感觉还是没有互动性,所以我希望的是
增加条件(+1):在页面中间的文字发生变化的时候背景星星也能够同时变颜色
流程的具体思路:
1.从服务器获取json文件,里面有很多格言
2.当点击切换按钮的时候,将原来的格言隐藏,更换格言,然后再显示出来。这个其中的颜色也是随机的。
颜色数组,总之希望是和字体发光所对应的背景星星的颜色。
格言数组,很多格言,而且可以无限扩大,包括信息是格言的内容以及来源
然后我就想直接贴代码了,
html代码:

<!--底色星空-->
<canvas id="canvas" width="1134" height="974"></canvas>
<!--显示格言的中心块-->
<div class="displayWindow">
    <div id="message">
        <div class="word"></div>
        <div class="from">—— <span id="from"></span></div>
    </div>
    <button class="change">切换</button>
</div>
<!--copyright-->
<div class="copyright">
    by towrabbit
</div>
<!--tweet分享接口-->
<a id="tweet" href="https://twitter.com/intent/tweet?hashtags=quotes&related=freecodecamp&text=">
    <div class="tweet">tweet share</div>
</a>

然后加上可爱的符合气氛的样式(兼容移动端):

html{
    font-size:100px;
}
body{
    font-size:16px;
}
/*初始化margin和padding以便于不同浏览器兼容*/
*{
    margin:0;padding:0;box-sizing:border-box;
}
@media only screen and (max-device-width: 319px){
    html{
        font-size:45px;
    }
}
@media only screen and ( min-device-width:320px ) and ( max-device-width: 359px ){
    html{
        font-size:50px;
    }
}
@media only screen and ( min-device-width:360px ) and (max-device-width: 374px ){
    html{
        font-size:56.25px;
    }
}

@media only screen and (min-device-width: 375px) and (max-device-width: 413px){
    html{
        font-size:58.6px;
    }
}
@media only screen and (min-device-width : 414px) and (max-device-width : 736px){
    html{
        font-size:64.68px;
    }
}
body {
  background: #060e1b;
  overflow: hidden;
}
#ChartCanvas{
    background:rgba(255,255,255,0.05);
    position:absolute;
    z-index:1;
    top:0px;
    left:0px;
}
.displayWindow{
    position:fixed;
    width:5rem;
    max-width:640px;
    border-radius:.2rem;
    /*background-color: rgba(100,100,255,0.3);*/
    left:50%;
    top:30%;
    margin-left:-2.5rem;
    text-align:center;
}
#message{
    opacity:0;
    width:5rem;
    max-width:100%;
    border-radius:.2rem;
    /*background-color: rgba(100,100,255,0.3);*/
}
#message .word{
    font-size:.4rem;
    color:rgba(200,200,255,0.9);
    margin:.2rem auto;
    text-align:center;
    text-shadow:0 0 0.2rem rgba(200,200,200,0.8);
    padding:.1rem;
}
#message .from{
    padding:.1rem;
    color:rgba(200,200,255,0.9);
    width:100%;
    font-size:.3rem;
    text-align:right;
    text-shadow:0 0 0.1rem rgba(222,222,222,0.9);
}
.copyright{
    font-size:.2rem;
    position:fixed;
    bottom:5%;
    left:50%;
    width:4rem;
    margin-left:-2rem;
    color:rgba(100,100,255,0.9);
    text-align:center;
}
.change{
    transition:all .3s; 
    position:absolute;
    bottom:-.8rem;right:.3rem;
    font-size:.28rem;
    color:rgba(222,222,255,0.9);
    width:1.2rem;height:.5rem;
    line-height:.5rem;
    border:0.01rem solid rgba(150,150,255,0.8);
    background-color: rgba(50,50,255,0.2);
}
.change:hover{
    cursor:pointer;
    box-shadow:0 0 .1rem .05rem rgba(50,50,255,0.2);
    background-color: rgba(100,100,255,0.2);
}
.change:active{
    border:0.01rem solid rgba(200,200,255,0.8);
}
.tweet{
    font-size:.2rem;
    position:fixed;
    bottom:5%;
    left:25%;
    width:1.4rem;
    margin-left:-1rem;
    color:rgba(255,100,255,0.9);
    text-align:center;
    border:0.02rem solid rgba(255,100,255,0.8);
}

首先第一步就是要确定整个流程前置jquery
js:

//恶趣味,如果获取不了json的话会出现这个,同时也是初始化名言的数组
    var metoArray = [
    {
        "id":"-1",
        "word":"你无法获取数据真的很可怜",
        "by":"towrabbit"
    }
    ];//储存获取的json数据用
    /*当前显示的名言*/var currentMeto = "",/*当前的名言来源*/currentAuthor="";
$(document).ready(function() {
        //获取json
        $.getJSON("meto.json", function(data) {
            metoArray = data;
            //获取随机的索引
            var randomIndex = randomNum(0,(metoArray.length - 1));
            //随机的一个名言对象
            var currentdata = data[randomIndex];
            //引用
            currentMeto = currentdata.word;
            currentAuthor = currentdata.by;
            //渐变进入显示名言
            fadeinMessage(currentdata);
            //更改推特的接口
            changeShare(currentMeto,currentAuthor);
        });
        //添加切换按钮事件
        $(".change").click(function(){
            //这个方法用于在颜色数组中选取一个颜色渐变,并且把目标颜色存入color这个变量中用于变化在中间显示名言的字
            var color = animateColors(colors);
            //渐变目前的名言并且存储这个名言对象 包括内容以及作者(来源)
            var currentdata = randomChangeMeto(metoArray,color);
            //改变推特的接口
            changeShare(currentdata.word,currentdata.by);
        });
    });

函数:

//生成特定范围内的随机整数
function randomNum(min,max){
    var num = Math.floor(Math.random()*(max+1-min) + min);
    return num;
}
//用于改变星空中每个星星的canvasn绘制 本来是hsla的取色器 我改成rgba了 这个熟悉一些
function changeColorOfCanvas2(colorR,colorG,colorB){//传入红绿蓝三个颜色
    //hue = color || 0;
    ctx2 = canvas2.getContext('2d');
    canvas2.width = 100;
    canvas2.height = 100;
    var half = canvas2.width / 2,
    gradient2 = ctx2.createRadialGradient(half, half, 0, half, half, half);//中心渐变
    gradient2.addColorStop(0.025, '#fff');
    gradient2.addColorStop(0.1, 'rgba(' + colorR + ','+colorG+', '+colorB+',0.9)');
    gradient2.addColorStop(0.25, 'rgba(' + colorR + ', '+colorG+','+colorB+',0.05)');
    gradient2.addColorStop(1, 'transparent');

    ctx2.fillStyle = gradient2;
    ctx2.beginPath();
    ctx2.arc(half, half, half, 0, Math.PI * 2);
    ctx2.fill();
}
//创建改变星星颜色的动画 每秒30帧 输入目标颜色
var currentColor = {
    "r":33,"g":73,"b":136
};//目前的颜色引用
function animateColor(targetColor){
    var colorR = (targetColor.r - currentColor.r)/30;
    var colorG = (targetColor.g - currentColor.g)/30;
    var colorB = (targetColor.b - currentColor.b)/30;

    for(var i = 1;i <= 30 ; i ++ ){
        var colorstep = {
            "r":Math.floor(currentColor.r + colorR*i),
            "g":Math.floor(currentColor.g + colorG*i),
            "b":Math.floor(currentColor.b + colorB*i)
        };
        setTimeout("changeColorOfCanvas2("+colorstep.r+","+colorstep.g+","+colorstep.b+")",i*(1000/30));
    }
    currentColor = targetColor;
}

//颜色列表
var colors = [
    {"r":150,"g":0,"b":0},
    {"r":0,"g":200,"b":0},
    {"r":0,"g":200,"b":200},
    {"r":200,"g":0,"b":200},
    {"r":233,"g":100,"b":30},
    {"r":233,"g":233,"b":50},
    {"r":200,"g":220,"b":200},
    {"r":250,"g":220,"b":220},
    {"r":200,"g":200,"b":10},
    {"r":100,"g":255,"b":255},
    {"r":120,"g":230,"b":40},
    {"r":127,"g":255,"b":0},
    {"r":255,"g":100,"b":60},
    {"r":160,"g":230,"b":240},
    {"r":255,"g":52,"b":179},
    {"r":40,"g":40,"b":220},
    {"r":255,"g":40,"b":230},
    {"r":255,"g":160,"b":200},
    {"r":255,"g":20,"b":250},
]
//在颜色数组中选择随机的颜色进行变换
function animateColors(colors){
    var randomindex = randomNum(0,colors.length-1);
    var randomColor = colors[randomindex];
    animateColor(randomColor);
    return randomColor;
}

//改变名言颜色以及内容
    function changeWord(dataObj,color){
        //让当前的字渐渐消失 让新的字出现
        $("#message").animate({
            opacity:0,
        },800,
            function(){
                $(this).animate({
                    opacity:1,
                },800);
                $("#message .word").text(dataObj.word);
                $("#message .word").css("text-shadow","0 0 0.1rem rgba("+color.r+","+color.g+","+color.b+",0.8)");
                $("#from").text(dataObj.by);
                $(".from").css("text-shadow","0 0 0.1rem rgba("+color.r+","+color.g+","+color.b+",0.8)");
            }
        );
    };
/*页面打开的时候渐渐出现*/
function fadeinMessage(dataObj){
    console.log("yes");
    $("#message").css({"opacity":0});
    $("#message").animate({
                        opacity:1
                    },1000);
    $("#message .word").text(dataObj.word);
    $("#from").text(dataObj.by);
}

然后就ok效果:
手机效果图
emm正好出现的是我最喜欢的名言哈哈

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值