Module 3: CSS Basics

A History of CSS

Cascading Style Sheets (CSS) is a powerful technology that revolutionized web design by separating the structure and content of a webpage from its visual presentation. CSS plays a crucial role in modern web development, allowing designers to control layout, colors, typography, and other visual aspects of a website. Let's delve into the history of CSS, exploring its origins, development, and the reasons behind its creation.

Early Web Design Challenges

In the early days of the World Wide Web, web design was primarily focused on content and basic formatting. HTML, the markup language used to create webpages, handled both content structure and presentation. However, as the web grew in popularity, designers and developers faced challenges when it came to maintaining consistent and visually appealing designs across different web browsers and devices.

Origins and Development

Early Attempts: HTML Presentation Tags

In the mid-1990s, the HTML specification included presentation-related tags like <font>, <center>, and <blink>. These tags allowed some control over text size, alignment, and other basic styling. However, they lacked flexibility and caused compatibility issues across different browsers.

Birth of CSS: The Separation of Style and Structure

As web design complexity increased, a need arose for a more efficient and robust way to manage webpage styling. In 1994, HÃ¥kon Wium Lie and Bert Bos proposed a solution called Cascading HTML Style Sheets, which would later become CSS. Their proposal aimed to separate the structure of a webpage (HTML) from its presentation (CSS), allowing for cleaner code, easier maintenance, and enhanced design capabilities.

The concept of cascading style sheets was introduced to ensure that styles could be applied in a specific order, providing a hierarchy of importance and inheritance. This approach allowed developers to define a baseline style and then override it selectively as needed.

CSS1 and Browser Wars

The first official CSS specification, CSS1, was published in 1996. It introduced basic styling properties like font, color, margin, and padding. However, widespread adoption faced challenges due to the "Browser Wars" of the late 1990s, where competing browser vendors implemented CSS features inconsistently, causing frustration for developers.

CSS2 and Maturing Standards

CSS2, introduced in 1998, brought significant advancements to web design. It introduced properties for positioning, floating, and improved typography control. However, the full implementation of CSS2 took several years due to the ongoing browser compatibility issues.

CSS3 and Modularization

CSS3, starting around 1999, marked a departure from the monolithic approach of previous versions. Instead, it introduced a modularized approach where different features could be developed and adopted independently. This allowed for faster progress in certain areas of styling, such as borders, backgrounds, and animations.

Modern CSS: Flexbox, Grid, and Beyond

In the 2010s, CSS underwent a renaissance with the introduction of powerful layout technologies like Flexbox and CSS Grid. These technologies offered designers unprecedented control over webpage layouts, enabling responsive design and complex grid systems without relying on external frameworks.

Reasons Behind CSS's Creation

CSS was developed to address the limitations and challenges posed by the monolithic approach to web design, where presentation and content were tightly intertwined. The key reasons behind CSS's creation include:

  • Separation of Concerns: CSS allows the separation of content structure (HTML) from visual presentation, making code more modular and maintainable.
  • Consistency: CSS enables consistent design across different webpages of a site, ensuring a unified brand and user experience.
  • Efficiency: By centralizing styling instructions, CSS simplifies the process of updating and maintaining website design.
  • Browser Compatibility: CSS aimed to provide a consistent way to style content across different browsers, reducing compatibility issues.
  • Accessibility: CSS improves accessibility by allowing designers to create layouts and styles that are more easily navigated by assistive technologies.

Conclusion

The evolution of CSS from its humble beginnings to the present day has transformed the way web designers approach layout and presentation. CSS's separation of style and structure has streamlined web development, leading to more efficient coding practices, improved design consistency, and enhanced user experiences. As CSS continues to evolve, it remains an integral part of the web development landscape, enabling creative and dynamic designs on the ever-expanding digital canvas of the internet.



Putting CSS in HTML

There are three primary methods for adding CSS styles to an HTML document: Linked Stylesheet, Internal Styles (within the <style> tags in the <head>), and Inline Styles. Each method has its own use cases and advantages:

Linked Stylesheet:

How it works: In this method, you create a separate CSS file containing your styles, typically with a .css extension, and then link it to your HTML document using the <link> element within the <head> section of the HTML document.

<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<!-- HTML content here -->
</body>
</html>

Advantages:

  1. Separation of concerns: HTML and CSS are kept in separate files, making code more organized and maintainable.
  2. Reusability: You can use the same stylesheet for multiple HTML pages.
  3. Efficiency: The browser caches the external stylesheet, which can improve page loading times for subsequent visits.

