CSS Display

The CSS display property is fundamental in controlling the layout and presentation of elements on a webpage. Understanding the various values and their implications is essential for creating responsive and visually appealing designs. This guide delves into the intricacies of the display property, providing detailed explanations, extensive code examples, and visual demonstrations to enhance your mastery of CSS layouts.

1. Introduction to CSS Display

The display property specifies how an element is displayed on the web page. It determines the type of rendering box used for an element, which affects its layout behavior and how it interacts with other elements. Mastering the display property is crucial for creating flexible and responsive web designs.

Back to Table of Contents

2. Display Property Values

The display property accepts a variety of values, each influencing the element's behavior differently. Below are the most commonly used values:

none: The element is not displayed at all (removed from the document flow).
block: The element generates a block-level box (e.g., <div>, <p>).
inline: The element generates an inline box (e.g., <span>, <a>).
inline-block: The element generates a block-level box that flows inline.
flex: The element behaves as a block-level flex container.
inline-flex: The element behaves as an inline flex container.
grid: The element behaves as a block-level grid container.
inline-grid: The element behaves as an inline grid container.
table: The element behaves like a table (e.g., <table>).
table-row: The element behaves like a table row (e.g., <tr>).
table-cell: The element behaves like a table cell (e.g., <td>).
list-item: The element behaves like a list item (e.g., <li>).
inherit: Inherits the display value from its parent.
initial: Sets the display property to its default value.
unset: Resets the display property to its inherited or initial value.

a. Display: none


/* Hiding an Element */
.hidden-element {
    display: none;
}
        

<div class="hidden-element">This text is hidden.</div>
        

Explanation: The display: none; rule removes the element from the document flow, making it invisible and not occupying any space.


b. Display: block


/* Making an Element Block-Level */
.block-element {
    display: block;
    width: 100%;
    background-color: #f0f8ff;
    padding: 10px;
}
        

<div class="block-element">This is a block-level element.</div>
        
This is a block-level element.

Explanation: The display: block; makes the element a block-level box, allowing it to take up the full width available and stack vertically with other block elements.


c. Display: inline


/* Making an Element Inline */
.inline-element {
    display: inline;
    color: #ff6347;
}
        

<span class="inline-element">This is an inline element.</span>
        
This is an inline element.

Explanation: The display: inline; makes the element an inline box, allowing it to flow within the text without starting on a new line or accepting width and height properties.


d. Display: inline-block


/* Making an Element Inline-Block */
.inline-block-element {
    display: inline-block;
    width: 200px;
    height: 100px;
    background-color: #98fb98;
    margin: 10px;
    vertical-align: top;
}
        

<div class="inline-block-element">Inline-Block Box 1</div>
<div class="inline-block-element">Inline-Block Box 2</div>
        
Inline-Block Box 1
Inline-Block Box 2

Explanation: The display: inline-block; combines characteristics of both inline and block elements. It allows the element to flow inline with other elements while accepting width and height properties.


e. Display: flex


/* Creating a Flex Container */
.flex-container {
    display: flex;
    justify-content: space-around;
    align-items: center;
    background-color: #ffe4e1;
    padding: 20px;
}
.flex-item {
    background-color: #add8e6;
    padding: 20px;
    margin: 10px;
    flex: 1;
    text-align: center;
}
        

<div class="flex-container">
    <div class="flex-item">Flex Item 1</div>
    <div class="flex-item">Flex Item 2</div>
    <div class="flex-item">Flex Item 3</div>
</div>
        
Flex Item 1
Flex Item 2
Flex Item 3

Explanation: The display: flex; creates a flex container, enabling flexible layouts. The justify-content: space-around; distributes space around the flex items, while align-items: center; vertically centers them within the container.


f. Display: grid


/* Creating a Grid Container */
.grid-container {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-gap: 20px;
    background-color: #f0f8ff;
    padding: 20px;
}
.grid-item {
    background-color: #ffdab9;
    padding: 20px;
    text-align: center;
}
        

<div class="grid-container">
    <div class="grid-item">Grid Item 1</div>
    <div class="grid-item">Grid Item 2</div>
    <div class="grid-item">Grid Item 3</div>
</div>
        
Grid Item 1
Grid Item 2
Grid Item 3

Explanation: The display: grid; creates a grid container, allowing for two-dimensional layouts. The grid-template-columns: repeat(3, 1fr); defines three equal-width columns, while grid-gap: 20px; adds spacing between grid items.


g. Display: table


