[MUSIC] BRIAN YU: All right, welcome,
everyone, to Web Programming with Python and JavaScript. My name is Brian Yu. And in this course, we'll dive
into the design and implementation of web applications. In lectures, we'll have an
opportunity to discuss and explore many of the ideas and
tools and languages that are central to
modern web programming. And through hands-on projects, you'll
have an opportunity to take those ideas and put them into practice, designing
multiple web applications of your own, culminating in a final
project of your own choosing. Throughout the term, we'll
cover a number of topics in this world of web
programming, beginning with HTML5 and CSS3,
two of the languages that are central to the
understanding of web pages. HTML is a language we'll use to
describe the structure of a web page. And CSS is the language
we'll use to describe the style of a web page,
the colors and the fonts and the layouts and the spacing
that make the web page look exactly the way we want it to look. After that, we'll turn
our attention to Git, a tool not specific to
web programming per se, but that we can use in order to
version control our programs, to keep track of the different
changes we make to our web programs, and to allow us to be able to work
on various different parts of the web application at the same time before
merging those pieces back together. After that, we'll take a look at
Python, one of the first main languages that we're going to be
exploring in the course, which is the language that we are going to use
in order to build our web applications. Specifically, we'll use Python
using a framework called Django. Django is a web programming framework
written in the Python programming language that we're going to use to make
it easy to design and develop our web applications Django in particular makes
it easy to design web applications that interact with data. So after that, we'll turn our
attention to SQL, a language that we can use to interact with
databases, in particular looking at how Django allows us to use models
and migrations to interact with data and allow users to interact
with data all the more easily. Next, we'll turn our attention to
the second of the main programming languages that we'll be exploring
in this class, JavaScript, and looking at how we can use
JavaScript to run in users' web browsers to make web pages just a
little bit more interactive. In particular, we'll use JavaScript
in the context of user interfaces, looking at modern user
interfaces and exploring how it is that those
interfaces work and how we can develop those user interfaces
with a combination of Python and JavaScript. Next, we'll turn our
attention to testing and CI/CD, or Continuous
Integration and Continuous Delivery, which are tools that we can use and
software best practices to make sure that we're able to design and
develop code more efficiently. And testing in particular makes sure
that as we make changes to our code, we're not breaking existing
parts of our web application by making sure that we
have a whole suite of tests that we can use to ensure that
our web application is always behaving as it should. And finally, we'll turn our
attention to scalability and security on the internet, thinking
about what happens as our web application grows larger. As more and more different users
start to use our web application, how do we load balance
between those people? And what do we need to change about
our database to make sure lots of users are able to connect to our web
application at the same time? Moreover, we'll look at
the security implications behind designing our web applications. What might an adversary
do if we're not careful? And how should we proactively
be designing our web application to make sure that it's secure? But today, we begin our
conversation with HTML and CSS, two of the languages that are
foundational to understanding web pages and how web browsers are able
to display those web pages. And we'll start with each HTML,
or HyperText Markup Language, which is a language that we can use to
describe the structure of the web page, all of the buttons and the text and the
forms and other parts of the web page that the user ultimately
sees and interacts with. Our very first HTML page is going to
look a little something like this. It's going to be text-based code that
we write that a web browser, like Safari or Chrome or Firefox, is then able
to look at, parse, understand, and display to the user. So let's take a look at
this page one line at a time and get an understanding
for how it works. Even if you don't quite understand
all the nuances of the syntax, there are probably a couple of
things that stand out to you. You might notice the word
title, which probably reflects the title of the web page,
for example, which in this case appears to be the word hello. And then down further below, we see
that we have the body of the web page that seems to contain
the words hello world. So what is this web page
actually going to look like? Well, let's take a look at it. We'll go ahead and
open up a text editor. You can use any text editor you want. But for this course, I'm going to
use Microsoft's Visual Studio Code. And I'm going to open up a new file
that I'm just going to call hello.html. Inside of hello.html I'm going to
write the same HTML that we just saw a moment ago. And we'll explain each of
these lines in due time. But recall that we had a title of the
page that said something like hello and then a body of the page where
we said something like hello world, for example. So this is our very first HTML page. And if I go ahead and open that HTML
page as my opening hello.html HTML, for example, inside of a web browser,
what I'll see is something like this. In the body of the page, I
see the words hello world. And if you notice up here at
the top of my web browser, I see the title bar, where I have the
title for this page, which in this case is just the word hello. So this is our very first
web program that we've been able to develop just using HTML. And now let's explore in more detail
how exactly this program works. So here again was the web page
that we were just looking at. And this very first
line here, DOCTYPE html is what we might call
a DOCTYPE declaration. It's a way of telling the web
browser what version of HTML we're using in this particular
web page, because depending on the version of HTML,
the web browser might want to display different
information or it might need to parse the page a little bit differently. Each version of HTML has
had a slightly different way of indicating that version. But this line here,
DOCTYPE html is our way of saying that this HTML
page is written using HTML5, the latest version of HTML. After that our HTML page is structured
as a series of nested HTML elements, where an HTML element describes
something on the page. And we might have elements that
are inside of other elements. Each of those elements
is indicated by what we're going to call an HTML tag,
enclosed using those angled brackets. And right here, we'll see the
beginning of the HTML tag, which means that this is the beginning
of the HTML content of our page. Down below this slash
HTML means that this is the end of the HTML
content of the page. And in between is the actual
HTML content of the page, which might include other HTML elements. You might also notice
that in this HTML tag we've specified what we're
going to call an HTML attribute, some additional information that
we're giving about this tag. In particular, we're giving it
a lang, or language, attribute, which is equal to en, or English. This just tells the web browser or
anyone looking at the HTML of this page that this page is written in a language,
and the language it's written in is English. And this is helpful for
search engines, for example. When they're looking through
many different web pages trying to figure out what language
each web page is in we can just tell the search engine or
anyone else who's looking at the page that this page is written in English. Now, inside of the
HTML body of the page, we have a number of
different elements that are going to describe
what we want on this page, starting with the head section of
the web page, which describes stuff not in the main body of the web
page, the part of the web page the user sees, but other
information about the web page that's going to be helpful or
useful for web browsers to know about. For example, one important thing
that a web browser needs to know is, what is the title of the web page? And here, we see a title tag,
again, indicated by the word title in those angled brackets, followed
by the end of the title tag, indicated by a slash before the title. And in between the two title
tags is the word hello, which means the title of this
page should be the word hello. And that's all the information
we'll have in the head of the page. We'll add more information
there later, but for now all the web page needs to
know is that it has a title and the title is the word hello. Next up comes the body of the page,
again, indicated by a body tag and that ends with a
tag with slash body, meaning this is the end
of the body of the page. And the body of the page, again, is
just the visible part of the page that the user can see. And what do we want inside
the body of the page? For now, we just want
the text, hello world. And that's the information
that's going to be displayed when someone visits this web page. And so that's all there
really is to this HTML page. We specified in the header that there's
a title of the page called hello. And inside the body, we're saying the
page should say the words hello world. And if you want to visually
think about the way that all these HTML
elements are structured, it can sometimes be helpful
to think about an HTML page in terms of a tree-like
structure that we call the document object model, or DOM. And so, here, for example, is
what the DOM for this web page might actually look like. Here on the left is the HTML content
that we just saw a moment ago. And over here on the right is the
DOM, the document object model, the tree-like structure that describes
how all of these HTML elements are related to each other. So we start up here
with the HTML element. And this parent element, so to
speak, has two child elements within it, a head element
and a body element. As we can see here,
we're inside of HTML. We have a head section
and a body section. And the indentation here that
we're including in the HTML text, it's not strictly necessary. The web browser doesn't care
what the indentation is. But it can be helpful for someone
who's reading the page just to see the indentation to understand
visually that the head is inside of the HTML element and the body
is inside of the HTML element too. So inside of the head element,
we have a title element. And inside of the title element
is just the text, the word hello. And likewise, inside
of the body element, we also have some text,
the text hello world. So thinking about HTML and HTML
documents in terms of this structure can be helpful for understanding which
HTML elements are inside of which other HTML elements. And that's going to make it easier
for us to reason about these pages later on. And especially as we later transition
into the world of JavaScript, JavaScript is going to make
it all the more powerful and give us the ability to actually
modify parts of this DOM as well. But we'll certainly get
to that in due time. So now, let's take a look at some of
the other common HTML tags and HTML elements that we might be
interacting with in our web page. And we'll start by thinking about
HTML headings, so big banners at the top of the page, for
example, some headline that describes what a page is about. So I'll go ahead into my text
editor and create a new file that I'll call headings.html. And the structure of this page is
going to be pretty similar to the pages that we've seen before already. So I'm going to start by just using the
hello.html text and paste it in here. I'll change the title of the page. Instead of hello, we'll go
ahead and call it headings. But inside the body of this page now, I
want something a little bit different. I'm going to, inside the body
the page, use an h1 element and say this is a heading, for example. So h1 is a tag that I can use to create
a large heading at the top of my page, like for the title of
the page, for example. So if I open up headings.html. I might see something
that looks like this, a big heading at the top of my
page that says, this is a heading. h1, where the h stands for heading
and the 1 stands for the largest possible heading. And in fact, HTML gives us
a number of different tags that we can use in order to
create headings of various sizes. So, for example, I could also
say h2 inside of which I say, this is a smaller heading. If h1 is the largest heading, h2
is the second largest heading. So if I load this page, for example,
I now see the h1 at the very top. This is the big heading. And then beneath that, I see this
is a smaller heading, the h2. And it turns out there's
also h3, h4, h5, all the way down to h6, which is
the smallest heading, such that if I load this page now,
I have a big heading, a smaller one, and then here's the smallest. So we can often use
these h1, h2, h3 tags just for visually organizing
text inside of a page. If I want the title of
the page, but also I want titles for each of the various
different sections and subsections that might be contained
within that page as well. So those are headings. And now, let's also take a
look at some other elements that we might want to add. On web pages, we see not just
titles and not just text, but we might also see
lists, for example. Like if you've ever used a to
do list program on a web page, for example, you might see a list
of things that you need to do or other web pages might
display lists of information. And it turns out that HTML
has two basic types of lists. We have ordered lists for things
that are in a particular order, like item number 1, item
number 2, item number 3. And we have unordered lists for lists
that don't have any particular order. So just bullet point, bullet
point, bullet point, for example. And both are quite easy to use. I'll go ahead and create a new file. And we'll call this lists.html. And again, in list.html, I'll copy
the same structure from hello.html. We're again going to have DOCTYPE html
just to indicate the version of HTML. Most of the heading is the same. I'm just going to change the
title from Hello to Lists. And then we're going to
replace the body of this page to show some different information here. So let me first show what an
ordered list might look like, something that has numbers, 1, 2, 3. An ordered as an HTML tag is
just ol, ol for ordered list. So I can add a tag that says ol. And now inside of my ol element,
my ordered list element, I need a new element
for every list item. List item we're going to
abbreviate to just li. So the li tag in HTML
is what we're going to use to designate an item
inside of an HTML list. So here, for example, I could
say li and then first item. Then I could do the same
thing, li second item and then again li third item. So what I have here are some
elements and then elements nested within other elements. I have an ordered list
element inside of which are three other HTML elements,
three list items that are each indicating each of the
individual items that are inside of my HTML list. I can now open this up
by opening lists.html. And this is what I see. I see an ordered list,
where I have item number 1, first item, second item, third item. Note that I didn't actually
need to in the HTML anywhere specify the number 1, the
number 2, and the number 3. When my web browser reads
this should be an order list, my web browser, Chrome in this case,
just adds those numbers in for me because it knows what
an ordered list means and it knows how to take the HTML that
I've written and display it in the way that I intend to the user. Now, in addition to ordered list
that all have numbers, 1, 2, 3, we also have unordered
lists that are just bullet points, bullet points of information. So I could, up above, add some
more content to this HTML page. I can say here is an unordered list. And just as an ordered
list we represented using the ol tag in HTML, ol
standing for ordered list, likewise we can use the
ul tag in HTML to create an unordered list, u for unordered. So here, we're going to add a ul tag. And again, my text editor
here is automatically adding the closing tag
here, this slash ul, meaning the end of the unordered list. And many text editors will do this
now just so you, the programmer, don't forget to add that. And now inside of this
unordered list, we're again going to have some list items. Also, using the li
tag, here is one item. And here is another item. And here is yet another item. If I go ahead and refresh the
page now, I'm still on list.html, I now see that on top
of my ordered list, I have an unordered list, where
each item instead of being numbered 1, 2, 3, is instead labeled with just
bullet point, bullet point, bullet point, where each of these bullet
points and each of these numbered items is a list item element, or an li. So hopefully now we can
see that as we start to explore these various different
HTML tags and nesting HTML tags inside of one another, we're able to
create more and more interesting web pages as a result. So let's explore now what
other types of web pages we can create using other
types of HTML elements. In addition to lists, one
thing you might imagine is that one of the
important things on the web is not just displaying text, but
also displaying other types of media, like images, for example. So how might we go about doing that? Well, I can, for example-- let's go back into my text editor. Let me create a new file
that I'm going to call image.html, which is going to contain
some code for displaying some images. I'll go ahead and go into hello.html
and copy this text into the page, again, change the title to Image. And now, inside of the body, I'm
going to add a new tag called image. And the image tag has a
couple of required attributes. Remember that attributes are what
we saw before things, like adding a lang equals en to the top of my
page to indicate that this web page is written in English, for example. And the image tag has a couple of
required attributes that I need to add. In particular, when I
display an image on the page, I need to specify what image I
actually want displayed, for example. So I might specify image
src, short for source, is going to be equal to what image do I
actually want to display on this page. And it just so happens that inside
of my folder where I have image.html, I have an image called cat.jpeg. So I'm just going to specify cat.jpeg
as the file name of the image that I want to display. And it turns out that images also
have a second required attribute. In addition to the file name or the link
to whatever image I want to display, I also need to provide some alternative
text, a text-based representation of what you're going to see on
the image because in some cases, some web browser might not be able
to render the image correctly. You might imagine if there's
some error rendering the image, or if someone's on a
slow internet connection, or if someone's using a screen
reader and therefore can't actually see the image. We want some text-based
representation of that image as well. And so I'll provide some Alt
text, some alternative text, that can be used to substitute the
image in case for some reason we can't display the image. And the Alt text that
I'll use in this case is just going to be the
word cat, for example. And that's all I need. Now, notice in particular
there's something a little bit different about this image
tag compared to other tags that we've seen before in the sense
that it doesn't have a closing tag in the sense that the body had
a beginning of the body and an end to the body, our ordered list had
a beginning of the ordered list and the end of the unordered
list with list items in between. It doesn't really make
sense for an image, for example, to have the
beginning of the image and the end of the
image and some content in between, because the image is just
a single HTML element that can't really have anything inside of it. So in that sense, we don't
actually need a closing image tag. The image tag is self-closing. It is its own beginning and end. So we can just say we
want an image to be here that is cat.jpeg with an alternative
text of just the word cat, for example. So now, if I open up
image.html, we'll see that what gets loaded is quite
large, a picture of a cat. And I can scroll around
and see this entire image. Of course, this picture of a cat is
probably larger than I wanted it to be. I probably, when I my
user visits this web page, I don't want them to have to
scroll all the way to the right in order to see the entire cat. So I can actually add
additional HTML attributes in order to modify the size of
the image that I'm displaying. And later we'll see we can use
CSS to do a similar thing as well. But for now, what I can add
is an additional attribute and say that let me give
cat.jpeg, this image tag, another attribute that, in this
case, I'll just call width. And I'll say that width is
going to be equal to 300, because I would like for this image
to be 300 pixels wide, for example. So now, if I refresh
this page, I now see that the same cat image
appears, except now it appears at 300 pixels wide exactly. So I'm able to add additional
attributes, additional information to control how an HTML
element is going to appear. In this case, I want
to control its width, and it automatically
scales down the height to make sure that the image
is proportional as well. Now, on the internet, in addition
to just displaying information on a single page, it's also common
for a page to link to other pages. In fact, that's one of
the main important values of the internet is the
ability to go from one page to another via these links. And so one thing we might
reasonably want to do is add some links to our page,
where if you click on something, you're taken to another page altogether. So let's take a look
at an example of that. I'll create a new file
based on hello.html. And I'll add lang equals
English for good measure. And I'll call this new file
link.html, where here, we're going to practice with building
some links into our HTML page. I'll copy the content of
hello.html again, call this link. In order to create a link,
I'm going to use a tag called the a tag, short
for the anchor tag. And the a tag takes one
important attribute, which is called href, for
hyperlink reference, which is going to specify what
page I would like to link to. So if, for example, I wanted
when a user clicks on this link to go to google.com, then
I'd set the href attribute of this tag equal to
HTTPS://google.com, for example. Then inside of the a tag, I would
specify what text I want to display. What text should the user see such
that when the user clicks on that text they're taken to the web page? In this case, I'm just going to
say something like, Click here, for instance. Now, if I open up a link.html,
this is what the user sees. They see a blue link
that says Click here. And when the user does
click on that link, they're taken to HTTPS://google.com. And it turns out that we can
use this href attribute not only to link to different
websites altogether, but we can link to different
pages on the same website. So, for example, if I wanted
to link to that cat page that I designed a moment ago,
instead of linking to google.com, I could instead just link to image.html. And now, if I save that and refresh,
or if I open up link.html again, now I see a click here link,
where when I click on Click here, now I'm taken to that
page, image.html, that happened to have that
picture of a cat from before. So using these anchor
tags and href attributes, we're able to link
together multiple pages. So that if we have a website that
has many different web pages, we can connect them all
together by using a combination of these various different links. So now that we've seen images and links
and lists, what other HTML elements might we add to our web page? Well, one thing we might
want to add are things like tables, just other ways
of displaying information. So let's go ahead and create a
table and look at what HTML elements we can use in order to do so. So I'll go back here to my text editor,
create a new file called table.html. Using the same starting HTML,
we'll call this page Table. And inside the body of
this page now, there are a number of different
HTML elements that we'll need in order to create a table,
because as you might imagine, a table is really composed
of multiple parts. We have our big table. But each table is really just a
sequence of individual table rows. And each of those rows
is really just a sequence of individual cells of
data within that table. And so that structure that we're
imagining, a table that consists of individual rows, where each
row consists of individual cells, is exactly how we're going to
represent this table in HTML. We're going to start
with just a table tag. That's going to represent
the entirety of this table. But inside of the table, we
might have different parts. We might have the heading of the table. We might have the body of the table. So in order to represent
that, I'll add thead. That's going to stand for
the heading of the table, the stuff at the top
of the table that might indicate what each column of
the table means, for example. And let's see, what columns do I want? Well, let's go ahead and
add some table headings, which I can represent using
the th tag, h for heading. And maybe I want in this web
page to display information about various different
oceans, for example. So maybe I have one column for
the ocean and another column, another table heading, for the
average depth of that ocean, and another table heading for
the maximum depth of that ocean. And that'll be the very first row of
that table, the heading of the table. But in addition to the
heading of the table, we also have the body of the table. So underneath the thead,
I'll go ahead and include tbody, body for the main part of the
table where all my data is going to be. And that body is going to consist
of individual rows of a table. So I might have a tr, which
here stands for table row. And inside of this table row, we'll
go ahead and add some individual data points inside of the table. So inside of my table row, I'm going
to have one table data point, or td, for table data, that says Pacific
Ocean, for example, then another table data that says 4,280
meters, and then another one for the maximum depth of the Pacific
Ocean, which is 10,911 meters. And, in fact, these
three table heads as well at the top of the page, the ocean, the
average depth, and the maximum depth, those should actually probably
be in a row of their own as well, because the very first part
of the table, that is also a row. So I'll go ahead and add a tr, short
for table row and inside of that tr put these headings. I'll go ahead and add one more row just
so we can see what this looks like. And then, we'll take a look at the
page and then go back to this code. I'll add the Atlantic Ocean, too, which
has an average depth of 3,646 meters, as well as a maximum depth
of 8,486 meters as well. So when I open up table.html now,
here's what I'm going to see. I'm going to see a table-like
representation of the data. It's not just one thing after
another after another anymore. It's structured in a table. Now, granted, there aren't any borders. And I could probably add
some colors and spacing to make this look a little bit nicer. But I see three columns-- ocean, average depth, and maximum
depth, where this very first row is what we might call the
table header, the very top of the table that's defining
what all of the columns mean. Inside of that table header
is a single table row that has three table data cells-- ocean, average depth, and maximum depth. Then beneath this table
header, represented in bold, is the table's body, or
the tbody element, inside of which we had two rows, one for
representing the Pacific Ocean, one for representing the Atlantic Ocean. And then we had data cells
in each one of those rows for representing each of the individual
cells that's located within this table. So this is what that page
ultimately looks like. And let's take one more
look at the HTML just to get an understanding for how all of
these tags interact with one another. And no need to memorize all
these tags right now, slowly as you begin to design
HTML pages, you'll start to get more familiar with
what HTML tags are available to you. And certainly, all of
these HTML tags are things that are easy to reference
if you need to look them up. It's very helpful to be
able to look up something like, how do I create a table in HTML? And then you'll be able to see what
the various different tags you'll need to add are in order to generate
the table that you're looking for. But, again, just to recap, here, we
have a table element, inside of which are two child elements, thead and tbody. Inside of each of those are one or
more table rows, representing using tr. Inside of each of those are three table
data cells, representing using td. And so using these nested
tags, elements inside of elements inside of
other elements, we've been able to build something far more
complex than just a bulleted list. We've been able to build an entire
table that has information as well. But ultimately, our web pages
should be web pages that don't just display information,
but that also let users interact with that
information in some way. For example, you might imagine that
on Google's home page, for example, it's not just unchanging. There's a field where I
can type something in. And anytime users can
provide input to a web page, we generally call that
a form, or some place where a user can fill
out a form in order to provide information to the web page. And so now, let's take a
look at how we can use HTML in order to create a form that's
going to display some information. So I'll go ahead and create
a new page called form.html, again using that same HTML as before. We'll call the page Form. And inside of the body of
this page now, let's say that I want to create a form that gives
the user an opportunity to provide their full name, for example. How do I do that? Well, the first thing, I need is a
form element, some way of saying, here is going to be a form. And now, inside of that form, what
are the various different parts of the form? Well, there's really two parts that
you might imagine to this form. One is a place for the user to
actually type in their name. And they probably also need some way
to submit the form, some button that just says submit, such that
they can click on that button in order to submit the form. So how would we do that? Well, in order to create
an input field, we're going to use an input tag, who's type
in this case is going to be text. There are a number of
different ways that users might provide input to a form. They might type in text. They might choose from a dropdown menu. They might choose from
a radio button option. Or they might provide input as by
clicking on a button, for example. In this case, we're specifically
using the type attribute to say that when the user is
providing input in this way, the type of input that they're providing
is going to be some kind of text. Then, we might provide a
placeholder, some default text that's going to be inside of that
input field the first time the user looks at the page. So, for example, the
placeholder might be Full Name. That way the user knows that what
they should type into this placeholder is their own full name. And then finally, we're going to go
ahead and give a name to this input field. Now, this isn't going to be
something that the user sees when they visit the page. But anytime you submit a form, when
we receive that forum in our web application-- something
we'll explore later on-- we need some way of knowing which input
field corresponded to which value. And so we're going to name
each of the input fields just so that later on we'll
be able to reference them. And, for now, since the user
is typing their full name here, we could just name this full name. Or we could more succinctly just say
name as the Name of this input field. After that, we have an input field
where the user can type in their name. And now, we need some way for the
user to be able to submit this form. So we might say something
like input type equals submit to say, here's a way for
the user to submit the form, type equals submit means. This is how they're going to submit the
form when they're done completing it. Now, if I open up
form.html, this is the page that we're ultimately going
to see when we load this HTML. This entire page just
contains a single HTML form. But that HTML form contains two parts. The first part was
this input element here that allowed an opportunity for the
user to type in their full name. They type in their full
name into this input field. And when they're done, they
can click this Submit button to indicate that they would
like to now submit this form. Of course, right now, this form isn't
going to do anything when we type in our name and click Submit, because
we have an added and a logic in order to handle this form. But later on, as we transition into
the world of building web applications using Python, we'll see
how we can design a form, such that after the user submits it,
we save information to a database or display some sort of
results back to the user, all by using the power of
building these web applications and connecting them to
these sorts of HTML forms. And HTML forms can actually
get quite a bit more complex. We'll take a look at another example. For instance, let me
open up form1.html, which is a form that I built in advance,
which shows a number of other ways that users can provide information
as input to an HTML form. Here, we see an input
whose type is text, meaning we want the user to
type in their name as text. But you might also imagine that if
a user is logging into a website, for example, they might in addition to
typing in a text-based name or username or email, also provide a password. And generally, if you've been on a
website and you've typed in a password, the password characters don't all
show up as the actual characters. For security reasons, they generally
show up as just little dots on the screen hiding the actual
characters that they're representing. And in HTML, we can do
that very easily by just saying that the type of
this input is password. If they're typing in a
password, our web browser will know not to actually display
those individual characters. In addition to just text-based input,
we also have radio button input, as I alluded to a moment ago. So here, we have a number
of different radio inputs, where the user might be able to
select from a number of options, choosing their favorite
color, for example, from a number of these options. And finally, just to take a look at
one other additional feature of HTML5, in fact, a new feature
of HTML5, is something we might call a data
list, where we might have the user choose in a dropdown
from a number of different options. But we want to very quickly filter down
or autocomplete based on those options. So if the user needs to select what
country they're from, for example, we might have an input
field and specify that it's going to be associated with
a list called countries. Then immediately below that I
have a data list element whose ID is countries, where here,
I'm going to specify these are all of the options for
what country we could have. Each one is inside of an
option element whose value is whatever country they could select. And we have all of the countries of the
world listed in these option elements. So this input here is going to allow me
to select one option from a list of all of these possible options. So now, if I open up form1.html. Here's what that form
ultimately looks like. I can, here, inside of the name field-- again, that word name shows up,
because it's the placeholder-- I can type in my name here. And inside of the password
field anything I type is going to show up as
just little dots instead of the actual characters, because the
type of that input field was password, instead of the type being text. In favorite color, I
now have the ability to choose between various
different favorite color options. In a radio button format, I choose
from one of a number of options. And finally, inside
this country dropdown, I have the ability now when I click
on it to see all of the countries, but as I start to type
letters, like u-n-i-t, it filters down to only the
options that I actually care about. So here if I type in enough letters,
eventually I see United States. And I can click on that option as well. So HTML5 builds in these
additional features to make it easy to implement something
like a text field, where it will auto complete based on the
text that you provide. You can just specify that it
is inside of this data list and then provide a list of
all the possible values. And then HTML and your
web browser in turn will take care of the process of
rendering that information in the way that you expect it to be displayed. So those are just some of
the possible HTML elements that we can ultimately create by
using these various different elements that we nest within each other. And there are definitely
other HTML elements that exist as well that
you can begin to explore. But all of them follow
a very similar pattern that we're going to have
some tag, that might require some attributes, additional
information about the HTML, to give context to the web browser for
how that element should be displayed. Maybe that element needs to have
a particular source for an image. Maybe it needs a link in order to link
to somewhere, or other information as well. And then inside of that element,
you might nest other elements. So that your table has rows. And inside of those rows,
we have other cells. And you might imagine
nesting elements inside of other elements inside
of other elements. But right now so far, all of our
web pages have been rather simple. They've just been-- we've described
the structure of the page, and we've described we want a
list here, we want to form there. What we might really like is
some way of specifying that we want to style our web page in some way. We want to add color. We want add spacing. We want to add some sort of
other layout to our page as well. And in order to do that, we're
going to use a second language that we're going to call CSS,
short for Cascading Style Sheets. In particular, we'll
use the latest version of CSS, CSS3, which gives us
the ability to take an HTML page and tell the web browser how
we would like it to be styled. Instead of just black text in the
same font on a white background, we can begin to specify
particular CSS properties of how we would like this page to look
to make sure that the page looks the way we want it to. So let's take a look at a
simple example now of CSS to take a look at how we can
add some CSS code to our page. So I'll go ahead and create a new
file that I'll call style.html, just to demonstrate some basic ideas
of adding some style to our page. And we'll go ahead and copy the
same hello.html from before. And maybe in addition to hello world,
I display in h1 some big heading at the top that says like, Welcome
to my web page, for example. So now, if I open up,
style.html, this is what I see. I see a big heading at the top
that says welcome to my web page, beneath which is just
the text, hello world. And now imagine that I
want to add some style to this heading at the top of the page. Maybe instead of being left
aligned, I want it to be centered. Maybe instead of just being black
text, I'd like to change the color. In order to do that, just
as we've used attributes in the past to add additional
information to this particular HTML page, we can do a very
similar thing with CSS. We can specify that we're going to
give this h1 element a style attribute. And that is going to be equal to. And then in quotation marks, we're going
to provide all of the CSS properties that we would like to add
to this particular element. So the way that CSS styling works
is that we can give elements individual CSS properties,
where a property is something like the color of the element
or the alignment of the element. And each of those properties
has a default value. But we can change its
value to something else. So if, for example, I wanted to
change the color of this heading, so that instead of a black heading,
it displayed as the blue heading, I could say for this h1, I would
like to give it a color property. And then to give the
color property of value, I say color colon and then the value
that I would like to give to it. So color colon blue, for
example, followed by a semicolon will change the color of
this h1 element to blue. And my text editor is
automatically showing me a little square that shows me
what this color blue is actually going to look like. This isn't part of the text. It's just my text
editor being helpful so that I can see in advance as I'm writing
this code what the color is actually going to look like. So now if I open up
style.html, here's what I see. Instead of a black heading at the
top, we've changed the color to blue. And there are many other
built-in colors that exist within HTML that we
can use in order to change the color to whatever we want. If instead of blue, I said
I want the color to be red, for instance, I can refresh the page. And now, the heading is red. And there are many other colors. I can change the color to like
spring green, for instance. And that's going to
be a particular shade of green that displays just like this. And so now, we have the ability
to add various different style properties to individual elements. I can say take this heading
and change its style so that the color instead of being black
is going to show up as blue instead. And if I want to add multiple CSS
properties to the same HTML element, I can do that as well. Here in the style attribute,
I can say that in addition to saying that the color is blue,
I'd like to give a second CSS property to this element. I'd like to say that the text align
property should be center, for example. The text align property
controls, as you might imagine, how a particular HTML
element has its text aligned. Is it all the way on the left, all
the way on the right, or centered? And if I change the text align
property to have a value of center, well, then now, when I refresh this
page, I see that Welcome to my web page is now both blue, and it's centered. I've changed the color, and
I've changed the alignment of this particular element. And HTML elements don't need
to just be styled directly. They can also get their style
information from parent elements. So if you recall again
that DOM structure, where we have an HTML element inside
of which is this body element and inside of the body element
is this h1 element and this text, you can imagine if we
wanted this styling to apply not just to this heading,
but also to the Hello World text, I could move the styling information,
move this style attribute, change it from the h1 and
escalating it to this body. And if I move the style to the body,
then everything inside of the body is going to be styled in that way. So let's now take a look at an
example of that to see how that works. If I take this style
information, and I move it so that instead of
associating it with the h1, I instead associate it with the body,
then now, when I refresh the page, I see that both parts of the
body, both the big heading at the top that says,
Welcome to my web page, as well as the text, Hello World, both
have those CSS properties applied. I've changed their color to blue. And I've also changed
their text alignment to be centered instead
of just left aligned. But if I do want it to
just be that heading, then I can move it out
and say that I just want to apply the style to
that one individual heading. Now, one thing that we might imagine
might become a problem over time is that imagine if I had
multiple headings that I wanted to style in the same way, for example. Let's say I have a second heading that-- this is a second heading-- that I also want to be styled
as blue and centered as well, I can refresh this page and see
that right now that is not the case. And I don't want to make the
entire page blue and centered. I only want these two headings
to be blue and centered. So what I could do is I could just
take this style code from the h1 and apply it to this h1 as well,
so that both of my h1 elements now have the exact same style code. And I'll go ahead and refresh this. And now, we see this is
the intended behavior. I have two headings, both of which are
centered and both of which are blue. But what we want to start to think about
as we start to build web applications, and especially as our web applications
start to get a little bit more sophisticated, is to
think about the design of how we're building
our web pages and how we're building our web applications. And in particular,
anytime we find ourselves copying a lot of the same
information from one place to another, that's probably
not the best design. And you should start to
think about how might you design this a little bit better. It's not great design,
one, just because there's some redundancy that probably
doesn't need to be there, but also because it makes
the page a little bit more difficult to change and add a
little more difficult to update. If I instead want to change
both of these headings to be red instead of blue,
then all of a sudden, I need to change my code in two places. I need to change the style attribute
on this first heading up here. And I also need to change
the style attribute on the second heading down there. What I'd like to do
is to somehow just be able to write the style
code once and then have it apply to both of these headings. And, in fact, there is a way to do that. What we can do is instead of doing
what we might call inline styling, where we take the CSS
code and place it directly as an attribute of an HTML
element, we can move our style code to an entirely different
part of the web page. Recall again that at the
top of our HTML page, we have this head section
that just includes information that's useful
to know about the web page, but isn't actually part of the
body of the web page, the content that the user sees. This head section is
a great place where we can begin to put some style information,
information about how we would like for this web page to be styled. So what I can do here is
instead of putting these style attributes inside inline
with these HTML elements, I can inside of the head
section of my web page add a style element, where in between
the opening style tag and the closing style tag, I can add any of the
style information that I want. And here's the way that
syntax is going to look. I first need to specify, what types
of elements am I going to style? And in this case, I want
to style all of the h1s. So I can just say h1. And then all of the style
code is going to go inside of a pair of curly braces, where I can
say I would like the color to be blue and I would like the text
align property to be centered. So now, here's what I've done. I've taken the CSS code that used to be
down here inside the body of the page actually as an attribute
of these h1 elements. And I've moved the style-related code to
a different part of my page altogether. Now, the style information is
inside the header of my page, inside of the style element, where
I've said for every h1 element, here's how you should style it. The styling is in between the opening
and curly closing braces here. And I've said that every h1
should have a color of blue. And every h1 should have a
text a line property of center. And that is then going to
apply to all of the h1 elements that my web page happens to find
inside the body of my web page. So there's a couple of advantages here. Advantage number one is what
we talked about a moment ago. I don't need to duplicate the same
code in both of these h1 elements. I can write at once and
say, apply this styling to all of the h1s that
show up in the page. An advantage number two is we've
been able to factor out the style code to somewhere else, just to
make it a little bit cleaner. So that instead of having a really
long line, you might imagine, if we had not just two, but maybe
five or six or seven different CSS properties, that would have taken
up a lot of space on one line. I can instead in a more
readable, more organized way, move that style-related
code to the style element at the beginning of the page
just to make it easier to read, easier to visually understand, and just
to clean up the body of the web page as well. And that's going to be another
of the key themes that's going to come up again and again in this
class, this idea of separating things out so that every piece can sort
of be independent of one another. Our structure of the web page inside
the body is separate from the style. And we'll see the same sort of idea
appear again and again, as we begin to try to design web applications well. So now if I take this exact same page
and go ahead and refresh style.html, we'll see that we see
the exact same thing. Both of the headings
still show up as centered. Both of them still show up as blue. But now we have the
advantage of having only written the style code once instead of
needing to write the exact same style code multiple times in the same way. But it turns out that we can
even do a little bit better than this, because one
thing you might imagine is that if I have a web application or a
website that has multiple different web pages, it's probably going to be
likely that each of those web pages might need to be styled in similar ways. If I have a big banner at
the top of one web page, then in other pages
related to that page, I might want the same banner,
styled in the same way, using similar style information. And right now, our CSS code is
specific to one particular page. And it's not going to be easy
to then take that same styling and apply it to another page. If I wanted to, I'd need to
copy the exact same CSS code, put it inside of another page. But then we run into the
same problem of duplication, where I've now had to repeat myself
across multiple different pages, putting the exact same CSS code
across all those different pages. So there is an improvement we can make. And the improvement we can
make is to take that CSS code and just move it to an
entirely different file. So instead of putting this style
code inside of a style element inside of this HTML page,
I'll just create a new file that I'll call styles.css, inside of
which is going to be all of the CSS that I care about. I want to take every h1, I want
to change its color to blue. And now, I want to change its
text align property to center. And now, inside of my HTML page, I no
longer need to include any CSS at all. Instead of this style
element altogether, I can just link my CSS code in
that CSS file, called styles.css, to this particular HTML page. And how do I link the styles.css file? Well, I can do so again in the
head section of my web page using a link tag, where I
can say I'd like this link to be the relationship is it's
going to be a style sheet, meaning what I'm about to link is going
to be a style sheet for this page. It's going to describe how I want for
the elements on this page to be styled. And then, just as in the case
of a link to another page, I use href to specify a hyperlink
reference, what I want to link to, I'm now going to specify
using an href attribute what CSS file I would like to know link. And in this case the CSS file that
I'm going to link is styles.css. That is the file that just so
happens to contain all of the CSS that I would like to apply
to this particular file. Now, if I refresh the page, I
see again nothing has changed. In the last two revisions, the
page has stayed exactly the same as far as the user is concerned. They still see two headings. Both of them are centered. Both of them are blue. But now, the advantage
is that here is my HTML. It's shorter than it was before. And in particular, there's no CSS that's
baked in to this HTML file at all. I factored it all out into
the separate styles.css file. And now if I have multiple HTML files
that are all using the same styling, I can just link them all
to the same styles.css file, such that they're all
using the same style information. I don't need to repeat myself. And if ever I need to make a
change across all of those pages, I just change the styling once. I change the styles.css file. And then all of the web pages that
are linked to that style sheet will update as well in order
to reflect those changes. So again, we've been able to factor
out some of this style information to a separate file just to make
our lives a little bit easier. All right, so so far
we've now seen how we can CSS in a number of different ways
to add some basic styles to our page. We've seen that we can take an
element and change its color. We've seen how we can take an
element and change its alignment, move it from left aligned to right
aligned to centered, for example. As it turns out, there are a
lot of different CSS properties that we can add to our
HTML elements in order to style them in various different
ways, more than we'll have time to talk about in this lecture. But now, let's just
take a look at a couple of the most popular, most
common CSS properties that we can add in order to make our
web pages look the way we wanted to. And one of the most
powerful tools for CSS is controlling the size of
various different elements. By default, HTML just used a default
size for everything on the page. But if I want to more precisely control
how big any particular element is I can use CSS in order to do so. So let me now create a new file
that I will call a size.html. We'll start with the same HTML
code and call the page Size. And now, inside the body
of my page, let me just have a vertical section of my
page, just some section of my page that's going to have some content. And I'm going to put
this inside of a div tag. Now, this is the first time
that we've seen a div in HTML. You can think of a
div as just a division of the page, some section
of the page that's going to have some content inside of it. And we use divs because it makes it easy
to reference a particular div or nest information inside of other pieces
of information, or just to divide and break up our page into
multiple different sections. Here, inside of the body,
I'm just going to have a single div that is going to
say something like hello world. And now, I'm going to add
some style to this page in order to control
the size of this div, to control the size of this
section of my web page. I could use inline styling. I could factor things
out into another file. But since I'm only dealing
with one file for now, I'm just going to add a style
section to the top of my web page just so you can more clearly
see how the style of this page is going to map on to the way that
we're modifying these HTML elements. And I would like to style
this div in a couple of ways. One thing I can do is give
the div a background color. Let me change its background
color to blue, for example. And then I can say, all right,
I'd like to give this div a width and a height, some size information. I can say, go ahead and give
this div a width of 100 pixels and maybe a height of 400 pixels. So now, when I go ahead and open
up size.html, this is what I see. I see in a 100 by 400 pixel
wide vertical, or rectangular, section of my page, I see
the words Hello World. And so you might imagine if you
have multiple different elements on your page, as your web pages start
to get a little bit more complex, you probably want to have some
more precise control over how wide or how tall any particular element is. And these width and height
attributes can be very helpful because I can very easily change
the width to say like 500 pixels, for example. And now when I refresh the page, now
I see that the width of this page, or this div, the section of the page,
has actually now gotten a lot wider. And so we have the ability
to control size using CSS. Go ahead and can close some of
these pages that I no longer need. And now take a look at some
other things that we can do. In addition to controlling
the size-- and let me change this color to
something a little bit lighter, something like orange, such that now
if I open up size, it looks like this. I'll make this a little bit smaller. Let's try 200 by 200 pixels. It looks now like this. You might imagine there are some other
changes that I might like to make. Like this Hello World, for
example, is very close to the edge of this particular div. It's right up against the
upper left corner of that div. I might want to change
that by adding what we might call some padding to this
particular HTML element, some space, just so that the content
of the element isn't so close to the border
of the element itself. So, for example, one thing I can do
is inside this div add some padding. Say maybe I want 20 pixels worth of
padding on the inside of the element, such that now when I
refresh the page, we see that we have some padding
along the outside of the element. So that Hello World now
shows up not right up against the edge of the element,
but inside a little bit as well. And if we have a particular
HTML element that maybe is too close to
the edge of the screen, maybe it's too close to
the top of the screen, we can also add space around
outside of the element by adding what we call margin
to the element as well. So I can say let's give it 20
pixels of margin inside of this div. And then refresh. And now we see that whereas
before this div was very close to the upper left edge
of the screen, now we've moved it 20 pixels
away from everything. So it's got some space
on all four sides of it. So that's how we can now
use margin and padding just to make the page look a
little bit nicer to the user. So objects are not too close
together or too far apart. Padding, again, is on the inside
of the border of the element. I can add 20 pixels of
padding, for example, to make sure that the content
inside of the element, in this case, the words Hello World,
just have a little bit of space from the border. And that's padding on the
inside of the element. Margin, meanwhile, is on
the outside of the element. We add some margin along the
outside of the border to space the element out from
other elements that might be nearby it to make sure that there's
enough space between the border of the element from the top of
the screen and also from the left and also the bottom and the right,
though there's no objects there that we're currently
creating space from. So by combining width and
height and margin and padding, we now have the ability,
using CSS, to make sure that we're able to layout our page
the way we want to lay out the page, so that elements have the right
amount of spacing from each other and are the correct size. So now, let's take a look at some other
features that CSS is going to give us. In addition to just changing
where particular elements are, like centering text or adding
size and margin and padding, we can also use CSS to change
how elements actually look. We've seen it to change the color
of text, changing it from one color, like black, to another color, like blue. But we can also use CSS to be able
to change something like the font that we use in order to display text. Modern web pages don't show
everything in the exact same font. Usually, some designer
is choosing what font they want for any particular web page. So let's experiment with
those possibilities. I'll now create a new file
that I'll call font.html, inside of which will be
an HTML page called font. And inside the body, I'll
again just have a div that says Hello World, same as before. But now, inside of the style tag here,
up in the head section of my web page, I would like to add some
font information to this div. And in particular, there are a number
of different font-related CSS properties that I can add to control the font
of any particular HTML element. One thing I can specify
is the font family, specifying what font would I like to
use in order to display this text. And maybe I want to display
it in Arial, for example, which is a common font
used on the internet, such that now if I open up font.html, I now
see in Arial the words Hello World, different from the text
that I was using before. You can also specify
multiple different fonts. Not all computers support all fonts. So I could specify that just
in case Arial isn't supported, fall back to any sans serif
font, any of the fonts that don't have the little glyphs at
the edge of each of the characters. So now, if I refresh the page,
because my web browser supports Arial, I don't notice anything different. But you might imagine if you're using
more complex fonts that not all web browsers have or support, you
might add some backups just in case the font you want
isn't actually available. In addition to a font
family, I might also specify a font size, how big I want
the font to be inside of this div. So I can specify that I'd like the
font size of this give to be, you know, 28 pixels, for example,
such that now I refresh it. And now, this div appears
using larger text. And I can also, just
as like text editors let you specify whether you want it
to be normal text or bolded text, I can specify a font
weight for this div and say that in addition to being
in font Arial in size 28, I would also like for the font to
be bold, such that now I refresh it, and now, the font shows up as bold. And using these CSS style sheets,
we're able to selectively apply the styling to only particular
parts of the web page. If I have another underneath this div
some more text down here, for example, that additional text
that's outside of the div isn't going to be affected
by the CSS styling, such that now if I refresh this
page or some more text shows up in that same standard default
font provided by my web browser and not the custom font that I have
specified to apply to only this particular part of the HTML page. So that now is the ability
to add fonts to our page too. Another thing that we
might want to do is to be able to add some sort of
border around our HTML elements. So maybe I want a line to be able to
separate this entire part of the page from another part of the page. So I could add a border by
going to this div and saying, let me give this div a border. And maybe I want the border to be
like a 3 pixel solid black border, for instance. I can specify how big I
want the border to be. I can specify whether I want
the border to be a solid line or a dashed or dotted line. And I can specify what color I would
like that border to be as well. So now, when I refresh
this, I now see I have a border around this
entire section, around this entire div, inside of my web page. And you can imagine these
borders being helpful for styling various different parts of my page. So, for example, if we
go back to that table that we were looking at a moment ago
when we were dealing with oceans, where I had Ocean and Pacific
Ocean and Atlantic Ocean, this is structured in
the format of a table. We have rows and columns. But it doesn't look great right now. I might like to add
some styling in order to improve the way that this
table looks, for example. So let's give that a try. I'll go ahead and go
back into table.html, that HTML file I was using
before where I had this table. And let me now add some style
information to this table. I might say that for
this table I would like to give it a border that is maybe
a 1 pixel solid black border, such that now when I refresh the page,
I have a 1 pixel solid black border around the entirety of the table. All right, that's great. But I also really wanted a border
in between the rows and the columns as well. In particular, every
table data item, I might like to have some additional
CSS supplied to those too. So I might say for
every table data cell-- again td stood for table
data, and those were the individual cells within my table-- I might specify that I
would like those to also have a border that is 1 pixel
solid black, such that now I refresh the page. And now, each of my table data
cells also has a border around it. Now, this applied to the table
data cells in the body of my page, but it didn't yet apply to
these cells up in the heading. And that's because those were
th elements, table headers. And so here, we have
a couple of options. I could specify, once
more, table headers I would like to give a border
of 1 pixel solid black. But when I do so, you'll see that it
does create a border around those table headers. But again, one thing that
should be crossing your mind now is that there's a fair amount of
redundancy here, some repeated style code that shows up in
multiple different places. Table data cells in the
body of my page, I really want to be styled in a very
similar way to table header cells. And so it'd be nice if I could somehow
consolidate these two different CSS selectors, these ways of me saying,
style table data, style table headers. I'd like to combine them into one. And you can, in fact, do this in CSS. There are a number of different CSS
selectors, ways of choosing elements. And one of them is just called
the multiple element selector, that if I want to select both
table data cells and table headers, then I can do so by saying td comma
th and delete these three lines down there. What these three lines
are now saying are that I would like to style
all table data cells and table headers in the same way. And I could even combine table
if I wanted to for good measure. But I'd like to give all of them a
border of 1 pixel solid black, such that now I refresh it and now I see that
they all have this border around them. Now, most tables you see on the internet
don't have both a table or a border around everything on the
table and also a border around each of the individual cells. Usually, those are collapsed
just into a single line. And it turns out that CSS has an
easy way for you to do this as well. I can add a CSS property to the table
called border collapse and just say, I would like to collapse all
of the borders in the table. Just going to show you there are many,
many different CSS properties, far more than we'll be looking at today. But they're easy things to
reference, that you can easily look up how to collapse
borders in a table and then find a CSS property like
this that you can then use and apply to your web page. So now I refresh that. And now I see that I have a border,
just a single border, around all of the cells in this particular page. Next, what I might like to do, though,
is like add some space around here. Like it seems like this text is very
tight against the border of this table. So in order to do so, I
want to add some spacing. And recall again, do I
want margin or padding? Margin is spacing around side of the
border of a particular HTML element, whereas padding is inside of the border. So if I want some space
inside of the border, just to space out the text from
the border itself, then what I want is padding inside of
all of my table cells. So I can say let me add
5 pixels worth of padding inside of all of my table data
cells and table header cells. Refresh the page. And now, here's what the
resulting table looks like. Just by adding a little
bit of CSS specifying what border I want around
the edge of the page, specifying a little bit of padding
inside of each of the cells, my table now looks a whole lot nicer
than it did just a few lines of code ago when I just had the HTML
structure of the page and not the CSS to describe how I actually
wanted that page to be styled. And notice again that
in doing so, we were able to use one of these CSS selectors. I was able to say that I wanted to use
the multiple element selector, which is just this comma here, to specify
that I would like to apply this styling, not just to td's but
also to th's as well. We'll take a look at some
additional examples of CSS selectors in just a moment. But next, let's turn our attention
to some more tricky instances where we might want to apply styling
to multiple elements at the same time. Let's imagine-- and let's go back to
style.html, where we had some style code, where I had one heading. I'll call this Heading 1. And let's get myself to other
headings, Heading 2 and Heading 3. All of these now are h1 elements that
are going to show up the same way, such that now if I style and say, I
would like all h1s to show up with a color of blue, then when I open
this page where I have three h1 tags, each of which has a color of
blue, when I open up style.html, what I'm going to see
is something like this-- three headings, each of which
happens to have a color of blue. But what would happen now if I wanted
to style only the first heading. I want Heading 1 to be blue. But I don't want to style
Heading 2 and Heading 3. How do I do that? Well, one thing we could do is
go back to the inline styling we did a moment ago, where inside
of h1, I said style color is blue. And that would say for just
this very first heading, I would like that to be blue, but
not the other elements at all. But this again we decided
was not the best design. This inline styling, commingling of HTML
and CSS just gets a little bit messy. And it would be nice to be able
to factor all of our style code to a separate part of
the page altogether. So how do we do this? Well, we need some way to uniquely
reference this particular HTML element. And in order to do so, we
can given HTML element an ID. An ID is just some unique name
we give to an HTML element, so that we can reference
it more easily later on. Let me just go ahead and
give this an ID of Foo. It could be any idea you want. But Foo is just a generic name here. And now, we've given this heading a name
such that in other parts of our page or in other code, we can reference
and find this particular HTML element. And in particular now, in the
style section of my web page, instead of styling all h1
elements, I only want to style the element that has an ID of Foo. IDs are by definition unique. There can only be one element in
this page that has an ID of Foo, otherwise it's not valid HTML. And so in order to do so,
we're going to use #Foo. The hash mark symbol is just CSS's
way of selecting just something with a particular ID. So instead of just h1 for
selecting all of the h1 tags, if I want to select
something by its ID, I say #Foo to say only style the
element that has an ID of Foo and give it a color
of blue, for example. So this style code now will find
something with a particular ID and give it a style
to correspond with it, such that now if I reload this
page, only Heading 1 is styled. Heading 2 and Heading 3 are not. I've been able to name Heading 1,
give it a name of Foo, an ID of Foo, and then in my style code, just style
that particular part of my HTML page. Of course, what if I wanted to style
multiple, but not all of the headings? Like maybe I want to style
both Heading 1 and Heading 2. Now, I could use a second ID. Maybe give us an ID of Bar, for example. And then style both the element with
ID Foo and the element with ID Bar. But now we're starting
to add IDs unnecessarily. I have too many different names. Things can start to
get messy, especially as my web pages start to get bigger. So while IDs are a way of giving a
name to an HTML element that is unique, sometimes I want to give a name to
an HTML element that is not unique, some name that can apply to
multiple different HTML elements. And when we do that,
we call that a class. An ID is a way of giving a
unique name to an HTML element, while a class is a way of giving
a name to an HTML element that might not be unique. It might apply it to zero or one or
two or more different HTML elements. So here's what that might look like. Instead of giving each of these
h1s an ID that's different, I can give each one a class. We'll give this a class of Baz,
again, just another arbitrary name that we've chosen. And I'll give this each
one a class of Baz as well. They both belong to the same
class called Baz, in this case. And now, inside of my style code,
I would like to say just the style the elements that are of class Baz. And just as we have a
special symbol, the hashtag, for styling definitely
something with a particular ID, to style everything with a
particular class, I can use a dot. So dot Baz, in this case, is going
to style only the elements that have a class of Baz. So here, I can now say, take all
of the elements with a class of Baz and go ahead and give
those a color of blue. So now, I have two h1s
that belong to class Baz. The other h1 does not. And I've styled only the
things that are of class Baz, such that now when I go back to the
page and refresh the page, my first two headings, those do get styled as blue. But the third heading
does not, because I've applied a class to these two
elements that does not get applied to this third element there. So oftentimes, it can
be very helpful if you have to start to design
larger web pages where you have multiple different
elements, some of which might be styled in some ways and other
elements that might be styled similarly to one another, you can add IDs
and classes to your HTML elements just to clean up the way
that you write your CSS, to be able to very specifically
pinpoint one element that you want to apply a style to or to apply
styling to the entire class of elements as well. Now, one tricky thing
you might imagine now is that now we have multiple ways of
referencing the exact same element. So, for example, if
you imagine that I just had a single h1, which had an ID
of Foo, for example, that I've named Foo, what would happen if, for
instance, I said all of the h1s I will like those to be colored red, and
all of the elements with an ID of Foo, or the only element with an ID of Foo,
I would like that to be colored blue? What might happen then? These would seem to be
conflicting, where now suddenly we have an h1 style tag that is saying
I should style h1s in this way, but I should style element
Foo in another way. So what happens if I have an h1 whose ID
is Foo, how do I choose to style that? And in order to deal with
that we have to start to deal with the CSS problem of
specificity, of what happens when I have multiple different CSS selectors
that could apply to the exact same HTML element? And this often happens when we start
to add IDs and classes to our elements as well. So when we deal with specificity,
specificity goes in a particular order. There's an order of
precedence that we can follow for determining what
style should ultimately be applied to any particular element. The first, most powerful-- most specific way of referencing an
element is inline styling, literally adding a style equals
attribute to our HTML elements in the way we did way
at the beginning when we were first taking a look at CSS. If we associate inline styling
with an HTML element, that's going to take precedence over any
styling that's inside the style section of our head of the web page
or inside of a separate dot CSS file, because the reasoning goes, if you
are literally putting the style code attached to the element
itself, then we probably want to apply it to that element. After that, specificity goes
in order of how precisely we are identifying an element. An ID is a unique way
to identify an element. There is only one element
with that particular ID. So if I've added style
to a particular ID, that is going to be pretty highly
valued in terms of how specific it is. Next, we look at classes. So if there's no ID
selector, we look for, did we reference the
element by its class? And if so, then that
takes next precedence. And otherwise, then we fall back
to what type of HTML element it is. Is it an h1? Is it an ordered list? Is it a table? So in short, the type
is the least specific. Class is slightly more specific. ID is more than that. And the most specificity we can provide
is by literally putting the CSS inline with the HTML element itself. So let's take a look
at an example of this. Let's look at this code, for
example, where, for instance, I have a div, whose ID is Foo, inside of
which I'm just saying the word hello. And the CSS code that I've included
here is I've said for all div, I would like to give
those a color of blue. Obviously, in that case,
there's nothing conflicting. What we're going to see is we're
going to see the word Hello. And we're going to see
the word Hello in blue. But what happens now if we add anything
with ID Foo should be colored red? Well, because ID has higher specificity
than just an individual tag, well, then next, what we're going to say
is that this Hello is going to show up is red. The ID is more specific. And so this element is going
to show up red instead. And it doesn't matter
what order these are in. It's not that the later
one takes precedence. If I were to flip these around, where
ID of Foo, color red, div color blue is in that order, it's still going
to show up as red, because this ID selector is more specific than just the
name div, which is the name of the HTML element that happens to be there. And so as you start to develop
more sophisticated style sheets, you might find that
some of your CSS code is going to conflict with each other. And that's where it's important to
bear in mind how these specificity rules work to know as you
add style to your elements how are they actually
going to end up showing up. Now, we've seen a
couple of CSS selectors now in terms of selecting a
single element, selecting an ID, selecting a class, selecting
multiple elements as well. It turns out, there are a
number of other CSS selectors that we can use too. So we saw, for example, the
multiple element selector, like td comma th for selecting
table data but also table headers. But there's a number of other selectors. Here is just a sampling of ones. You can specify like
descendants or children. So if I only want to style
divs that are inside of tables, or I only want the style lists
that are inside of certain classes, I can use these defendant
and child selectors to add styling and
those particular ways. And there are a number of other
CSS selectors we can add as well. And we'll go ahead and
explore a couple of these, just to give you a sample of how some
of the CSS selectors can actually work. And we'll start by taking a look
at the descendent selector, which is used to select all of the
elements that are descendants of some other element, for example. So let's go ahead and create a new
file, that I'll call descendant.html, that again, we'll start
with the same code. And inside the body of this
page, I want an ordered list that maybe has a list item
1 and maybe a list item 2. And it turns out with lists in HTML, you
can nest lists inside of other lists. Maybe you've seen bullet points where
there's like nested bullets inside of other bullet points. I can do that here. I can add an unordered list and
create a sublist, like sublist item 1 and sublist item 2. And maybe down here,
here's another list item, such as that now I
have a couple of items, but some that are inside
of an unordered sub list. Let's go ahead and
open up descendent.html and see what that looks like. So here's what we have. We have a list item 1, list
item 2, another list item that is probably actually list item 3. So we have three items. But inside of list item 2,
I have an unordered list. Let's imagine, for example,
that I wanted to only style these sublist items
as a particular color. That maybe I want those
to be blue, for example. If in the style section
of my web page, I say that I would like for all list
items to be styled blue, well then-- not styled, colored blue rather-- then what I'm going
to see when I refresh the page is that all of the
items are going to be blue instead of just the two sublist items. But I could instead say that, you
know what, I only want list items that are children of unordered lists. And I can do direct children
using this greater than symbol to say that only if there is a ul that
immediately contains an li within it, then I would like for
that to be colored blue. And now, if I refresh that, now you'll
see that the ordered items, list item 1, 2, 3, those do not get
colored, but only the list items that are inside of the
unordered list that are directly children
of that unordered list actually get the CSS styling applied. This greater than symbol here is
specifying immediate children. I could get rid of it, ul li, like
this, and this would also work. You still see sublist item 1 and 2. But this is a more general selector
called the descendent selector that selects all descendant elements. So they might not be
the children elements. They might be grandchildren
element, so to speak, if those children elements
have other children that are attached to them as well. Again, for all of this,
it's helpful to begin to think about things in terms of
that Document Object Model, that DOM structure, that tree that represented
how all of our various different HTML elements are related to one another. So next up, we can begin to take a
look at some of the other selectors that we have access to. So one of the selectors
might be something like modifying only on a specific
attribute of a particular HTML element. So we can use the attribute
selector for that. I'll create a new file called
attribute.html, where here, let's go ahead and
create a unordered list. That's going to have a
number of different links to various different websites. So here's a list item that is
going to be a link to Google. So I'll link to google.com
and say, Google. And I'll go ahead and add
a link to facebook.com. Call that Facebook. And I'll go ahead and add a link
to amazon.com and call that Amazon. And let's imagine for a moment that I
only wanted to style the Facebook link, like I want to really
highlight the Facebook link, tell people to click on
that one as by coloring it in entirely different color. Well, to style things
normally, I would say something like links should be colored,
you know, blue, for example. They're colored blue by default,
but I could be explicit about it and say, links should
be color blue like, such that now when I
open up attribute.html all the links are colored blue. But I could also say,
I would like links that have an href attribute of
facebook.com, I would like those links to be colored red instead. So this square bracket
notation I can use to specify a particular
attribute of an HTML element. Only anchor tags, a tags, who's
href is equal to facebook.com, those should be the
only ones colored red. So now, when I refresh this,
I now see that Facebook is a link that is now colored red,
instead of colored blue, because I've been very specific about
picking an attribute that I would like to use in order to
reference that particular HTML element. And we can use CSS selectors in more
powerful ways too, maybe not just to style a particular
element always, but to style an element only under certain
conditions or only when an element is in a particular state. And this is very often
done for something like when you hover over something, when
you hover over a button and something pops out, or you hover over something
and it changes color slightly. We can begin to do this by adding
what we call a pseudo class to a CSS selector. So let's take a look
at an example of that to see how we can modify an element
when a user hovers their cursor over that element, for example. So I'll go ahead and open up a new file,
hover.html, where here, I'll go ahead and inside the body of the
page just give myself a button. This button is going to say, Click Me. And let's add some style to the button. By default, buttons show
up as fairly simple buttons that just look something like this. I might like to add a little bit more
to this button and say, you know what, let's add some style to the button,
and give it a width of 200 pixels, a height of 50 pixels, a
font size of 24 pixels, and maybe a background
color of green, for example. So I've specified some size information,
how big I'd like the font to be, and also a background color for
the button, such that now here's what that button looks like. Shrink it down a little bit. It says, Click Me. But many buttons, especially nowadays,
they give you a little bit of feedback. You hover over them, and they
change their color slightly. How do they do that? Well, often it's using
a CSS pseudo class, where I can say button
colon hover, meaning when I am hovering
over a button, then I'd like you to change the
background color to orange, for example, some other color. So now, I specified that by
default normally for a button, your background color
should be green, but when the button is being
hovered over instead, now change the background
color to orange, such that now when I open up
this page and go to Click Me, if I hover over the button, the
color of the button changes. Normally green changes to orange. And so that is a very powerful feature
that we have access to as well. All right, so now we've seen how
we can use various different CSS selectors to very precisely define how
we want our web pages to be styled. But one other thing we can use
CSS for that's quite powerful is responsive design. And responsive design
is all about making sure that our web pages look good, no matter
how you're looking at the web page. Nowadays, people aren't always looking
at web pages on their computers. But they're looking at web pages on
their mobile phones or on their tablets as well. And it's important as we begin to
design web pages that we design our web pages in a responsive way. So we'll look at a
number of different ways we can implement responsive
design in our web pages, starting with the
discussion of the viewport. And what the viewport is is the viewport
is the visual part of the screen that the user can actually see. So the viewport is this
entire area of the web page that displays content to the user. So one question you might ask is, what's
going to happen when you take this page and translate it onto a mobile screen? Well, one thing that many
mobile devices do by default is treat their viewport as though it
is the same width as a computer screen. Because not all web pages are optimized
from all device mobile devices, you want to make sure that on a
mobile device you can see everything. And so many phones will
take a web page like this and just shrink it down to
fit onto a mobile screen that looks a little something like that. Now, of course, that's probably not
really what we want it to look like. Ideally, we want our page to
adapt to different sized screens. Maybe we want the heading
and the image and the text, if that's what these are, to grow a
little bit to fill that entire screen. And so one simple thing we can do
is just to add a little line of code to our HTML inside the head section of
our page that controls the viewport. This line of code here is providing some
metadata to our HTML page and saying, I would like you to
change the viewport to be specifically the width of the device. By default, many phones will
use a viewport that's actually wider than the width
of the device, treat it as if they're loading
a page in a computer, and then shrinking it down to
the size of a mobile device. If you and your web
page specify, though, that you want the viewport
to be just the device width, oftentimes a page is going to look a
whole lot better on a mobile device. But in addition to just
adding a line like this, there are other actual
changes we can make to our page to make it look a
little better on different screens. And one of those has to
do with media queries. And media queries are
all about controlling how our page is going to look depending
on how we render that particular page, or what size screen we're
rendering that page on. So let's take a look
at an example of how we might go about using
media queries in order to control what a page actually looks
like depending on what type of page or what type of browser
we're using to view it. So I'll go ahead and open a new
file that I'll call responsive.html, because we're going to try and
build a responsive web page now. And now, I'll go ahead and
inside the body of my page just include a big heading that says
Welcome to My Web Page, for example. And just to demonstrate what you
can do now with responsive design is I could say something like,
let me add a style tag here, where I want to say that if the size
of the screen is a certain width, then I want to style
the page in one way. And if the size of the
page is a different width, then I might want to style
the page in a different way. You might imagine that
as you shrink the screen you want to move
elements around in order to rearrange them to make the
page just look a little bit nicer on a mobile screen. So we'll do a very simple example
of just changing the color depending on the size of the screen. So let me specify now in a media query. And the syntax for media
query looks like this. I'm going to use the @
symbol and say media and then specify for what type of media I
would like to apply this query. I can say something like, if
the minimum width of the page is 600 pixels, in other words,
if the width of the page is 600 pixels or anything
larger than 600 pixels, well, then go ahead and take the body and
give it a background color of red. But then I could also add
another media query and say, you know what, for this media query let
me give it a max width of 599 pixels, meaning if the size of the
screen is 599 pixels or fewer, then maybe I'd like to take the body
and give it a background color of blue, for example. So now let's take a look at what
happens when I take this page and actually open it
and see what's going on. I'll open up responsive.html. And here's what I see normally. I see a red web page, because my
screen is longer than 600 pixels wide. But notice what happens
as a shrink this web page. If I go ahead and shrink it,
looking at it on a smaller screen, eventually it turns to blue. If it's above 600 pixels
wide, it's going to be red. If it's below 600 pixels wide,
the color changes to blue. So we're able to now use these media
queries to really fine tune control how our page is going to look on
various different types of devices. If it's on a big screen, maybe you want
the elements to look a certain way. If it's a smaller screen,
maybe they'll look differently. And you don't just need to
control a background color. You can control any CSS property you
want just by using these media queries. You can say on a big screen, you want
certain amounts of spacing or padding. You can even hide elements
on smaller screens if you want to by using a particular CSS
property called the display property. That controls whether or not
an element is even visible. And ultimately put together, this can
help to make your pages a little bit more responsive. And there are a number
of different media queries that we can apply
to our page as well. We can check to see whether a mobile
device is vertical or landscape. We can check to see whether the user
is viewing the page on their computer screen or if they've tried to print
out the contents of the page as well. So there are a number
of different options that we have to really control
how a page is going to look. There are some other tools we have
in our toolbox as well, though, for dealing with mobile responsiveness. And one of the tools built
into the latest version of CSS is something called flexbox. And flexbox is quite helpful if we
have multiple elements that we're all trying to display on the same
page at the same time that might overflow if we're not careful
about how we do responsive design. If we're really not
careful-- let's imagine I have six elements that show
up on my computer's monitor. When you translate that
to a mobile screen, you can imagine they might all
shrink down so that they're barely visible, something like this. This is probably not
what we want if we're trying to design a mobile
responsive page, for example. So you might imagine, how can
we do a little bit better? Well, another thing we could
do is take these elements and go ahead and keep
them the same size, but make you have to
scroll through them. This is now slightly better. The elements that are
at least still visible. And they're large enough
on the screen, but it would be nice not to have
to scroll through them. What would be really nice is given
that we have all this extra space, I would like to be able
to wrap around elements if I don't have enough
space for them, such that if I'm translating these
six elements to a mobile screen, they translate, but I get
them in like two rows, for example, three on
the top and three below. And flexbox is an easy way to
be able to implement something like this inside of our web pages. So let's take a look at
what that might actually look like to add flexbox to our page. So I'll go ahead and create a
new file called flexbox.html. We'll start with the same HTML code. And now, inside of the body, I'm
going to create first a div that is going to be called the container. And we're creating a
container, because we're going to specifically say that
everything inside the container, I would like to add flexbox
to, to be able to wrap it around so that things can go onto
multiple lines if I ever need to. And now, let me just
add some sample text. So this is some sample text
inside of a div to demo flexbox. And I'll go ahead and repeat
this may maybe like 12 times. And I'll number each one. Here's 1, 2, 3, 4, and
I'll number all the rest. This is just to give a demonstration
of what these elements could actually look like. Ideally, these would be different
pieces of content, though. So now, inside of my
style tag, here's what I'm going to say, just to demonstrate. I'll say, take the ID container--
again the hashtag specifies get me something with a particular ID. And I want to display it using flexbox. And in particular, I would
like to use the flex wrap property to say if there's not enough
room at the end of a line for all of the elements, go ahead and
wrap around those elements onto the next line instead. And now, I can specify some
additional CSS properties for the divs inside of the container. So I can say, for the container all
of the div inside of that container, again using this child
selector to get all of the divs that are
inside of the container, I can add some CSS to that too. I can say, let's give these a background
color of like a shade of green. I can give them a particular
font, maybe 20 pixel font. Give them some margin and
padding, just to add some space. And maybe each one is going
to be 200 pixels wide. So just adding some spacing
to those individual divs, the important part is
this right here, where I've said that this whole container
is going to be a flexbox container. And I'd like to wrap around
elements if you ever reach the end. So now, I'll open up flexbox.html. And so here, I now see 12 elements
that are on multiple lines. But notice what happens
as I shrink the page. If there isn't room for all of them,
elements move onto other lines. Now, there's only three
elements in any particular row. Now, there's only two elements
on any particular row. And so I can use flexbox
to very well adapt myself to different sized screens. And no matter whether you're looking at
this on a big screen or a small screen, the content is still going to look good,
because I'm able to adapt responsively to whatever might be happening. So this is one layout paradigm that
exists within CSS, this flexbox layout. There are other layouts
that exist as well. One common one is the
grid layout for anytime you want to arrange things
in a particular grid, where maybe certain columns
need to be certain widths, but others can maybe be a
little bit more flexible. I'll show one example of that too, just
to give you a demonstration of what that grid layout might look like. So here's grid.html, where I'll go
ahead and inside the body of this page, give myself a div. I'll give it an ID of grid. And then let me just add
div class equals grid item. Again, a class, because there
might be multiple items, but I'll go ahead and just create
a whole bunch of grid items and number each one, so 2, 3,
4, 5, 6, 7, 8, 9, 10, 11, 12. So I have a whole bunch of grid items
inside of a div whose ID is grid. And now, I'd like to
add some style here. I'll say for the grid, let's
give it a background color. Maybe the background
color should be green. Display is going to be grid. I want this to show up as a grid. And now, there are a couple
of attributes or properties that I'm going to specify here. Maybe I want some padding
around the grid first. But the important grid
properties are grid column gap. How much space goes between
each of the columns? Maybe I'll say like 20 pixels. Likewise there is also a grid row gap. How much space goes between
each of the rows of the grid? Maybe I'll say 10 pixels here. And then finally, grid template
columns is a way for me to specify how many columns
there are going to be and how wide should each
of those columns be. So if I want maybe three columns,
I can specify that the first column should be 200 pixels. The second column should
also be 200 pixels. And the third column can
be automatically sized, just grow or shrink to fill the screen. So we'll say auto. So first column 200 pixels,
second column 200 pixels, third column just do it automatically. And now, for all of the
grid items, well, those I can add some styling to as well. I'll give them a
background color of white, just to distinguish them, and also give
them some font size and some padding and maybe center them as well. So just adding some additional
CSS properties in order to make it display the way I want to. But the important ones to care
about here are display is grid. And then I'm specifying,
here is how the grid should be laid out, how
much space between columns, how much space between rows, and how
wide are each of those rows going to be. Now, if I open up, grid.html,
here's what that grid looks like. I now have a first
column 200 pixels wide, a second column also 200
pixels wide, and a third column that's going to resize
dynamically based on how wide or how narrow my screen happens to be. So as I shrink the screen, the
third column shrinks with it. As I grow the screen, it also
grows alongside with how big this window happens to be. And so flexbox and grid are
some very powerful tools that we can use and
just to make it easier for us to be able to use
mobile responsive design, to be able to make sure
that our pages look good no matter what kind of
browser or what kind of device the user is using in
order to look at our page. But it turns out that
exists a lot of libraries out there that do a lot of this for us,
some people that have already written CSS code to make our text look
good, to make our buttons look good, in order to make sure that
things are mobile responsive. And one of those is called Bootstrap. Bootstrap was a very
popular CSS library that we can use in order to use
some styling that they have written, such that we don't need
to write all the styling from scratch. So this is what Bootstrap's
website looks like. I'll go ahead and show
it to you now just to give you a sampling for
what's available inside of a library like Bootstrap. If I go to getbootstrap.com,
here's Bootstrap's website. And if I go to their documentation
on this first link here, I can look at all of the Bootstrap
components that I'm given access to. These are things like
alerts, for example. That here's an alert that's
styled in a very particular way. It's in a specific font. It's got a certain amount of
padding and certain colors. And if I want to just copy this alert,
once I've used Bootstrap's code, I can just apply
certain classes to a div and Bootstrap will handle the process
of applying the right styles for me. I don't need to write all of these
styles by myself from scratch. Bootstrap's written a lot
of the styling already. So how do you actually
go about using Bootstrap? Well, to get started
with Bootstrap, all you need to do is copy the CSS
link that Bootstrap gives you to the top of your file. So if I take the CSS link and then
go back to something like hello.html, which you'll recall originally looked
something like this, just Hello World, I can add some Bootstrap
to it to say, all right, I would like
to take this HTML file and apply Bootstrap styling to it
to make it look a little bit nicer. So I refreshed the page. And now, you'll notice Bootstrap's
chosen a custom font for me just to make things look a little
nicer in Bootstrap's own eyes. And now, if I want to
add Bootstrap elements, I can say, all right, let
me go to their components. And I want to add an alert. I can just copy their alert code. Here's their alert code for a primary
alert, an alert that looks blue. And I can just inside the body of
my page go ahead and add an alert, and maybe change the text to
here is my alert, for example. Now, when I reload hello.html, I
now see an alert that shows up, styled according to Bootstrap styling. And again, I can change that styling
just by changing these classes. So a primary alert shows up as blue. A success alert shows up as green. A danger alert is red. So if I want to give a danger alert--
the user is doing something wrong on the web page, for example-- I can change alert primary here inside
my HTML to something like alert danger instead. And now when I refresh this
page, I now see the alert shows up as red instead of blue. So Bootstrap gives us access to a
lot of these various different types of components, different ways of adding
breadcrumbs and alerts and carousels and other elements to our page just to
make it easy to make our page look good very, very quickly without having
to worry too much about writing our own CSS, because Bootstrap's
written a lot of that for us. Bootstrap even includes
a way to make sure that web pages are mobile
responsive using something called Bootstrap's column model. So I'll show you an example of that now. Bootstrap divides its page
into 12 distinct columns. So one thing I can do
is I've pulled this up in an example I have in advanced
called column zero.html. Notice that inside of
the body of my page now, I have a div whose class is container
and then a div whose class is row. And Bootstrap divides every
row into a 12-unit column. So here, for example,
I have a whole bunch of divs that are each 3-unit columns. So if I have four 3-unit
columns, that will take up a total amount of space
equal to 12, meaning filling up the entirety of the screen. So if I now open up source column
zero.html, here's what that looks like. I have four columns, each
of which is of width 3. And as a result, as I
shrink it, those columns will automatically resize to
make sure that they're always the appropriate size. Now, as long as they add up to 12,
they don't only to be the same size. So, for example, if I only wanted
three columns, instead of four, I could get rid of the fourth
column by deleting those rows. And maybe change the second column
instead of being a column of size 3, let's make it a column of size 6. So that's a length 6 column instead. And now if I refresh
the page, now suddenly I see three columns where
the middle one is twice as large as the ones on either end. And as I shrink this down, I can
see that it shrinks down as well. And one of the advantages
of using Bootstrap columns is that they too can
be mobile responsive. They too can wrap around other
lines if they ever need to. So, for example, let me
pull up columns one.html. Here, for example, I have a row. And let's take a look at
what's going on in here. Recall that every row in Bootstrap
is divided up into 12-column units. But Bootstrap, in addition to letting
me specify how many units a column should take up, also lets me
specify how many units that column should take up depending
on the size of the screen. So if I'm on a large
screen, as indicated by LG, this is saying that on
a large screen, this div should take up 3 units of space. And this div should also
take up 3 units of space. And for each of these four
divs, on a large screen, each will take up 3 of the
total 12 units of space. So they'll all show up on one row. What happens on a small screen, though? Well, here col sm, for
column on a small screen, I've said on a small screen
each column should only take up 6 units of space, 6, or half,
of the total 12 that I have in the row. And so I use up 6 here,
6 here for a total of 12 in one row, which means
the next two, also a size 6, need to go on to a second row. And Bootstrap is smart
enough to do this math for me and figure out how exactly these
elements should ultimately be laid out. So now if I open up columns 1.html and
see what's there, on a large screen, I see four columns, all in the same row. But as I shrink down
to a smaller screen, eventually we'll see that things change. I now see the third and fourth
sections move down onto the second row, because on a smaller screen
now, when the window is smaller, now I only have the ability to show
two elements in any particular row. So I get to on the first row and
then two on the row underneath that. So all in all, there are
a lot of different ways now that we can use CSS in order to make
sure our pages are mobile responsive. We can use Bootstrap
column model to make sure the columns move around whenever
a size of the window shrinks or grows. We can also use things like
flexbox and the grid model, writing our own CSS to make sure
that our page is responsive depending on the size of the screen that the
user happens to be using in order to visit our website page. So these are some of the very powerful
features that we get using just CSS. But one thing you might imagine is that
as we begin to write more and more CSS, there's going to be more and more
repetition, things that appear again and again and again. And we've already seen some ways that
we can minimize redundancy in CSS. We've seen how we can move CSS into
the style section of our web page. We've even seen how we can move
CSS to an entirely different file. However, what we haven't yet seen is how
to deal with other types of redundancy. And so let's take a look
at an example of that now. Let's imagine, for example,
that I want to style multiple different elements in different
ways, but using some common properties. So, for example, let me create a
new file that I'll, in this case, call variables.html. And you'll see why in a moment. I'll go ahead and copy
hello.html, but I'll get rid of all this Bootstrap inside of it. Let's imagine that here I have in
maybe two list, an ordered list and an unordered list,
where my unordered list has an ordered item, maybe
three unordered items, and my ordered list also
has three ordered items. Again, just for sake
of demonstration, I'm showing that we have
these two lists now. And I'll open up
variables.html just to give you a sense for what that could look like. We have three unordered
items in an unordered list, three ordered items in our ordered list. Let's imagine I wanted to style
these a little bit differently. Maybe inside the style
section of my page I want to style the unordered list
to have a font size of 14 pixels and maybe a color of red. And my ordered list, I would like that
to have a font size of maybe larger, 18 pixels, but also a color of red. I want to keep the same
color for all the text, but I want the font
sizes to be different. Now, if I refresh this
page, here's what I see. They are indeed of different sizes. The ordered list items are larger
than the unordered list items. And they're all red. But there was some
redundancy, some repetition that was introduced when
I was writing my CSS code. In particular when I
was writing my CSS code, I've repeated this
usage of the color red. If I ever want to change the color
from red to blue, for example, I'm going to have to change my
code in two different places. Ultimately, I'd just like for my CSS
to be a little bit more powerful. And so that brings us to our last topic
today, which is a language called Sass. And Sass is a language that is
essentially an extension to CSS. It adds additional
features to what CSS has to offer, just to make
it a little bit more powerful for us to be able to use
and manipulate CSS in a way that's going to be faster and
remove some of the repetition that we might have
had in CSS previously. And one of the key features of Sass
is the ability to have variables. So let's take a look at
an example of this now. I'm going to create a new file,
normally when we created our CSS files, we called them like
variables.css, something dot CSS to stand for a CSS file. Sass is a different language, though. So it's going to require
a different extension. We're going to conventionally use dot
scss to stand for this is a Sass file. So here is now variables.scss. And now what I can do in Sass is
I can actually create variables in the same way that we could create
variables in a programming language, like Python, which we'll soon see. CSS normally doesn't
support variables, but Sass is going to give us that power. In Sass, all variables
begin with a dollar sign. So I can create a variable $color
to create a variable called color. And I can say the variable called
color is going to be equal to red. So this line here, line
1, is my way of telling Sass I'd like to create
a variable called color and I'd like for its value to be red. And now, I can add the
same styling I had before. I can just use normal CSS
and say for an unordered list I'd like the font size to be 14 pixels. But the color, instead of saying red
here, I can use the name of a variable. I can say $color to mean go ahead and
use the value of the variable color as the color for this unordered list. Then for an ordered list, I'll
also say font size 18 pixels and say color should also be
this variable called color. By using a variable, I've
removed the repetition. Rather than having the word red show
up in multiple places in my code where I would need to change it
twice if I ever needed to change it, now I have defined the variable once. And I only ever need to
change it in one place if I ever need to make modifications
to this particular file. So now, let's try and link this file. We'll go back to variables.html. Instead of putting the style code here,
I'll go ahead and link a style sheet and say, the href should
be variables.scss, because that's the file
where my styling exists. So now let me try and open up
variables.html after I've linked the CSS. And, all right, something
seems not quite right. I specified font sizes. I specified that
everything should be red. But it's not showing up. Everything is showing up black. And I don't see any of
the differences in sizing. And the reason for this is while the web
browser, things like Chrome and Safari and Firefox can understand CSS,
they can't by default understand SCSS, or Sass. Sass is an extension to CSS that
web browsers don't understand out of the box. So in order to solve this problem,
once we've written our Sass file, we need to compile it, convert
it, translate it, so to speak, from Sass into plain old CSS so that
our browser is able to understand it. And in order to do this,
you'll need to install a program called Sass on your computer. And you can install it
on Mac or PC or Linux. And now, in the terminal, in
order to do this compilation, I'm going to say Sass variables.scss,
the file I'd like to compile, colon variables.css. So variables.scss is the file
that I would like to compile. And the file I'd like to
generate is variables.css. I'd like to turn my Sass file
into a plain old CSS file. I'll go ahead and press Return. And all right, that compilation
process is now done. And so now, inside of variables.html,
instead of referencing the SCSS file, I'm going to reference the
CSS file as the style sheet, because my web browser only understands
CSS, it doesn't understand Sass. Now, when I load the page,
now I see the result I expect. Everything shows up as red and
the font sizes are different. So ultimately, this
was a 2-step process. I first needed to take my Sass
code, compile it into CSS. And then I could link the
CSS to this particular page. But the advantage now is that if ever
I want to make some sort of change, I want to change the color, rather
than change it in two places, or you might imagine in a more complex
page, like tens or dozens of places, I just go to the SCSS file, and I
change the color from red to blue. Now, if I refresh the page, all
right everything is still red. And that's because I forgot a step. I changed the Sass file. But that doesn't automatically
change the CSS file. I need to now recompile the CSS
file by saying Sass variables.scss variables.css, to compile the file
again using the updated Sass file. And now, I see the updated changes. And if you're curious as to what
the updated file looks like, I'm actually look at variables.css
to see what code happens to be there, and, though, it's styled
a little bit strangely. You can see that I have a UL with a
font size a 14 and a color of blue. So they've substituted the
word blue for this variable. And they've done the same thing
for ordered lists as well. Now, in practice, it's
going to be pretty annoying if I'm building a web
page, building using Sass, if I constantly need to go back
and recompile my Sass into CSS every single time. What I'd like to do is
just automate that process. And Sass makes it easy to do this. I can just say, Sass dash dash
watch variables.scss variables.css. And what that's going to do is now
you see Sass is watching for changes. Sass is going to monitor
the variables.scss file. And if ever I change my Sass file,
Sass is going to know about it. And it's automatically going to
recompile the corresponding CSS file. And you can do this not just with
single files, but entire directories as well if you have multiple
different Sass files. So now, what I can do is if in
the variables.scss file I change the color-- instead of blue, I now want
it to be green, for example-- I now save the variables.scss file. And now, without doing anything--
take a look at my terminal-- Sass detected a change
to variables.scss, so it gave me a new version
of my original CSS file. If I go back to my web browser now,
refresh the page, now, all of the text is green, as I would expect it to be. So that's one of the very powerful
features that Sass gives us. It gives us the ability to add
variables to our CSS code just to factor out commonalities. If there are common fonts, common
colors, common borders, common styling, that I want to apply to a
lot of different things, it becomes much easier just
to use Sass in order to do so. And finally, we'll take a look
at a couple of other features that Sass gives us the
ability to do, one of them is the ability to nest CSS selectors
inside of other CSS selectors. So one thing you've seen
so far, for example, is that in CSS, if I wanted to style all
of the unordered lists that are inside of divs, for example, I could say
like, div arrow unordered list, in order to style unordered
lists that are inside of divs. What Sass will do is that will give
us a bit of a nicer syntax for doing this type of thing, in particular,
by allowing us to nest CSS inside of other pieces of CSS. So just as an example
of this, I'll go ahead and open up a file I already
brought, called nesting.html. And so here is what we might
see inside of nesting.html. Here is the body of the page. Inside the body of the page,
I have a div, inside of which is a paragraph inside the div and
also a list, an unordered list, or ul, that's inside
of this div as well. And then we also have a paragraph
that's outside of the div. And a list that's outside of
the div in addition to that. So a number of different elements,
some of which are located inside of other elements. And what I'd like to do is be very
precise about how I style these pages. What Sass is going to
allow us to do is it lets us write a Sass file that
looks a little something like this. Let's take a look at what it's doing. It's saying, for the
entire div, I would like to give that div a
font size of 18 pixels. And then, what CSS normally
doesn't allow us to do, but we can do now using
the power of Sass, is say, for any paragraphs
that are inside of that div, go ahead and give those
paragraphs the color of blue. And for any unordered lists
that are inside of the div, give those unordered
lists a color of green. By nesting these CSS
selectors inside of others, we've been able to get
across the idea that I only want to style the paragraph
if it is inside of a div. And this is just a little bit
of a nicer, cleaner syntax for doing some of these more complex
styling tasks that might come up. So what does this actually look like? If I like take this SCSS file
and turn it into normal CSS, what is the result going to be? Well, let's take a look. We can try it out by let me
go into my nesting folder where all these files are located. And if I run Sass nesting.scss,
turn it into nesting.css, now let's open up nesting.css
and see what it looks like. Here, it's turned into
a take all of the divs, give them a font size of 18 pixels. And then, we're using the same
descendant selector notation that we saw before, where all
the paragraphs inside of divs should be colored blue, all the
unordered lists inside of a div should be colored green. And this certainly works. And we could have just written
this CSS from the beginning, but it can be a little bit cleaner, a
little bit easier to read to use Sass in order to really say,
paragraphs inside of divs should be structured this way, unordered
lists are styled in some other way. And using this nothing approach
just makes it often easier to take a look at this SCSS
page and really understand how all of the different style
code interacts with each other. So after all of this now,
if I open up nesting.html, we might see something that looks
a little something like this. The paragraph inside the div and
the list inside of the div, those both get changes to the way
that they've been styled. But unlike them, these
paragraphs outside of the div and the list that is
also outside of the div, those get styled a
little bit differently. So two features now we've
seen inside of Sass. We've first seen the
ability to have variables to make sure we're not
repeating ourselves in many places throughout the code. And now, we've seen the ability to
nest CSS selectors inside of each other by taking advantage of Sass. And finally, we'll take a
look at one last feature that Sass is going to give us. And that is something
called inheritance. If we have certain CSS selectors that
are related to other CSS selectors, but they're may be adding
some additional information. And in this case, I'm actually going
to show you the finished product first. So let's go into inheritance and
let me open up inheritance.html. And here, you see I've
tried to almost implement Bootstrap-style alert messages in HTML. I have a success message up at the
top, a warning message, and then an error message. And each of these messages you'll
notice are styled differently. In particular they're
each a different color. But despite that, they
share a lot in common. They share a common border. They share a common font. They share a common size
and many other properties are all shared between these elements. There are just some things that are
a little bit different about them. I could have written three
different CSS selectors to deal with all of these cases, but
there might be some repetition there. So here's what I can do by
taking advantage of the features that Sass gives me. Let me go ahead and look at
inheritance.scss to look at the code for doing this. And it looks a little
bit cryptic at first. But here's what I've defined. I've here defined using a percent sign
that this is what a generic message is going to be, something that I can extend
later to add additional information to. All of the messages, whether they be
success messages or danger messages or warning messages, they're
all going to have the same font. They're all going to
have the same border. They're all going to have the
same padding and margin, spacing around and outside of it. But each of the specific messages
are going to be slightly different. How are they different? Well, let's take a look down here. Anything with a class of success, I'm
going to say extends this message. And by extends this message what I
mean is that anything with a class of success is going to inherit all
of these CSS properties-- the font, the border, the padding in the margin-- but it's going to add
additional information to it. In particular, we're
going to add a color. We're going to say that
for success messages, the background color
is going to be green. I've extended the basics of
what a message is, but said that this message in particular has
some additional style that we're going to assign to it as well. And the other two messages
behave in very similar ways. My warning message extends
the message, but instead says the background
color should be orange. And finally, the error message
also extends the message. But this time, it gives us the
background color of red instead. So now, when you compile
this all together into inheritance.css, which
I compiled it in advance, this is what this is
ultimately going to look like. It translates what I've
written into saying, all right, success
and warning and errors should have all of these properties. But success should also
have this background color, warning should have
this background color, error should have this background color. So again, we could
have written this CSS. There is nothing that
Sass does that we couldn't have written ourselves using CSS. Sass we'll just make it a little bit
easier to do many of the same thing. So we can write things in a
little bit of a nicer syntax by saying the success message
inherits from the message but adds a background color. And likewise, the warning and
error messages do the same thing, but in a simpler syntax and a bit
of a nicer syntax, such that later we can let the computer take the Sass
code and compile it into CSS instead. And so those now are
some of the fundamentals of what we've seen in building
web programs using HTML and CSS. We've seen how we can use HTML to
describe the structure of our web page, deciding what's going to show up where
on the page, and then we looked at CSS and how CSS can then be used to style
our web page in various different ways, adding custom styling
like colors and layouts, but also thinking about
things like responsive design, like what happens on a
mobile screen or on a tablet, and making sure that our web pages
look good on those screens too. And then finally, we took a look
at Sass, an extension to CSS, that adds a number of
additional features, features like variables and
nesting and inheritance, that make it even easier for
us to be able to write style that we can apply to our web pages. From there, we're going
to be transitioning now to looking at how we can use HTML
and CSS in larger web applications as we begin to incorporate other
tools, tools like Python and JavaScript and other languages and
frameworks altogether. So this is Web Programming
with Python and JavaScript. We'll see you next time.