Internal Styles (within the <style> tags in the <head>):

How it works: You can include CSS rules directly within the <style> tags in the <head> section of your HTML document. These styles apply only to that specific HTML document.

<!DOCTYPE html>
<html>
<head>
<style>
body {
background-color: lightblue;
}
h1 {
color: navy;
}
</style>
</head>
<body>
<!-- HTML content here -->
</body>
</html>

Advantages:

  1. Styles are contained within the document, making it self-contained.
  2. Useful for small projects or single-page applications where external stylesheets may be unnecessary.

Inline Styles:

How it works: Inline styles are applied directly to individual HTML elements using the style attribute. This method overrides any external or internal styles for that specific element.

<p style="color: green; font-size: 16px;">This is a green text with a larger font size.</p>

Advantages:

  1. Quick and easy way to apply styles to specific elements.
  2. Can be useful for making one-off style adjustments to individual elements.

Important Considerations:

  • The CSS styles cascade from the most specific (inline) to the least specific (linked stylesheet).
  • Linked stylesheets are generally preferred for large-scale projects or when you want to maintain consistent styles across multiple pages.
  • Internal styles and inline styles are useful for smaller projects or when you need to make quick, isolated style changes.
  • Inline styles should be used sparingly, as they can lead to less maintainable code when applied extensively.
  • It's a best practice to follow a separation of concerns, keeping HTML for structure and content and CSS for styling.


CSS Selectors

CSS selectors are a fundamental part of CSS (Cascading Style Sheets) that allow you to target and apply styles to specific HTML elements on a web page. CSS selectors determine which elements in your HTML document will receive the defined styles. Selectors can range from simple to complex, depending on the specificity and flexibility you need for styling.

CSS selectors work by matching the selector against HTML elements in your document's DOM (Document Object Model). When an HTML element matches a selector, the associated styles are applied to that element.

Selectors are evaluated in a cascading order, and in cases of conflict (when multiple selectors target the same element with conflicting styles), the CSS cascade rules come into play to determine which style takes precedence.

Here are some common types of CSS selectors, along with explanations, examples, best use cases, and information on how they cascade:

Type (Element) Selector:

How it works: Selects all elements of a specified type (e.g., <p>, <h1>, <div>).

Example:

p {
color: blue;
}

Best Use Case: Apply a style to all instances of a particular HTML element type across your entire website.

Cascading: This selector has low specificity and is easily overridden by more specific selectors.

Class Selector:

How it works: Selects elements with a specific class attribute value.

Example:

.highlight {
background-color: yellow;
}

Best Use Case: Apply styles to elements that share a common class, allowing for reusable and themeable styles.

Cascading: Class selectors have moderate specificity. If multiple elements have the same class and there are conflicting styles from different class selectors, the last applied class selector will take precedence.

ID Selector:

How it works: Selects a single element with a specific id attribute value.

Example:

#header {
font-size: 24px;
}

Best Use Case: Apply styles to a unique element on a page that has a specific id attribute.

Cascading: ID selectors have high specificity and override styles applied by type or class selectors. However, inline styles still have higher specificity than ID selectors.

Universal Selector:

How it works: Selects all elements in the document.

Example:

* {
margin: 0;
padding: 0;
}

Best Use Case: Rarely used on its own but can be used in combination with other selectors to reset default styles or apply a global rule.

Cascading: Universal selectors have very low specificity and are typically used in combination with other selectors. More specific selectors will override rules applied by the universal selector.

Attribute Selector:

How it works: Selects elements with a specific attribute and, optionally, a specific attribute value.

Example:

input[type="text"] {
border: 1px solid #ccc;
}

Best Use Case: Apply styles to elements based on specific attributes they possess, such as input types or custom data attributes.

Cascading: Attribute selectors have moderate specificity and are useful for targeting specific elements based on their attributes.

Descendant Selector:

How it works: Selects elements that are descendants of another element.

Example:

ul li {
list-style-type: square;
}

Best Use Case: Apply styles to elements that are nested inside other elements, such as list items within a list.

Cascading: Descendant selectors are based on the hierarchy of elements. More specific selectors will override styles from less specific ones.

Child Selector:

How it works: Selects elements that are direct children of another element.

Example:

div > p {
font-weight: bold;
}

