She Templates is a basic responsive site template for the girl who's ready to build an empire that's anything but basic. Developed by Annie Pennell as a supplement to the HTML Web Development workshop at the Generation She 2020 Entrepreneurship Makeathon.
- Technologies and Dependencies
- Getting Started
- Code Structure
- HTML: Make it say what you want
- CSS: Make it look good
- Javascript: Make it do cool stuff
- Materialize CSS
- Releasing your site
- Making your site do even more
- Alternatives to coding
- Additional Resources
This simple boilerplate template uses HTML, CSS, Javascript, jQuery, and Materialize.
You will also need a code text editor, such as VSCode or Sublime Text, and a GitHub account.
To top ⬆️
- At the top of the She Templates repository, click on the green Use this template button
- Add a name for your repository (no spaces!), add a description for the site if you want, then click Create repository from template button
- You should now see the same file structure as this repo in your own shiny new repository! If
you're using git in your terminal,
clone locally using
git clone https://github.com/apennell/she-templates.git
, otherwise click on the green Clone or download button, then click Download ZIP - Unzip the downloaded file then open the new directory in your favorite text editor (I like VSCode and Sublime Text)
- Open
index.html
in your browser to view the site. One way is to find the file, then select "Open with..." and choose the browser you want to use. Another is to open your browser (eg, Chrome) then select "Open file..." and find and selectindex.html
. - Back in the text editor, add content to the
index.html
file, style it up in thestyles/style.css
file, and make it interactive by adding JavaScript toscripts/script.js
! - Go back to
index.html
in your web browser at any time and refresh the page to view changes
To top ⬆️
README.md
- Includes information about your project, instructions on how to get the code running, etc.
- Good practice to include if someone else is going to be looking at your code—or even for your future self!
index.html
- Where we put our main content
- HTML describes the content and structure of a web page, and is the standard markup language for web pages
/styles
- Where we put our CSS files, which is how we style our HTML content
- CSS is a language that describes how the web browser should display an HTML document’s content
- Can include custom CSS files, eg
style.css
- Can include imported CSS files from other libraries, eg
materialize.min.css
/scripts
- Where we put our JavaScript code, which makes our site interactive
- JavaScript is a language that allows us to program the behavior of web pages
- Can include custom JS files, eg
script.js
- Can include imported JS files from other libraries, eg
materialize.min.js
/images
- Where we put any images that we want to save and display
- Be sure to always use images you have permission for! Unsplash is a great resource for copyright-free photos.
- If you don't use the images included with the template, don't forget to delete them!
To top ⬆️
<!DOCTYPE html>
<html>
<head>
<!-- <meta> info -->
<!-- <title> -->
<!-- import CSS files and fonts -->
</head>
<body>
<!-- page content -->
<!-- import scripts -->
</body>
</html>
DOCTYPE
tells the browser how to
interpret the document so it can display the content correctly.
Start your document with <!DOCTYPE html>
to indicate that it's using
HTML5, the latest version of HTML.
- This is the root element of an HTML page.
- Pass the
lang
attribute so that screen readers know what to language to announce and how to pronounce words:`<html lang="en">`
- Wraps around all elements that aren't actual page content
<meta>
tags allow us to pass certain information that the browser needs to know<title>
lets the browser know the site's name, which is used in the browser's title bar or page's tab<link>
tag lets us import CSS files and fonts--either from local files (relative links) or internet sources (absolute links). For example, to use styles.css, we need to import it here by adding:<link rel="stylesheet" type="text/css" href="styles/style.css">
- You may add any scripts that
are needed immediately when browser starts loading here, but for improved performance, add scripts
at the end of
body
wherever possible so that the content isn't held up by a long script before beginning to render - You may also add style in the
<head>
, but it's preferable to keep CSS separate in a stylesheet
- You only use one
<body></body>
tag in a document - This is where we put all HTML content that will render in the browser
- Import scripts at the bottom, before closing
</body>
tag
- Tell the browser how to format our content with HTML elements/tags
- Most elements must start with an opening tag:
< >
and end with a closing tag:</ >
:<div> <h1>Title</h1> <p>Content here</p> </div>
- Determine which tag to use by the purpose of the content. Common examples include:
body
: this is used only once and all tags are nested within this; to apply a style to all elements on a page, targetbody
div
: a multipurpose tag that allows you to group and style multiple HTML elements together:<div class="image-container"> <img src="images/logo.png"> <p>Image caption</p> </div>
- Semantic tags, which say something useful about the content they contain and are helpful for developers understanding code and for screen readers rendering accessible code, eg:
- Individual elements:
p
: paragraph texth1
,h2
,h3
,h4
,h5
,h6
: headings of diminishing sizea
: a link (or "anchor"); must includehref
attribute, set to the url to navigate to when clicked, eg:<a href="http://sheleads.io/">
button
: styled as a button and should receive instructions of what to do when clickedimg
: renders an image; should receivesrc
attribute, set to the url or relative link where the image can be found, eg:<img src="images/logo.png" class="brand-logo">
span
: can be used inside of an element tag to style a specific part of it, eg:<p>This is <span class="bold">some</span> text.</p>
input
and many more form elements for gathering information- And so many more!
- Attributes are like options that
you can send to an HTML element so they behave a certain way, like:
- class: a group
identifier that can be used on any kind of HTML element. One element can have multiple classes,
separated by spaces, and multiple elements can use the same class.
<p class="white-text small">A Bit of Text</p>
- id: a unique
identifier that can be used on any kind of HTML element. An element can only have one
id
and its id should be unique on the page.<p id="intro">This is some unique intro text.</p>
type
: can only be used with certain elements, such asbutton
andinput
- class: a group
identifier that can be used on any kind of HTML element. One element can have multiple classes,
separated by spaces, and multiple elements can use the same class.
class
andid
let you group and name tags, which can then be used to target with CSS and JavaScript.
To top ⬆️
CSS controls the style of the HTML content
.primary-bg {
background-color: #ba68c8;
}
h1, h2 {
color: #ffffff;
font-family: 'Libre Baskerville', serif;
}
- Every CSS rule-set contains at least one
selector (
.primary-bg
) pointing to a declaration block (the curly braces{}
) - A declaration block contains one or more declarations separated by semicolons:
background-color: #ba68c8
- A declaration includes a CSS
property name
(
background-color
) and value (#ba68c8
), separated by a colon
CSS stands for "Cascading Style Sheets" and "cascading" refers to how the language handles deciding which rule to abide when multiple rules apply to one element. It follows this hierarchy:
Given the following HTML and CSS, what color do you think "Title" will be?
<header id="header-1" class="header-group">Title</header>
#header-1 {
color: red;
}
.header-group {
color: purple;
}
header {
color: blue
}
The answer is red! Although all 3 CSS rules target the same element, #header-1
wins with the
greatest specificity.
However, it's best to avoid using id for CSS and use classes or HTML tag types wherever possible because we want to make our code as reusable as we can. An example where it would be okay is the use
of image div
s in our template:
<div class="image-section" id="image-section-1"></div>
#image-section-1 {
/* Set image and add light gradient overlay above image */
background: linear-gradient(0deg, rgb(255, 235, 59, 0.3), rgba(255, 112, 67, 0.3)), url("../images/christina-wocintechchat-com-unsplash-1.jpg");
}
#image-section-2 {
/* Set image and add light primary color overlay above image */
background: linear-gradient(0deg, rgb(129, 212, 250, 0.3), rgba(129, 212, 250, 0.3)), url("../images/christina-wocintechchat-com-unsplash-2.jpg");
}
.image-section {
height: 500px;
}
Because both .image-section
div
s share a height of 500px
, we set that style on the shared class
so we only have to write it once and they stay consistent. Because we're setting the image url using
the background
property with a gradient overlay, we know we won't want any other elements to share
that declaration and can target each one directly.
display
: sets whether the element is block or inlineposition
: sets how the element is positioned in a document.static
is default, but some other properties depend onposition
beingrelative
orabsolute
to work.padding
: sets how much extra space is added around all 4 sides of the element, outside of the actual content but within the border. This space is considered to be inside the element and is included in its total height and width.margin
: sets how much extra space is added around all 4 sides of the element, outside of the padding and border. This space is not considered inside the element and is not included in its total height and width.- There are a handful of options for setting
the appearance of text, including:
font-family
: specific or generic names for the font, likeHelvetica
orsans-serif
font-size
: size of the fontfont-weight
: how bold the font is (400
is 'normal')line-height
: sets the height of a line box, increasing or decreasing the space between text lines
color
sets the color of the element's text, whilebackground-color
sets the color of the element's background. There are 5 ways to declare the value of the color:- named:
pink
- hex:
#ffc0cb
- rgb (red, green, blue):
rgb(255, 192, 203)
- rgba:
rgba(255, 192, 203, 1)
--same as rgb, but the final value represents transparency of the color on a scale of0
(fully transparent) to1
(fully opaque) - hsl (hue, saturation, lightness):
hsl(350, 100%, 88%)
- hsla:
hsl(350, 100%, 88%, 1)
--same as hsl, but the final value represents transparency of the color on a scale of0
(fully transparent) to1
(fully opaque)
- named:
Commonly known as CSS variables, custom properties allow us to define a CSS property in one place and reuse it in many places throught the CSS document. In addition to letting you reference a color or font without copy-pasting the value over and over, one important benefit is that it allows you to easily make a change in one place. For example, this template is currently orange and blue, but you should be able to choose your own colors! If you want to use green and yellow, instead of finding all instances of all colors in the CSS and replacing them like you normally would, you can just change the variables at the top of the file and everywhere that was orange will immediately be green and everywhere that was purple will now be yellow.
Set the property/variable using custom property notation, with the name of the variable on the left side, preceeded by 2 dashes:
:root {
--primary-color: #ba68c8;
--primary-font: 'Libre Baskerville', serif;
}
:root
is the common choice for where to define the custom properties, because :root
is the very
highest level element of our HTML document, which means the property will be available for all
elements in the document.
The property name can be whatever you want, but it should be something useful and easy to reference.
It can be better to use names that describe the function of the property, rather than specifics. For
example, instead of calling the orange color --orange
, we're using --primary-color
because that
will still make sense if we want to change the main color to green.
To use the custom property, place it where you want to use it and access it using the var()
function:
h1 {
color: var(--primary-color);
font-family: var(--primary-font);
}
Something to keep in mind when working with CSS and JavaScript is that not all browsers can handle
fun "new" (or not so new!) properties and methods. When in doubt, check it on
Can I use for compatibility. You may choose not to care what users on
Internet Explorer see, but if a significant amount of your users aren't using modern browsers,
provide fallbacks for them so they can still use your site.
Custom CSS properties don't have any support on IE and
older versions of other browsers. If you want to control what users on unsupported browsers see,
then declare the property twice, with the standard value on the first and the variable on the
second. Remember what we learned about specifity? CSS will use the
first declaration first, then override it with the second one, which is the custom property value.
Since unsupported browsers won't be able to do anything with the weird var()
property value, it
will just stick with the first fallback value instead.
body {
font-family: 'Libre Baskerville', serif;
font-family: var(--primary-font);
}
Responsive design allows a site to look good on any device, regardless off the screen/browser size. We can use CSS to make the appearance of our content adapt well to different browser widths, so that it looks just as good on a phone as it does on a large desktop computer.
By applying a media query
, we can specify at what browser size a certain style will apply.
For example:
h1 {
font-size: 40px;
}
@media (max-width: 720px) {
h1 {
font-size: 24px;
}
}
The above code will set the font-size of all h1
elements to 24px
if the browser is 720px wide
or smaller; if it's wider than 720px, it will be 40px
.
We always want to look at our website at many different browser widths, all the way down to common mobile sizes. An iPhone X, for example, is 375px wide, while an iPad is 768px wide.
To top ⬆️
JavaScript makes the page interactive. We
can add this functionality between <script></script>
tags at the bottom of the <body>
tag in
index.html, but if we have a lot of JavaScript code, it's best to abstract it into a separate JavaScript file.
You may even choose to create multiple JS files so that the code is more manageable, organized, and
contained.
The Materialize CSS framework included with this template
includes a handful of useful JS helpers ready for you
to use. Make your browser skinny so that the navbar collapses into a "hamburger" icon, then click
that icon. See the drawer pop out of the left side and display the hidden links? That's JavaScript,
courtesy of Materialize! We're initializing that code in
script/script.js with the line $('.sidenav').sidenav();
, which uses jQuery to target the element
with the class sidenav
and calls the Materialize helper method sidenav()
on it.
Try out a dropdown menu,
image carousel, or a
tooltip!
jQuery is a JavaScript library that provides utility functions for
common chunks of code used in JavaScript so we can skip to the fun stuff. When we use $
, we're
calling jQuery. In order to use it, though, we need to import the library! That's what we're doing
at the bottom of index.html with
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
.
Because loading the library takes work, you only want to include it if you need and are using it.
The Materialize CSS library we're using requires it for actions like opening the mobile menu, but
if you're not using Materialize's JavaScript helpers and not using jQuery yourself, then remove
that link from index.html for a slightly faster load time.
To top ⬆️
This template is using a CSS framework called Materialize CSS. Although we could do it all from scratch, CSS frameworks provide helpful startpoints for common code. In addition, the framework is based on Google's Material Design, which has guidelines you can follow to create a great looking site even if you don't have design experience. Some very useful parts of Materialize include:
- Grid: makes it easy to lay out rows and columns that change responsively so that the content looks good on any screen size
- Helpers: provide quick solutions to common CSS issues, like vertical alignment, hiding and showing content, and text truncation.
- Styled buttons
- Navbar: responsive navigation element
- Icons
- Modals: open a smaller window above the other content for dialog boxes, confirmations, or additional content
- Styled form components
And when you're trying to understand something you can't figure out from the docs? Search for your question on Stack Overlflow and see if it's already been asked and answered!
If you don't want to use Materialize CSS, delete the <link>
to the Materialize CSS from the
<head>
of index.html
(<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
),
delete the <script>
calling the Materialize JS code from the bottom of the <body>
(<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
).
If you aren't using jQuery for anything else either, you can also remove that <script>
tag.
A popular alternative to consider is Twitter's Bootstrap.
All of Google's Material Design icons are
available because we imported them into the HEAD
of our Index.html file using a
CDN link. Search for
all options here. To use the icon, add it in your HTML
where you want it to appear using this syntax: <i class="material-icons">arrow_back</i>
,
replacing the content inside the <i>
with the name of the icon you want. You can also change
the size by adding one of these classes: tiny
, small
, medium
, large
.
Eg: <i class="large material-icons">cloud</i>
Another popular font library is Font Awesome. If you'd like to use
that instead, remove
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
from the
HEAD
of index.html so that you don't import unnecessary code.
To top ⬆️
Ready to take your site live? There are plenty of options, both free and paid. A simple free option is GitHub Pages, which will require you to create a GitHub account and a repository for this code. That's a very important step for any developer, so don't be afraid to take it!
If you don't know git and aren't ready to learn yet, GitHub has made it easy to create a code repository and deploy it to GitPages from within your GitHub dashboard without entering the spooky terminal. This tutorial will take you through the steps.
If you already know a bit of git and are able to create a repository locally from your terminal, there's a nice walk-through tutorial here that will show you how to deploy your local repo to GitHub Pages.
If you own a custom domain name, you can even configure your GitHub Pages site to use it.
If you have a lot of content to host, note that GitHub has a limiy of 1GB. A highly rated service for deploying static sites (frontend only, no backend) is Netlify, which offers a lot for free. They even can help with managing forms without needing server-side code!
Amazon's AWS is also very popular, with many cloud hosting options and both free and paid tiers. Here's a good guide on deploying to AWS.
Did you take your site way beyond the scope of this static site template and have an app with a backend? Then check out Heroku!
To top ⬆️
If you've taken your static site as far as it can go and want to keep learning and building, here are some next steps:
- Learn JavaScript! This is a key language used by frontend developers, and can serve as a stepping stone to learn any other code language.
- Loving JavaScript and ready to make it do way more? Get to know the
most popular frontend framework,
React, by starting an app using
create-react-app
. Run just one command and have a modern web app created immediately, then make it your own! - Loving JavaScript and curious to learn the backend? Then Node.js might be for you. Node.js is a JavaScript runtime that allows you to build a backend using JavaScript.
- Think JavaScript is okay, but want to see what else is out there? Ruby on Rails is a popular web application framework that's pretty quick to get started working with.
To top ⬆️
If you need to go from 0 to 100 and have a site up immediately without fiddling too much with the code, there are other ways to make that happen.
- Wordpress is a free tool that lets you create a website, blog, or app using little to no coding, but you can also add lots of code customization if that's something you're up for.
- It's not free, but Squarespace is a popular, modern, easy-to-use way to build a website without coding. It does provide options for customizing code with CSS, but not to the extent that Wordpress does.
- Wix is another popular website builder, which offers free and paid plans.
- If you're really into design but not as interested in learning coding, Webflow might be right for you.
To top ⬆️
- General Assembly Dash -- quick and basic intro to HTML/CSS/JS principles
- Codecademy -- follow along with tutorials on many programming subjects
- freeCodeCamp -- build projects and earn certifications
- Grasshopper coding app -- learn JavaScript with this app
- Made with Code -- short block-based (not text-based coding) projects geared toward teen girls to learn computer science/coding principles (by Google)
- Scratch -- learn computer science/coding principles by creating block-based games and animations (not text-based coding) (by MIT)
To top ⬆️