Hi, my name is Cliff. I'm a senior software engineer with over 4 years of professional development experience building cutting-edge web/mobile applications.
I'm starting a new coding challenge for 30 days. I plan on developing a small app each day using a wide range of technologies including JavaScript, Python, HTML, CSS and hopefully many more.
In making this post I hope that others can see my journey and potentially learn something or comment if they have any improvements!! I'll be documenting the entire process here on dev.to, so I hope you all will follow along with me,
So, lets jump right into the app!
Firstly, I'll start the challenge by creating a random quote web app. My plan with this project is to keep things simple and only use vanilla JavaScript, HTML, and CSS.
Here's a couple of requirements that I would like from this app:
The background and main color theme of the app will change to another random color on page refresh.
In the center of the page, the user should see a component with a quote, author, and links to share the quote via twitter/tumbler.
The component must contain a button to get a new quote if the user presses it.
So jumping right in, I'm going to first focus on setting a random background/theme color for the app.
I've created a JavaScript filed name script.js
, which I will use to write the scripts to generate a random color.
We can generate a random color a few lines of code. Right now to keep it simple, we will choose a random color between 3 different colors stored in a list.
Then, create a function that will use the document object to change the background and theme color to the random color selected.
script.js:
This will be our script.js file. Now we can create a basic html and css markup.
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Random Quote</title>
</head>
<body>
<div id="wrapper">
<div class="box">
<div id="content" class="box_content">
Hello
</div>
</div>
<div class="footer">by <a href="https://github.com/BlueBoi904">BlueBoi904</a>
</div>
</div>
<link rel="stylesheet" href="styles.css">
<script src="script.js"></script>
</body>
</html>
styles.css:
.box {
display: flex;
align-items: center;
justify-content: center;
background-color: antiquewhite;
}
.box_content {
}
body {
background-color: #333;
color: #333;
font-family:sans-serif;
font-weight: 400;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
Now whenever we visit the page, the page and text will be a random color.
So now that we have requirement #1 satisfied, lets move on to the second!
Javascript:
const projectName = 'random-quote-machine';
let quotesData;
var colors = [
'#16a085',
'#27ae60',
'#2c3e50',
'#f39c12',
'#e74c3c',
'#9b59b6',
'#FB6964',
'#342224',
'#472E32',
'#BDBB99',
'#77B1A9',
'#73A857'
];
var currentQuote = '',
currentAuthor = '';
function getQuotes() {
return $.ajax({
headers: {
Accept: 'application/json'
},
url:
'https://gist.githubusercontent.com/camperbot/5a022b72e96c4c9585c32bf6a75f62d9/raw/e3c6895ce42069f0ee7e991229064f167fe8ccdc/quotes.json',
success: function (jsonQuotes) {
if (typeof jsonQuotes === 'string') {
quotesData = JSON.parse(jsonQuotes);
console.log('quotesData');
console.log(quotesData);
}
}
});
}
function getRandomQuote() {
return quotesData.quotes[
Math.floor(Math.random() * quotesData.quotes.length)
];
}
function getQuote() {
let randomQuote = getRandomQuote();
currentQuote = randomQuote.quote;
currentAuthor = randomQuote.author;
$('#tweet-quote').attr(
'href',
'https://twitter.com/intent/tweet?hashtags=quotes&related=freecodecamp&text=' +
encodeURIComponent('"' + currentQuote + '" ' + currentAuthor)
);
$('#tumblr-quote').attr(
'href',
'https://www.tumblr.com/widgets/share/tool?posttype=quote&tags=quotes,freecodecamp&caption=' +
encodeURIComponent(currentAuthor) +
'&content=' +
encodeURIComponent(currentQuote) +
'&canonicalUrl=https%3A%2F%2Fwww.tumblr.com%2Fbuttons&shareSource=tumblr_share_button'
);
$('.quote-text').animate({ opacity: 0 }, 500, function () {
$(this).animate({ opacity: 1 }, 500);
$('#text').text(randomQuote.quote);
});
$('.quote-author').animate({ opacity: 0 }, 500, function () {
$(this).animate({ opacity: 1 }, 500);
$('#author').html(randomQuote.author);
});
var color = Math.floor(Math.random() * colors.length);
$('html body').animate(
{
backgroundColor: colors[color],
color: colors[color]
},
1000
);
$('.button').animate(
{
backgroundColor: colors[color]
},
1000
);
}
$(document).ready(function () {
getQuotes().then(() => {
getQuote();
});
$('#new-quote').on('click', getQuote);
});
HTML:
<link
rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"
/>
<div id="wrapper">
<div id="quote-box">
<div class="quote-text">
<i class="fa fa-quote-left"> </i><span id="text"></span>
</div>
<div class="quote-author">- <span id="author"></span></div>
<div class="buttons">
<a
class="button"
id="tweet-quote"
title="Tweet this quote!"
target="_top"
>
<i class="fa fa-twitter"></i>
</a>
<a
class="button"
id="tumblr-quote"
title="Post this quote on tumblr!"
target="_blank"
>
<i class="fa fa-tumblr"></i>
</a>
<button class="button" id="new-quote">New quote</button>
</div>
</div>
<div class="footer">by <a href="https://codepen.io/BlueBoi904/">BlueBoi904</a></div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.0/jquery-ui.min.js"></script>
SCSS:
@import url('https://fonts.googleapis.com/css?family=Raleway:400,500');
* {
margin: 0;
padding: 0;
list-style: none;
vertical-align: baseline;
}
div {
position: relative;
z-index: 2;
}
body {
background-color: #333;
color: #333;
font-family: 'Raleway', sans-serif;
font-weight: 400;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.footer {
width: 450px;
text-align: center;
display: block;
margin: 15px auto 30px auto;
font-size: 0.8em;
color: #fff;
a {
font-weight: 500;
text-decoration: none;
color: #fff;
}
}
#quote-box {
border-radius: 3px;
position: relative;
//margin:8% auto auto auto;
width: 450px;
padding: 40px 50px;
display: table;
background-color: #fff;
.quote-text {
i {
font-size: 1em;
margin-right: 0.4em;
}
text-align: center;
width: 450px;
height: auto;
clear: both;
font-weight: 500;
font-size: 1.75em;
}
.quote-author {
width: 450px;
height: auto;
clear: both;
padding-top: 20px;
font-size: 1em;
text-align: right;
}
.buttons {
width: 450px;
margin: auto;
display: block;
.button {
height: 38px;
border: none;
border-radius: 3px;
color: #fff;
background-color: #333;
outline: none;
font-size: 0.85em;
padding: 8px 18px 6px 18px;
margin-top: 30px;
opacity: 1;
cursor: pointer;
&:hover {
opacity: 0.9;
}
&#tweet-quote,
&#tumblr-quote {
float: left;
padding: 0px;
padding-top: 8px;
text-align: center;
font-size: 1.2em;
margin-right: 5px;
height: 30px;
width: 40px;
}
&#new-quote {
float: right;
}
}
}
}
Thanks for reading along, please check in for the next progress update!
Cliff
Top comments (0)