Best Use Case: Apply styles to elements that are immediate children of another element, ignoring nested descendants.

Cascading: Child selectors are more specific than descendant selectors but less specific than other selectors like ID selectors.

Adjacent Sibling Selector:

How it works: Selects an element that is immediately preceded by another element.

Example:

h2 + p {
margin-top: 20px;
}

Best Use Case: Apply styles to elements that follow a specific element with no other elements in between.

Cascading: Adjacent sibling selectors are moderately specific and apply styles to elements in a specific relationship with their siblings.

Cascading Rules

In cases of conflict, CSS uses the cascade rules to determine which style takes precedence:

Specificity: The more specific a selector is, the higher its precedence. For example, an ID selector (#header) has higher specificity than a class selector (.highlight), and it will override conflicting styles.

Order of Appearance: If two selectors have the same specificity, the one that appears later in the CSS file or is loaded later in the document will override the earlier one.

!important: Styles marked with !important override all other styles, regardless of specificity or order of appearance. However, it's considered a best practice to use !important sparingly, as it can make your styles harder to manage.

In summary, CSS selectors are essential for targeting and styling HTML elements. Understanding how selectors work and their specificity helps you create organized and maintainable stylesheets while managing conflicts and ensuring your desired styles are applied effectively.



CSS Cascading Rules

CSS (Cascading Style Sheets) follows a set of cascading rules to determine which styles should be applied to HTML elements when there are conflicting styles. These rules help establish the order of precedence for styles. The order of priority, from highest to lowest, is as follows:

User Agent Styles:

These are the default styles provided by the web browser for HTML elements. They have the lowest priority and are applied first.

User Styles:

Users can define their own styles through browser extensions or settings. These styles override user agent styles but have a lower priority than author styles.

Author Styles (External Stylesheets): 

These are the styles defined by the web page author in external CSS files. They have higher precedence than user styles and user agent styles.

Specificity: Among author styles, the specificity of selectors determines their priority. More specific selectors override less specific ones.
Order of Appearance: If two selectors have the same specificity, the one that appears later in the CSS file takes precedence.

Author Styles (Internal Styles - <style> Tags):

Styles defined within the <style> tags in the <head> section of the HTML document have higher precedence than external author styles but lower than inline styles.

Specificity: The same specificity rules apply here: more specific selectors override less specific ones.
Order of Appearance: If two selectors have the same specificity, the one that appears later in the <style> tags takes precedence.

Author Styles (Inline Styles - style Attribute): 

Inline styles are applied directly to individual HTML elements using the style attribute. They have the highest priority and override all other styles.

Specificity: Inline styles have the highest specificity, and they will override conflicting styles defined in external or internal author styles.

Order of Appearance: If there are multiple inline styles applied to a single element, the last applied inline style takes precedence.

!important:

Adding !important to a style declaration gives it the highest priority, regardless of its origin (user agent, user, or author styles). However, it is recommended to use !important sparingly, as it can make styles harder to manage and maintain.

Cascading Order of Selectors:

If multiple selectors target the same element with conflicting styles, the specificity of the selectors determines which style takes precedence:

  1. ID Selectors: Highest specificity.
  2. Class and Attribute Selectors: Moderate specificity.
  3. Type (Element) Selectors: Lowest specificity.
  4. Universal Selectors: Very low specificity.
  5. Pseudo-elements and Pseudo-classes: These selectors have their own specificity rules and follow the same cascade order based on specificity and order of appearance within the CSS.

Important Considerations:

  • Specificity: Specificity is a critical factor in determining the cascade. The more specific a selector is, the higher its priority.
  • Order of Appearance: When specificity is the same, the last-applied style takes precedence.
  • !important: Use !important sparingly, as it can lead to code that is difficult to manage and debug.
  • Avoid Overusing Inline Styles: Inline styles should be used for specific, one-off cases, not for extensive styling across a web page.

In summary, CSS follows a cascading order of priority, with inline styles being the highest, and user agent styles being the lowest. Understanding these rules helps web developers manage styles effectively and ensures that the desired styles are applied to HTML elements in a predictable manner.



CSS Font and Color

Font Properties:

font-family:

The font-family property in CSS defines the typeface or font family for an element's text. It is critical for the visual style of your text.

Fallback Fonts for Compatibility: Specify multiple font families to ensure compatibility and maintain a consistent look. The first font is the preferred choice, while others serve as fallbacks.

p {
font-family: "Helvetica", Arial, sans-serif;
}

Cross-Platform Consistency: Different devices and browsers have different default fonts. Multiple font families allow you to control text appearance across platforms.

Maintaining Aesthetic Integrity: Each font family has unique aesthetics. Providing alternatives with similar visual qualities maintains the design's look.

Improved Accessibility: Fallback fonts ensure users with disabilities using assistive technologies can access content with customizable fonts and styles.

Progressive Enhancement: Multiple font families support graceful degradation. Users see content in an available font while the preferred font loads.

font-size:

The font-size property determines text character size for readability and design consistency.

Choosing Appropriate Units: Use various units like pixels (px), em, rem, percentages (%), or keywords (e.g., "small," "large").

h1 {
font-size: 24px;
}

Responsive Typography: Relative units like em and rem adapt to changes in parent element's font size or viewport, ensuring responsive design.

Accessibility: Consider font size for accessibility. Balance aesthetics with readability, especially for users with visual impairments.

Font Weight:

The font-weight property controls text character thickness.

Numeric Values: Use values from 100 (thin) to 900 (bold) or keywords like "normal," "bold," "bolder," and "lighter."

strong {
font-weight: bold;
}

Color Properties:

color: The color property in CSS is used to specify the text color, and it offers various formats and considerations for making informed color choices.

Color Value Formats:

CSS provides several formats to define text color:

Color Names: These are predefined color names like "red," "blue," or "green." They offer a straightforward way to choose standard colors.

You can see a great color name reference here

h1 {
color: red;
}

Hexadecimal Codes: Hexadecimal color codes follow the format "#RRGGBB," where RR, GG, and BB are two-digit hexadecimal values representing the intensity of the red, green, and blue color channels. This format allows precise control over color selection.

p {
color: #007bff; /* Hexadecimal color code for blue */
}

RGB Values: RGB (Red, Green, Blue) values are expressed in the format "rgb(R, G, B)," where R, G, and B are integer values ranging from 0 to 255, specifying the intensity of each color channel. This format provides flexibility in creating custom colors.

.highlight {
color: rgb(255, 0, 0); /* RGB value for red */
}

HSL Values: HSL (Hue, Saturation, Lightness) values are defined in the format "hsl(H, S%, L%)." H represents the color itself (0-360 degrees), S controls the intensity or saturation (0-100%), and L sets the brightness or lightness (0-100%). HSL values offer an alternative way to describe color.

h2 {
color: hsl(120, 100%, 50%); /* HSL value for green */
}

RGBA and HSLA: These formats are similar to RGB and HSL, respectively, but include an additional alpha (A) channel for transparency control. For example, "rgba(255, 0, 0, 0.5)" sets red with 50% opacity.

currentColor: The special value "currentColor" allows the text color to inherit its value from the element's parent. This can be particularly useful for dynamic color adaptation.

Keyword Values: CSS offers keyword values like "transparent," "inherit," "initial," and more, each with specific meanings and use cases.

Accessibility and Readability: When choosing text colors, it's crucial to consider accessibility and readability. Adequate contrast between text and background colors is essential for making content easily legible, especially for users with visual impairments. Web Content Accessibility Guidelines (WCAG) provide guidelines for ensuring accessible color contrast ratios.

Color Psychology: The choice of colors can significantly impact user perception and emotional response. Different colors evoke various feelings and associations. Consider the psychological aspects of colors when selecting text colors to align with your website's goals and messaging. For example, blue is often associated with trust and reliability, while red can convey excitement or urgency.

Consistency and Branding: Consistency in color usage across your website reinforces branding and visual identity. Using color consistently in text can help users associate specific colors with particular information, actions, or branding elements. This consistency contributes to a coherent and memorable user experience.

Responsive Design: In responsive web design, you may need to adjust text colors based on screen size, lighting conditions, or the overall design context to enhance the user experience. For example, you might opt for darker text on a light background for readability on mobile devices or in bright environments.

By carefully considering font properties and color choices in these examples and with these additional details, you can create visually appealing, accessible, and user-friendly web designs aligned with your brand and design goals.

Try this color picker for the web to explore colors that you might use in your work

Videos for Module 3: CSS Basics

Key Terms for Module 3: CSS Basics

No terms have been published for this module.

Quiz Yourself - Module 3: CSS Basics

Test your knowledge of this module by choosing options below. You can keep trying until you get the right answer.

Skip to the Next Question