Make Pre Text Wrap

A complete guide to handling preformatted text with CSS white-space for responsive, mobile-friendly code displays

The Pre Tag Wrapping Problem

If you've worked with HTML's <pre> element for displaying code, you've likely encountered a frustrating issue: preformatted text doesn't wrap on mobile devices or narrow containers. The text extends beyond the visible area, creating horizontal scrollbars that degrade user experience.

This happens because the <pre> element is designed to preserve whitespace and line breaks exactly as they appear in the source code. While this is essential for displaying code snippets and preformatted content, it creates challenges in today's responsive web design landscape where content must adapt to various screen sizes.

Fortunately, CSS provides straightforward solutions to make pre text wrap while maintaining the formatting that makes code readable. Understanding the white-space property and its various values gives you precise control over how text behaves in preformatted elements.

The white-space property controls how whitespace within an element is handled, and the pre-wrap value specifically addresses the wrapping challenge while preserving your code's formatting. For developers building modern web applications, mastering this CSS property is essential for creating seamless user experiences across all devices.

What You'll Learn

  • The default behavior of pre tags and why wrapping fails
  • CSS solutions using white-space: pre-wrap
  • Handling edge cases with long lines and unbroken strings
  • Performance considerations for responsive code displays

For a comprehensive approach to responsive design implementation, explore our /services/web-development/ expertise in building mobile-first websites.

Understanding Pre Tag Default Behavior

The HTML <pre> element, short for "preformatted text," serves a specific purpose in web development: it displays text exactly as it appears in the source code, preserving whitespace, line breaks, and spacing.

By default, browsers apply specific CSS to pre elements that prioritizes content preservation over layout flexibility:

pre {
 display: block;
 white-space: pre;
 font-family: monospace;
}

The critical property here is white-space: pre, which tells the browser to preserve all whitespace and only break lines at explicit newline characters in the source. This means long lines of code or text will extend beyond container boundaries instead of wrapping to fit.

Why This Matters for Responsive Design

In a mobile-first, responsive design approach, content must adapt to various viewport sizes. When a code snippet contains a line longer than the mobile screen width, users face several issues:

  • Horizontal scrolling disrupts the reading experience
  • Content becomes inaccessible without explicit user interaction
  • Poor mobile UX affects bounce rates and engagement
  • Accessibility challenges for users with motor impairments

Modern web applications must address this challenge to provide seamless experiences across all devices. When implementing responsive code displays, consider how your CSS choices impact both usability and accessibility. Our team specializes in AI-powered web development solutions that combine modern design principles with intelligent automation.

The Technical Root Cause

The pre element's default behavior stems from its original purpose: displaying preformatted text exactly as typed. This was designed for text terminals where all characters had fixed widths and line breaks occurred at predictable positions. In today's varied viewport landscape, this same behavior creates layout challenges that require CSS intervention.

Understanding this historical context helps you make informed decisions about when to preserve default behavior and when to override it for better user experiences.

The CSS white-space Property

The white-space property in CSS controls how whitespace within an element is handled. It determines whether and how white space is collapsed, and whether lines can wrap at soft wrap opportunities.

white-space Values Comparison

ValueNew LinesSpaces/TabsText WrappingEnd-of-Line Spaces
normalCollapseCollapseWrapRemove
prePreservePreserveNo wrapPreserve
pre-wrapPreservePreserveWrapHang
pre-linePreserveCollapseWrapRemove

The Key: white-space: pre-wrap

The pre-wrap value provides the best of both worlds:

  • Preserves newlines and indentation exactly as written
  • Wraps text at container boundaries when necessary
  • Handles the final line gracefully with hanging punctuation

This makes pre-wrap the ideal choice for displaying code while maintaining responsive layout behavior.

Browser Support

The white-space: pre-wrap value is widely supported across all modern browsers:

  • Chrome/Edge: Full support since version 1
  • Firefox: Full support since version 1
  • Safari: Full support since version 3
  • Mobile browsers: Universal support

This means you can confidently use pre-wrap without worrying about compatibility issues. For developers working on complex front-end projects, understanding these foundational CSS properties is essential. Check out our guide on advanced CSS selectors to expand your styling toolkit.

CSS for pre-wrap
1/* Basic pre-wrap solution */2pre {3 white-space: pre-wrap;4 word-wrap: break-word;5}

Practical Solutions for Pre Tag Wrapping

Solution 1: Basic CSS for Pre Wrap

The simplest approach combines white-space: pre-wrap with word-wrap: break-word (now aliased as overflow-wrap):

pre {
 white-space: pre-wrap;
 word-wrap: break-word;
 overflow-wrap: break-word;
}

This combination ensures:

  1. Formatting preserved - Newlines and indentation remain intact
  2. Wrapping enabled - Text wraps at container boundaries
  3. Long strings broken - Very long words or URLs don't overflow

Solution 2: Container Width Management

For complete control, set explicit widths and allow natural wrapping:

pre {
 white-space: pre-wrap;
 max-width: 100%;
 overflow-x: auto;
 padding: 1rem;
 box-sizing: border-box;
}

Solution 3: Handling Edge Cases with Long Strings

When dealing with extremely long unbroken strings like URLs or minified code, use word-break for more aggressive breaking:

pre {
 white-space: pre-wrap;
 word-break: break-all;
 overflow-wrap: break-word;
}

Use break-all cautiously, as it may break within words at any character, potentially reducing readability in some contexts.

Solution 4: The wbr Element for Fine-Grained Control

For predictable line breaks in specific content, use the HTML <wbr> element to indicate soft break opportunities. This element tells the browser where a line break is acceptable without forcing a break:

<pre>function veryLongFunctionNameWithManyParameters(
 param1, param2, param3, param4, param5
) { ... }</pre>

This technique is particularly useful for long URLs or specific formatting requirements where you want more control over where breaks occur.

For comprehensive technical implementations and expert guidance on optimizing your development workflow, explore our technology consulting services to enhance your technical capabilities.

Performance Considerations

When implementing pre tag wrapping for responsive designs, consider the performance implications to maintain optimal page load times and user experience.

Text Rendering Performance

The white-space property is a CSS layout property that doesn't require JavaScript or complex calculations. However, how text wraps can affect:

  • Cumulative Layout Shift (CLS): Text that reflows after initial render can cause layout shifts. Set explicit container dimensions when possible.

  • First Contentful Paint (FCP): Simple CSS rules render faster. Avoid complex workarounds that add unnecessary DOM elements.

  • Text Rendering Speed: white-space: pre-wrap has minimal performance impact compared to other layout properties.

Efficient CSS Implementation

For high-traffic pages with many code blocks, optimize your CSS:

/* Group selectors for shared properties */
pre, code, .code-block {
 white-space: pre-wrap;
 overflow-wrap: break-word;
}

/* Specific overrides only */
pre {
 max-height: 400px;
 overflow-y: auto;
}

Mobile-Specific Optimizations

On mobile devices, consider these performance factors:

  • Touch targets: Ensure scrolling areas have appropriate touch-friendly sizing
  • Viewport units: Use vw units sparingly for container widths
  • GPU acceleration: Complex overflow handling may trigger hardware acceleration

At Digital Thrive, we prioritize performance-first development with every CSS property choice carefully considered for its impact on Core Web Vitals and overall user experience. Our team implements SEO-friendly development practices that combine technical excellence with search visibility.

Code Block Optimization

For sites with many code snippets:

  1. Lazy load code blocks that are below the fold
  2. Use syntax highlighting libraries efficiently (load on demand)
  3. Minimize pre element nesting in your HTML structure
  4. Test on low-end devices to ensure smooth scrolling behavior

Discover more about our approach to optimized web applications that deliver exceptional performance across all devices and connection speeds.

Best Practices for Responsive Code Displays

Mobile-First Approach

Start with mobile styles and enhance for larger screens:

/* Base styles (mobile-first) */
pre {
 white-space: pre-wrap;
 font-size: 14px;
 padding: 0.75rem;
}

/* Tablet and up */
@media (min-width: 768px) {
 pre {
 font-size: 15px;
 padding: 1rem;
 }
}

/* Desktop */
@media (min-width: 1024px) {
 pre {
 font-size: 16px;
 max-width: 800px;
 }
}

Container Considerations

  • Set max-width: 100% on pre elements to prevent overflow
  • Use box-sizing: border-box for predictable sizing
  • Consider horizontal scrolling as a fallback for very long lines
  • Test with real code content, not just short examples

Following these CSS best practices ensures your code displays work seamlessly across all devices. For additional insights on writing maintainable CSS, explore our comprehensive guide on taming advanced CSS selectors.

Implementation Checklist

Ensure complete pre tag wrapping support

Apply white-space: pre-wrap

Enable text wrapping while preserving formatting

Add overflow-wrap: break-word

Handle long unbroken strings like URLs

Set max-width: 100%

Prevent horizontal overflow on small screens

Test with real code

Verify wrapping behavior with actual content

Check accessibility

Ensure content remains readable and accessible

Measure performance

Verify no negative impact on Core Web Vitals

Common Mistakes to Avoid

Mistake 1: Using overflow: hidden

/* AVOID THIS */
pre {
 overflow: hidden;
}

Problem: Content gets cut off, making code inaccessible.

Solution: Use overflow-x: auto to enable scrolling instead.

Mistake 2: Incomplete CSS Coverage

/* INCOMPLETE */
pre {
 white-space: pre-wrap;
 /* Missing overflow-wrap for long strings */
}

Problem: Long URLs or unbroken strings still overflow.

Solution: Always include overflow-wrap: break-word.

Mistake 3: Ignoring Mobile Viewport

Problem: Not testing on actual mobile devices or narrow viewports.

Solution: Use browser DevTools device emulation and test on real devices.

Mistake 4: Breaking All Words Aggressively

/* OVERLY AGGRESSIVE */
pre {
 word-break: break-all;
 /* Can break mid-variable, reducing readability */
}

Problem: Breaks text at inappropriate points, harming readability.

Solution: Use overflow-wrap: break-word instead, which only breaks when necessary.

Mistake 5: Forgetting Container Context

Problem: Pre styles work in isolation but fail within nested containers.

Solution: Test pre elements within their actual page context, including parent containers with their own overflow or width constraints.

Avoid these common pitfalls by following our web development best practices for robust, maintainable CSS implementations that scale with your project.

Frequently Asked Questions

Need Help with Responsive Web Development?

Our team builds performant, mobile-first websites using modern CSS techniques and best practices.