/* Creating a Table-like Layout */
.table-container {
    display: table;
    width: 100%;
    background-color: #e6e6fa;
    border-collapse: collapse;
}
.table-row {
    display: table-row;
}
.table-cell {
    display: table-cell;
    border: 1px solid #ccc;
    padding: 10px;
    text-align: center;
}
        

<div class="table-container">
    <div class="table-row">
        <div class="table-cell">Cell 1</div>
        <div class="table-cell">Cell 2</div>
        <div class="table-cell">Cell 3</div>
    </div>
    <div class="table-row">
        <div class="table-cell">Cell 4</div>
        <div class="table-cell">Cell 5</div>
        <div class="table-cell">Cell 6</div>
    </div>
</div>
        
Cell 1
Cell 2
Cell 3
Cell 4
Cell 5
Cell 6

Explanation: The display: table; along with display: table-row; and display: table-cell; emulates the behavior of traditional HTML tables. This approach is useful for creating table-like layouts without using actual table elements.

Back to Table of Contents

3. Common Use Cases and Examples

The display property is versatile and can be used in various scenarios to achieve different layout effects. Below are some common use cases:


a. Creating a Navigation Bar with Flexbox


/* Flexbox Navigation Bar */
.navbar {
    display: flex;
    background-color: #333;
    padding: 10px;
}
.navbar a {
    color: white;
    padding: 14px 20px;
    text-decoration: none;
    text-align: center;
}
.navbar a:hover {
    background-color: #ddd;
    color: black;
}
        

<div class="navbar">
    <a href="#home">Home</a>
    <a href="#about">About</a>
    <a href="#services">Services</a>
    <a href="#contact">Contact</a>
</div>
        

Explanation: Using display: flex; on the navigation bar container allows the links to align horizontally. The flex container distributes space evenly among the navigation links, creating a responsive and clean navigation bar.


b. Centering an Element Horizontally and Vertically


/* Centering with Flexbox */
.center-container {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 200px;
    background-color: #ffebcd;
}
.center-item {
    background-color: #add8e6;
    padding: 20px;
    border-radius: 5px;
}
        

<div class="center-container">
    <div class="center-item">Centered Content</div>
</div>
        
Centered Content

Explanation: The combination of justify-content: center; and align-items: center; within a flex container centers the child element both horizontally and vertically.


c. Creating a Responsive Grid Layout


/* CSS Grid Layout */
.grid-layout {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
    grid-gap: 20px;
    background-color: #f0f8ff;
    padding: 20px;
}
.grid-item {
    background-color: #ffdab9;
    padding: 20px;
    text-align: center;
    border-radius: 5px;
}
        

<div class="grid-layout">
    <div class="grid-item">Grid Item 1</div>
    <div class="grid-item">Grid Item 2</div>
    <div class="grid-item">Grid Item 3</div>
    <div class="grid-item">Grid Item 4</div>
    <div class="grid-item">Grid Item 5</div>
    <div class="grid-item">Grid Item 6</div>
</div>
        
Grid Item 1
Grid Item 2
Grid Item 3
Grid Item 4
Grid Item 5
Grid Item 6

Explanation: The display: grid; along with grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); creates a responsive grid that adjusts the number of columns based on the available space. This layout ensures that grid items are evenly distributed and adapt to different screen sizes.

Back to Table of Contents

4. Changing Display Types

Changing the display property of elements can significantly alter their layout and behavior. This section explores how to switch between different display types and the effects of these changes.


a. Switching from Block to Inline


/* Changing Display from Block to Inline */
.switch-display {
    display: inline;
    background-color: #e0ffff;
    padding: 10px;
    margin: 5px;
}
        

<div class="switch-display">Inline Div 1</div>
<div class="switch-display">Inline Div 2</div>
        
Inline Div 1
Inline Div 2

Explanation: By default, <div> elements are block-level. Changing their display to inline allows them to flow within the same line, similar to inline elements like <span>.


b. Switching from Inline to Block


/* Changing Display from Inline to Block */
.switch-display-inline-block {
    display: block;
    background-color: #ffdab9;
    padding: 10px;
    margin: 5px 0;
}
        

<span class="switch-display-inline-block">Block Span 1</span>
<span class="switch-display-inline-block">Block Span 2</span>
        
Block Span 1
Block Span 2

Explanation: Inline elements like <span> do not accept width and height properties and flow within text. Changing their display to block allows them to behave like block-level elements, accepting width, height, and starting on a new line.


c. Display: inline-block


/* Using inline-block for Horizontal Alignment */
.inline-block-container {
    display: flex;
    justify-content: center;
    align-items: center;
    background-color: #f5f5dc;
    padding: 20px;
}
.inline-block-item {
    display: inline-block;
    width: 100px;
    height: 100px;
    background-color: #add8e6;
    margin: 10px;
    text-align: center;
    line-height: 100px;
    border-radius: 5px;
}
        

<div class="inline-block-container">
    <div class="inline-block-item">Box 1</div>
    <div class="inline-block-item">Box 2</div>
    <div class="inline-block-item">Box 3</div>
</div>
        
Box 1
Box 2
Box 3

Explanation: Using display: inline-block; allows block-level elements to flow inline, enabling horizontal alignment while still respecting width and height properties.

Back to Table of Contents

5. Display and Accessibility

While manipulating the display property can enhance visual layouts, it's essential to consider accessibility implications. Hiding elements using display: none; removes them from the accessibility tree, making them invisible to screen readers. Always ensure that hidden content is intentionally excluded from the user experience.


a. Hiding Content Visually but Keeping it Accessible


/* Visually Hidden but Accessible */
.visually-hidden {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}
        

<span class="visually-hidden">Accessible Hidden Text</span>
        
Accessible Hidden Text

Explanation: The .visually-hidden class hides content visually while keeping it accessible to screen readers. This technique is useful for providing additional context or information for assistive technologies without displaying it on the screen.

Back to Table of Contents

6. Best Practices

Implementing the display property effectively involves adhering to best practices that ensure maintainable, responsive, and accessible designs.

Understand Default Display Values: Know the default display values for HTML elements to avoid unexpected behavior.
Use Semantic HTML: Combine semantic HTML elements with appropriate display properties for better accessibility and SEO.
Leverage Modern Layouts: Utilize Flexbox and Grid for complex layouts instead of relying solely on traditional display values.
Avoid Excessive Nesting: Deeply nested elements can complicate layouts and impact performance.
Ensure Responsiveness: Implement responsive display properties to cater to various screen sizes and devices.
Optimize for Accessibility: Be mindful of how display manipulations affect screen readers and keyboard navigation.
Keep it Simple: Strive for simplicity in layout structures to enhance maintainability and readability of your CSS.

a. Understanding Default Display Values


/* No CSS needed; understanding defaults */
        

<div>Block Element</div>
<span>Inline Element</span>
        
<div>Block Element</div> <span>Inline Element</span>

Explanation: Recognizing the default display values of HTML elements prevents unintended layout issues. For instance, <div> is block-level by default, while <span> is inline.

b. Using Semantic HTML


/* Styling Semantic Elements */
header, footer, article, section {
    display: block;
    background-color: #e6e6fa;
    padding: 15px;
    margin-bottom: 10px;
}
        

<header>Header Content</header>
<article>Article Content</article>
<section>Section Content</section>
<footer>Footer Content</footer>
        
<header>Header Content</header> <article>Article Content</article> <section>Section Content</section> <footer>Footer Content</footer>

Explanation: Using semantic HTML elements like <header>, <footer>, <article>, and <section> enhances the document structure, accessibility, and SEO. Styling them appropriately ensures consistency and clarity in layouts.

c. Leveraging Flexbox for Layouts


/* Flexbox Container */
.flex-container {
    display: flex;
    flex-direction: row;
    justify-content: space-between;
    align-items: stretch;
    background-color: #ffe4e1;
    padding: 20px;
}
.flex-item {
    background-color: #add8e6;
    padding: 20px;
    margin: 10px;
    flex: 1;
    text-align: center;
    border-radius: 5px;
}
        

<div class="flex-container">
    <div class="flex-item">Flex Item 1</div>
    <div class="flex-item">Flex Item 2</div>
    <div class="flex-item">Flex Item 3</div>
</div>
        
Flex Item 1
Flex Item 2
Flex Item 3

Explanation: Flexbox simplifies the creation of complex layouts by providing flexible alignment and distribution of space among items within a container. The above example demonstrates how to distribute flex items evenly with space between them.

d. Creating Responsive Grids with CSS Grid


/* CSS Grid Layout */
.grid-responsive {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    grid-gap: 20px;
    background-color: #f0e68c;
    padding: 20px;
}
.grid-responsive-item {
    background-color: #ffdab9;
    padding: 20px;
    text-align: center;
    border-radius: 5px;
}
        

