DEV Community

Cover image for 30 Days of Code - Day 1 - Random Quote Generator
Cliff Mirschel
Cliff Mirschel

Posted on

1 1

30 Days of Code - Day 1 - Random Quote Generator

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:

  1. The background and main color theme of the app will change to another random color on page refresh.

  2. 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.

  3. 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.

Image description

Then, create a function that will use the document object to change the background and theme color to the random color selected.

script.js:

Image description

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>
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

Now whenever we visit the page, the page and text will be a random color.

Image description

Image description

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);
});

Enter fullscreen mode Exit fullscreen mode

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>

Enter fullscreen mode Exit fullscreen mode

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;
      }
    }
  }
}

Enter fullscreen mode Exit fullscreen mode

Thanks for reading along, please check in for the next progress update!

Cliff

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay