{
"name": "Responsive Design with Bootstrap",
"order": 0.003,
"challenges": [
{
"_id": "bad87fee1348bd9acde08812",
"name": "Waypoint: Mobile Responsive Images",
"difficulty": 0.047,
"description": [
"Now let's go back to our Cat Photo App. This time, we'll style it using the popular Twitter Bootstrap responsive CSS framework. First, add a new image with the src attribute of \"http://bit.ly/fcc-kittens2\", and add the img-responsive Bootstrap class to that image.",
"It would be great if the image could be exactly the width of our phone's screen.",
"Fortunately, we have access to a Responsive CSS Framework called Bootstrap. You can add Bootstrap to any app just by including it with <link rel='stylesheet' href='//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css'/> at the top of your HTML. But we've gone ahead and automatically added it to your Cat Photo App for you.",
"Bootstrap will figure out how wide your screen is and respond by resizing your HTML elements - hence the name Responsive Design.",
"With responsive design, there is no need to design a mobile version of your website. It will look good on devices with screens of any width.",
"Now all you need to do is add the img-responsive class to your image."
],
"tests": [
"assert($('img').hasClass('img-responsive'), 'Your new image should have the class \"img-responsive\".')",
"assert(new RegExp('http://bit.ly/fcc-kittens2', 'gi').test($('img.img-responsive').attr('src')), 'You should add a second image with the src of http://bit.ly/fcc-kittens2.')"
],
"challengeSeed": [
"",
"",
"",
"
Click here for cat photos.
", "", "Things cats love:
", "Top 3 things cats hate:
", "text-center class to your h2 element.",
"Now that we're using Bootstrap, we can center our heading elements to make them look better. All we need to do is add the class text-center to our h1 and h2 elements.",
"Remember that you can add several classes to the same element by separating each of them with a space, like this: <h2 class=\"text-red text-center\">your text</h2>."
],
"tests": [
"assert($('h2').hasClass('text-center'), 'Your h2 element should be centered by applying the class \"text-center\"')"
],
"challengeSeed": [
"",
"",
"",
"Click here for cat photos.
", "", "Things cats love:
", "Top 3 things cats hate:
", "Click here for cat photos.
", "", "Things cats love:
", "Top 3 things cats hate:
", "btn-block class to your Bootstrap button.",
"Normally, your buttons are only as wide as the text they contain. By making them block elements, your button will stretch to fill your page's entire horizontal space.",
"Note that these buttons still need the btn class."
],
"tests": [
"assert($('.btn-block').length > 0, 'your new button should have the class \"btn-block\".')"
],
"challengeSeed": [
"",
"",
"",
"Click here for cat photos.
", "", "Things cats love:
", "Top 3 things cats hate:
", "btn-primary class to your button.",
"The btn-primary class is the main color you'll use in your app. It is useful for highlighting actions you want your user to take.",
"Note that this button will still need the btn class."
],
"tests": [
"assert($('.btn-primary').length > 0, 'Your new button should have the class \"btn-primary\".')",
"assert($('.btn').length > 0, 'Your new button should have the class \"btn\".')"
],
"challengeSeed": [
"",
"",
"",
"Click here for cat photos.
", "", "Things cats love:
", "Top 3 things cats hate:
", "btn-info and btn-block classes to it.",
"Bootstrap comes with several pre-defined colors for buttons. The btn-info class is used to call attention to optional actions that the user can take.",
"Note that these buttons still need the btn and btn-block classes."
],
"tests": [
"assert($('.btn-info').length > 0, 'your new button should have the class \"btn-info\".')",
"assert($('.btn-block').length > 1, 'Both of your Bootstrap buttons should have the class \"btn-block\".')"
],
"challengeSeed": [
"",
"",
"",
"Click here for cat photos.
", "", "Things cats love:
", "Top 3 things cats hate:
", "btn-danger.",
"Bootstrap comes with several pre-defined colors for buttons. The btn-danger class is the button color you'll use to notify users that the button performs a destructive action, such as deleting a cat photo.",
"Note that these buttons still need the btn and btn-block classes."
],
"tests": [
"assert($('.btn-danger').length > 0, 'Your new button should have the class \"btn-danger\".')",
"assert($('.btn-block').length > 1, 'Both of your Bootstrap buttons should have the class \"btn-block\".')"
],
"challengeSeed": [
"",
"",
"",
"Click here for cat photos.
", "", "Things cats love:
", "Top 3 things cats hate:
", "<div class=\"row\"> element, then each of them within a <div class=\"col-xs-4\"> element.",
"Bootstrap uses a responsive grid system, which makes it easy to put elements into rows and specify each element's relative width. Most of Bootstrap's classes can be applied to a div element.",
"Here's a diagram of how Bootstrap's 12-column grid layout works:",
"
",
"Note that in this illustration, we use the col-md-* class. Here, \"md\" means \"medium\", and \"*\" is a number specifying how many columns wide the element should be. In this case, we're specifying how many columns wide an element should be on a medium-sized screen, such as a laptop.",
"In the Cat Photo App that we're building, we'll use col-xs-*, where \"*\" is the number of columns wide the element should be, and \"xs\" means \"extra small\", like an extra-small mobile phone screen.",
"The row class is applied to a div, and the buttons themselves can be wrapped within it."
],
"tests": [
"assert($('.row').length > 0, 'Your new button should be wrapped within a div with the class \"row\".')",
"assert($('.col-xs-4').length > 2, 'Each of your bootstrap buttons should be wrapped in a div with the class \"col-xs-4\".')"
],
"challengeSeed": [
"",
"",
"",
"Click here for cat photos.
", "", "Things cats love:
", "Top 3 things cats hate:
", ".red-text, p, .smaller-image. Delete the p element with the dead link. Remove your red-text class from your h2 element and instead apply the text-primary Bootstrap class. Replace the smaller-image class on your top image with the img-responsive class.",
"We can clean up our code and make our Cat Photo App look more conventional by using Bootstrap's built-in styles instead of the custom styles we created earlier.",
"Don't worry - there will be plenty of time to customize our CSS later."
],
"tests": [
"assert(!$('h2').hasClass('red-text'), 'You h2 element should no longer have the class \"red-text\".')",
"assert($('h2').hasClass('text-primary'), 'You h2 element should now have the class \"text-primary\".')",
"assert(!$('p').css('font-family').match(/monospace/i), 'Your paragraph elements should no longer use the font \"Monospace\".')",
"assert($('.img-responsive').length > 1, 'Remove the \"smaller-image\" class from your top image and replace it with the \"img-responsive\" class.')"
],
"challengeSeed": [
"",
"",
"",
"Click here for cat photos.
", "", "Things cats love:
", "Top 3 things cats hate:
", "<div class='row'> element. Wrap your h2 text within a <div class='col-xs-8'> and your image in a <div class='col-xs-4'> so that they are on the same line.",
"We will make a simple heading for our Cat Photo App by putting them in the same row.",
"Remember, Bootstrap uses a responsive grid system, which makes it easy to put elements into rows and specify each element's relative width. Most of Bootstrap's classes can be applied to a div element.",
"Here's a diagram of how Bootstrap's 12-column grid layout works:",
"
",
"Note that in this illustration, we use the col-md-* class. Here, \"md\" means \"medium\", and \"*\" is a number specifying how many columns wide the element should be. In this case, we're specifying how many columns wide an element should be on a medium-sized screen, such as a laptop.",
"In the Cat Photo App that we're building, we'll use col-xs-*, where \"*\" is the number of columns wide the element should be, and \"xs\" means \"extra small\", like an extra-small mobile phone screen.",
"Notice how the image is now just the right size to fit along the text?"
],
"tests": [
"assert($('.row').length > 1, 'Your h2 and top image elements should both be wrapped together within a div with the class \"row\".')",
"assert($('.col-xs-4').length > 3, 'Wrap your top image inside a div with the class \"col-xs-4\".')",
"assert($('.col-xs-8').length > 0, 'Wrap your h2 element inside a div with the class \"col-xs-8\".')"
],
"challengeSeed": [
"",
"",
"",
"",
"Things cats love:
", "Top 3 things cats hate:
", ".svg file format. These icons are treated just like fonts. You can specify their size using pixels, and they will assume the font size of their parent HTML elements.",
"Go ahead and add a <i class=\"fa fa-thumbs-up\"></i> within your like button's element."
],
"tests": [
"assert($('.fa-thumbs-up').length > 0, 'You should add a <i class=\"fa fa-thumbs-up\"></i> within your like button element.')"
],
"challengeSeed": [
"",
"",
"",
"",
"Things cats love:
", "Top 3 things cats hate:
", ".svg file format. These icons are treated just like fonts. You can specify their size using pixels, and they will assume the font size of their parent HTML elements.",
"Add <i class=\"fa fa-info-circle\"></i> within your info button's element, and a <i class=\"fa fa-trash\"></i> within your delete button."
],
"tests": [
"assert($('.fa-trash').length > 0, 'You should add a <i class=\"fa fa-trash\"></i> within your delete button element.')",
"assert($('.fa-info-circle').length > 0, 'You should add a <i class=\"fa fa-info-circle\"></i> within your info button element.')"
],
"challengeSeed": [
"",
"",
"",
"",
"Things cats love:
", "Top 3 things cats hate:
", "<div class='row'> element. Then wrap each of them within a <div class='col-xs-6'> element.",
"You can use Bootstrap's col-xs-* classes on form elements, too! This way, our radio buttons will be evenly spread out across the page, regardless of how wide the screen resolution is."
],
"tests": [
"assert($('.row').length > 2, 'Wrap your all of your radio buttons inside one div with the class \"row\".')",
"assert($('.col-xs-6').length > 1, 'Wrap each of your radio buttons inside its own div with the class \"col-xs-6\".')"
],
"challengeSeed": [
"",
"",
"",
"",
"Things cats love:
", "Top 3 things cats hate:
", "<div class='row'> element. Then wrap each of them in a <div class='col-xs-4'> element.",
"You can use Bootstrap's col-xs-* classes on form elements, too! This way, our checkboxes will be evenly spread out across the page, regardless of how wide the screen resolution is."
],
"tests": [
"assert($('.row').length > 3, 'Wrap your all of your checkboxes inside one div with the class \"row\".')",
"assert($('.col-xs-4').length > 6, 'Wrap each of your checkboxes inside its own div with the class \"col-xs-4\".')"
],
"challengeSeed": [
"",
"",
"",
"",
"Things cats love:
", "Top 3 things cats hate:
", "form-control. Give your form's submit button the classes btn btn-primary and give it the Font Awesome icon of fa-paper-plane."
],
"tests": [
"assert($('.btn-primary').length > 1, 'Give the submit button in your form the classes \"btn btn-primary\".')",
"assert($('.fa-paper-plane').length > 0, 'Add a <i class=\"fa fa-paper-plane\"></i> within your submit button element.')",
"assert($('.form-control').length > 0, 'Give the the text input field in your form the class \"form-control\".')"
],
"challengeSeed": [
"",
"",
"",
"",
"Things cats love:
", "Top 3 things cats hate:
", "Things cats love:
", "Top 3 things cats hate:
", "