<div class="grid-responsive">
    <div class="grid-responsive-item">Grid Item 1</div>
    <div class="grid-responsive-item">Grid Item 2</div>
    <div class="grid-responsive-item">Grid Item 3</div>
    <div class="grid-responsive-item">Grid Item 4</div>
    <div class="grid-responsive-item">Grid Item 5</div>
    <div class="grid-responsive-item">Grid Item 6</div>
</div>
        
Grid Item 1
Grid Item 2
Grid Item 3
Grid Item 4
Grid Item 5
Grid Item 6

Explanation: CSS Grid offers a two-dimensional layout system, enabling the creation of complex and responsive grid layouts. The auto-fit and minmax functions allow grid items to adjust based on the available space, ensuring a fluid and adaptable design.

Back to Table of Contents

7. Common Pitfalls

While the display property is powerful, improper usage can lead to layout issues and accessibility problems. Here are some common pitfalls to avoid:

Overusing display: none;: Excessive use can hide essential content from users and screen readers.
Neglecting Browser Compatibility: Some display values like grid and flex may not be supported in older browsers.
Using Incorrect Display Types: Assigning inappropriate display values can disrupt the document flow and layout.
Ignoring Accessibility: Hiding elements without considering their role can impair navigation for assistive technologies.
Complex Nesting: Deeply nested flex or grid containers can complicate layouts and make maintenance difficult.

a. Overusing Display: none;


/* Overusing display: none; */
.hide-all {
    display: none;
}
        

<div class="hide-all">This content is hidden.</div>
<div class="hide-all">Another hidden content.</div>
        

Issue: Overusing display: none; can hide important content from users and assistive technologies, negatively impacting accessibility.

Solution: Use display: none; sparingly and ensure that hidden content is not essential for user interaction or information.

b. Neglecting Browser Compatibility


/* Using Grid without Fallback */
.grid-layout {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-gap: 20px;
}
        

<div class="grid-layout">
    <div>Item 1</div>
    <div>Item 2</div>
    <div>Item 3</div>
</div>
        
Item 1
Item 2
Item 3

Issue: Not all browsers support modern display values like grid and flex, leading to inconsistent layouts across different user environments.

Solution: Provide fallbacks or use feature queries to ensure compatibility with older browsers.

c. Using Incorrect Display Types


/* Incorrectly Changing a Table Cell to Block */
.table-cell-block {
    display: block;
    width: 100%;
}
        

<div class="table-container">
    <div class="table-row">
        <div class="table-cell-block">Cell 1</div>
        <div class="table-cell-block">Cell 2</div>
    </div>
</div>
        
Cell 1 Cell 2

Issue: Changing a table cell's display to block disrupts the table layout, causing cells to stack instead of aligning in rows.

Solution: Use appropriate display types that align with the intended layout structure.

d. Ignoring Accessibility


/* Hiding Important Content */
.important-hide {
    display: none;
}
        

<div class="important-hide">This is crucial information.</div>
        

Issue: Hiding important content can prevent users, especially those relying on assistive technologies, from accessing essential information.

Solution: Ensure that only non-essential content is hidden and that hidden elements do not contain critical information.

e. Complex Nesting


/* Nested Flex Containers */
.outer-flex {
    display: flex;
    justify-content: center;
    align-items: center;
}
.inner-flex {
    display: flex;
    flex-direction: column;
    background-color: #ffdab9;
    padding: 20px;
    border-radius: 5px;
}
        

<div class="outer-flex">
    <div class="inner-flex">
        <div>Nested Item 1</div>
        <div>Nested Item 2</div>
    </div>
</div>
        
Nested Item 1
Nested Item 2

Issue: Deeply nested flex or grid containers can complicate layouts and make CSS harder to maintain.

Solution: Keep layout structures as simple as possible and avoid unnecessary nesting. Utilize CSS methodologies like BEM to maintain clarity.

Back to Table of Contents

8. Conclusion

The CSS display property is a cornerstone of web design, providing the flexibility to create diverse and responsive layouts. By understanding the various display values and their effects, you can craft designs that are both aesthetically pleasing and functionally robust. This guide has explored the depths of the display property, offering comprehensive examples and explanations to solidify your understanding.

Mastering the display property empowers you to manipulate the layout and behavior of elements with precision, ensuring that your web projects meet modern design standards and deliver an exceptional user experience.

Continue experimenting with different display values and layout techniques to discover new possibilities and refine your CSS skills.

Back to Table of Contents

Previous: CSS Tables | Next: CSS Overflow

<
>