Register for the new batch at KodNest and attend 5 days of free demo classes.Secure Your Spot Now!

Building Responsive Websites: Top 15 CSS Tricks and Techniques

Building Responsive Websites: Top 15 CSS Tricks and Techniques

Creating websites that look great on any device is no longer optional – it’s a necessity. This guide highlights 15 essential CSS techniques to help you build responsive, user-friendly websites. Here’s a quick overview of what you’ll learn:

  • Aspect Ratio: Maintain consistent proportions for videos, images, and layouts.
  • Relative Units: Use rem, em, vh, and vw for flexible, scalable designs.
  • Min(), Max(), and Clamp(): Control element sizes with precision.
  • Media Queries: Tailor layouts for specific screen sizes.
  • CSS Grid and Flexbox: Build adaptable layouts with ease.
  • Fluid Typography: Make text scale naturally across devices.
  • Box Sizing: Simplify width and height calculations.
  • Responsive Images: Optimize images for performance and clarity.

Whether you’re starting from scratch or enhancing an existing site, these techniques will help you create designs that adjust seamlessly to any screen size. Dive in to learn how to make your websites more functional and visually appealing.

Useful & Responsive Layouts, no Media Queries required

1. Using Aspect Ratio for Consistent Layouts

The aspect-ratio CSS property makes it much easier to maintain consistent proportions for elements across different screen sizes. It eliminates the need for complicated CSS tricks or JavaScript solutions.

.responsive-element {
  width: 100%;
  aspect-ratio: 16/9;
}

This property is perfect for use cases like video embeds, image galleries, hero sections, and card layouts. It ensures that designs built with a mobile-first approach adjust smoothly to any screen size.

You can also pair aspect-ratio with other properties like width to create layouts that are both flexible and proportional:

.image-container {
  width: min(100%, 800px);
  aspect-ratio: 4/3;
  object-fit: cover;
}

Unlike older methods, aspect-ratio simplifies your code, avoids layout shifts, and works seamlessly in modern browsers. The browser handles the math for you, calculating dimensions to maintain the specified ratio.

For browsers that don’t support aspect-ratio, you can add a padding-based fallback:

.fallback-container {
  width: 100%;
  height: 0;
  padding-bottom: 56.25%; /* For 16:9 ratio */
  position: relative;
}

This approach ensures your layouts remain consistent, even in environments where aspect-ratio isn’t supported.

With aspect-ratio simplifying proportions, next, we’ll look at how relative units can further improve responsive designs.

2. Working with Relative Units

Relative units play a key role in creating responsive websites that work well on various screen sizes. Building on the concept of aspect ratios, these units help make layouts more flexible and adaptable.

CSS provides several relative units that are particularly useful for responsive design:

.container {
  width: 80%;              /* Based on the parent element's width */
  font-size: 1.2rem;       /* Based on the root font size */
  padding: 2em;            /* Based on the element's font size */
  min-height: 50vh;        /* Based on the viewport height */
}

When it comes to typography and spacing, rem and em units are especially handy. rem is tied to the root font size, ensuring consistent scaling across components, while em adjusts relative to the font size of the current element, making it ideal for localized spacing:

.text-content {
  font-size: 1rem;        /* Standard text size */
  line-height: 1.5;       /* Proportional line height */
  margin-bottom: 1.5rem;  /* Uniform spacing */
}

.heading {
  font-size: clamp(1.5rem, 5vw, 2.5rem); /* Scales fluidly */
}

Viewport units like vh and vw are perfect for creating full-screen elements such as hero sections or overlay menus. Pairing percentages with viewport units enhances layout flexibility:

.sidebar {
  width: min(30%, 300px);
  padding: max(2vw, 1rem);
}

.main-content {
  width: clamp(50%, 70%, 1200px);
  margin: 0 auto;
}

These techniques ensure layouts remain adaptable and content stays easy to read on any screen size. Up next, we’ll explore the advanced sizing tools min(), max(), and clamp() to gain even more control over your designs.

3. Controlling Sizes with Min(), Max(), and Clamp()

CSS functions like min(), max(), and clamp() give you precise control over element sizes, making layouts more responsive to different screen dimensions.

The min() function ensures an element doesn’t exceed a specific size on smaller screens, while max() prevents it from shrinking below a certain size:

.container {
  width: min(50%, 300px);    /* Uses the smaller value between 50% and 300px */
  margin: min(2rem, 20px);   /* Keeps margins manageable on small screens */
}

.article {
  padding: max(1rem, 3vw);      /* Ensures spacing is comfortable */
  width: max(300px, 50%);       /* Avoids overly narrow content */
}

The clamp() function combines flexibility with boundaries, making it perfect for responsive designs:

.hero-section {
  width: clamp(300px, 80%, 1200px);     /* Fluid width with defined limits */
  padding: clamp(1rem, 3vw, 3rem);      /* Adaptive spacing */
}

To avoid padding and borders affecting the total width of an element, apply box-sizing: border-box:

.card {
  box-sizing: border-box;
  width: clamp(280px, 40%, 500px);
  padding: clamp(1rem, 2vw, 2rem);
}

For advanced responsive designs, you can pair these functions with media queries:

.sidebar {
  width: min(25%, 300px);
}

@media (max-width: 768px) {
  .sidebar {
    width: clamp(200px, 90%, 500px);
    margin: 0 auto;
  }
}

These functions are supported in most modern browsers and help create layouts that look great and work well on any device. By setting clear size limits, you can ensure your designs stay functional and visually balanced across all screen sizes.

4. Managing Text Overflow

Handling text overflow is a common challenge in responsive design, particularly when working with dynamic content inside fixed-width containers. Proper techniques ensure content remains legible and layouts stay intact across different devices.

Here are some essential CSS properties to manage text overflow effectively:

.text-container {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  width: clamp(200px, 50%, 600px);
}

For responsive card layouts, combining text overflow with flexible widths works well:

.card-title {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  width: clamp(150px, 100%, 300px);
  margin-bottom: 0.5rem;
}

.card-description {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  line-height: 1.5;
}

When dealing with multi-line content, the -webkit-line-clamp property limits the number of visible lines:

.multi-line {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

For browsers that don’t support -webkit-line-clamp, you can use this fallback approach:

.multi-line-fallback {
  max-height: 4.5em;
  position: relative;
  overflow: hidden;
}

.multi-line-fallback::after {
  content: '...';
  position: absolute;
  bottom: 0;
  right: 0;
  background: white;
  padding-left: 4px;
}

Adding an ellipsis (...) helps users recognize that the content has been truncated, which is especially useful on smaller screens. Once text overflow is handled, you can further refine layouts by using media queries to introduce custom breakpoints for enhanced flexibility.

5. Using Media Queries for Custom Breakpoints

Media queries let you adjust styles for different screen sizes, helping your design look great on any device. Building on techniques like relative units and clamp(), they give you precise control over layout changes.

/* Mobile-first approach */
.container {
  width: 100%;
  padding: 1rem;
}

/* Tablet breakpoint */
@media screen and (min-width: 768px) {
  .container {
    width: 90%;
    max-width: 960px;
    margin: 0 auto;
  }
}

/* Desktop breakpoint */
@media screen and (min-width: 1024px) {
  .container {
    width: 85%;
    max-width: 1200px;
  }
}

Want responsive navigation? Combine media queries with flexbox:

.nav {
  display: flex;
  flex-direction: column;
}

@media screen and (min-width: 768px) {
  .nav {
    flex-direction: row;
    justify-content: space-between;
  }
}

For grid layouts, adjust the number of columns based on the screen size:

.grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1rem;
}

@media screen and (min-width: 600px) {
  .grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media screen and (min-width: 1024px) {
  .grid {
    grid-template-columns: repeat(4, 1fr);
  }
}

Tips for Effective Media Queries

  • Start with mobile-first design: Define styles for small screens first, then add breakpoints for larger screens.
  • Test across devices and browsers: Make sure your design works well everywhere.
  • Keep it simple: Too many breakpoints can slow down performance.

You can also combine conditions for more complex layouts:

@media screen and (min-width: 768px) and (orientation: landscape) {
  .sidebar {
    width: 25%;
    float: right;
  }
}

6. Creating Flexible Grid Layouts

CSS Grid and Flexbox are powerful tools for building layouts that work seamlessly across devices. Grid is ideal for two-dimensional layouts (handling rows and columns together), while Flexbox shines in one-dimensional setups. These approaches align well with mobile-first design, ensuring layouts adapt smoothly to different screen sizes.

Here’s an example of a responsive grid using CSS Grid:

.grid-container {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 1rem;
}

You can combine Grid with Flexbox for even more versatile component-level designs. For instance:

.card {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

.card-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

Performance Optimization

To enhance layout performance, try these techniques:

  • Use fractional units (fr) and auto-fit or auto-fill to create layouts that adjust naturally to container widths.
  • Leverage Flexbox properties like flex-grow, flex-shrink, and flex-basis to fine-tune how components behave within their containers.
Layout Need Best Tool Use Case
Overall Page Structure CSS Grid Page sections, card layouts, image galleries
Component Layout Flexbox Navigation menus, card contents, form elements
Complex Nested Layouts Grid + Flexbox Dashboard interfaces, magazine-style layouts

"Studies have shown that responsive websites, often built using CSS Grid and Flexbox, have higher user engagement and conversion rates compared to non-responsive sites. For example, a study by Google found that 61% of users are unlikely to return to a mobile site they had trouble accessing" [3].

Browser Support Considerations

For broader browser compatibility, use feature queries to provide fallback options:

@supports (display: grid) {
  .container {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  }
}

@supports not (display: grid) {
  .container {
    display: flex;
    flex-wrap: wrap;
  }
}

This ensures older browsers can still render functional layouts while taking full advantage of modern features where supported.

Now that we’ve covered flexible grids, let’s dive into how fluid typography can improve readability across various devices.

7. Scaling Text with Fluid Typography

Typography needs a unique approach to stay readable across different devices, and that’s where fluid typography steps in. By combining viewport units with CSS functions, fluid typography allows text to scale naturally without relying on abrupt breakpoints. This method works well alongside other responsive techniques like grids and media queries.

Basic Implementation

The clamp() function is a powerful tool for creating smooth text scaling within set boundaries:

.heading {
  font-size: clamp(1.5rem, 3vw, 4rem);
  line-height: 1.2;
}

.body-text {
  font-size: clamp(1rem, 2.5vw, 1.5rem);
  line-height: 1.5;
}

Advanced Techniques

For more precise text scaling, you can mix viewport units with relative units:

.responsive-text {
  font-size: clamp(1rem, 1rem + 2vw, 3rem);
}

Here’s how it works: 1rem serves as the base size, 2vw adjusts the size based on the viewport width, and 3rem caps the maximum size. This ensures the text is readable, no matter the screen size.

Performance Optimization

To keep performance on point, combine rem units with viewport-based sizing and use proportional line heights. This approach ensures consistent rendering while adapting to various screen sizes.

"Studies have shown that implementing fluid typography can improve readability scores by up to 23% on mobile devices, particularly when combined with appropriate line heights and spacing" [2].

The trick is balancing flexibility with readability. Test your typography across multiple devices to make sure it works seamlessly.

With text scaling sorted, let’s dive into how box sizing can simplify layout management.

sbb-itb-f454395

8. Simplifying Layouts with Box Sizing

Getting width and height calculations right is key for responsive layouts. The box-sizing property makes this easier by including padding and borders in an element’s total dimensions.

By default, the content-box setting adds padding and borders to the content width, which can complicate responsive designs. Using box-sizing with border-box ensures that the total width calculation is predictable, making layout adjustments much smoother:

/* Global box sizing reset */
* {
  box-sizing: border-box;
}

/* Use content-box only for specific cases */
.special-element {
  box-sizing: content-box;
}

Take this responsive card example:

.card-container {
  width: 100%;
  max-width: 400px;
  padding: 20px;
  border: 2px solid #ddd;
}

When border-box is applied, the card’s total width – including padding and borders – stays within the 400px maximum. This consistency is essential for responsive designs where elements need to adjust seamlessly across different screen sizes.

Performance Tips

To keep things running smoothly:

  • Set box-sizing at the root level to maintain consistency across all elements.
  • Use content-box selectively for special cases where it’s really needed.
  • Let child elements inherit the box-sizing value from their parents for simplicity.

With sizing under control, you’re ready to explore how viewport units can further improve layout flexibility.

9. Making Videos Responsive

After setting consistent element dimensions with box sizing, it’s time to ensure multimedia content like videos works well on all screen sizes.

Here’s a CSS approach to create responsive video containers:

.video-container {
  position: relative;
  padding-bottom: 56.25%; /* Maintains a 16:9 aspect ratio */
  height: 0;
  overflow: hidden;
  max-width: 100%;
}

.video-container video,
.video-container iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

This padding technique keeps the aspect ratio intact while allowing videos to resize smoothly. If you need more control over how videos fit within their containers, use the object-fit property:

video {
  width: 100%;
  height: 100%;
  object-fit: contain; /* Fits the entire video inside the container, but may leave empty space */
}

For embedded videos from platforms like YouTube or Vimeo, wrap them in a responsive container:

.embed-container {
  position: relative;
  aspect-ratio: 16/9; /* Automatically calculates height based on width */
  width: 100%;
}

.embed-container iframe {
  position: absolute;
  width: 100%;
  height: 100%;
}

Need to handle different aspect ratios? Adjust the padding or aspect-ratio value based on the format. For example:

  • 16:9 widescreen: Use 56.25% padding or aspect-ratio: 16/9.
  • 4:3 legacy content: Use 75% padding or aspect-ratio: 4/3.
  • 21:9 cinematic: Use 42.85% padding or aspect-ratio: 21/9.

To further improve performance on smaller devices, pair these techniques with media queries:

@media screen and (max-width: 768px) {
  .video-container {
    max-height: 50vh; /* Caps video height on mobile screens */
  }
}

10. Controlling Overflow for Better Layouts

Handling overflow is crucial for creating clean, responsive layouts, especially when working with dynamic content that might spill beyond its container.

Here are some practical ways to manage overflow:

.container {
  max-height: 300px;
  overflow: auto; /* Scrollbars appear only when necessary */
}

.card {
  overflow: hidden; /* Cuts off content neatly */
}

.horizontal-scroll {
  overflow-x: auto;
  overflow-y: hidden; /* Allows horizontal scrolling only */
}

Common Overflow Values and Their Uses

Property Value Ideal For
auto Content with unpredictable length
hidden Fixed-size containers or media elements
scroll Extensive tables or long lists

To ensure layouts are responsive, you can tweak container sizes based on the viewport:

.responsive-container {
  max-width: 100%;
  max-height: 80vh;
  overflow: auto;
  position: relative;
}

@media screen and (max-width: 768px) {
  .responsive-container {
    max-height: 60vh;
    -webkit-overflow-scrolling: touch;
  }
}

Accessibility Tips for Scrollable Areas

Make sure scrollable content is accessible by following these steps:

  • Use tabindex="0" to make scrollable areas keyboard-navigable.
  • Add visible focus styles like this: :focus { outline: 2px solid #0066cc; }.
  • Implement ARIA roles so screen readers can identify scrollable regions.
.accessible-scroll {
  overflow: auto;
  outline: none;
}

.accessible-scroll:focus {
  outline: 2px solid #0066cc;
}

Once overflow is managed, you can focus on setting proper size limits with min-width and max-width to maintain a responsive design.

11. Setting Limits with Min-Width and Max-Width

Using min-width and max-width properties helps control the size of elements, ensuring layouts look good on different screen sizes while staying readable and visually balanced. These properties allow you to set boundaries that keep elements flexible without breaking the design.

Using Grid Systems for Flexible Layouts

Pairing min-width and max-width with CSS Grid can help create layouts that adapt effortlessly to various screen sizes:

.grid-container {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 20px;
  max-width: 1440px;
  margin: 0 auto;
}

.grid-item {
  min-width: 0;
  max-width: 100%;
}

Common Width Guidelines

Here are some typical width recommendations for responsive elements:

Element Type Recommended Width Limits Purpose
Main content max-width: 1200px For better readability
Navigation min-width: 320px Avoids overcrowding
Card components min-width: 250px Maintains visual balance

Implementing Width Limits in Mobile-First Design

Start with smaller screens and scale up using media queries. Here’s an example:

.article-content {
  width: 95%;
  min-width: 320px;
  max-width: 800px;
  margin: 0 auto;
}

@media screen and (min-width: 768px) {
  .article-content {
    width: 85%;
  }
}

Keeping Accessibility in Mind

Ensure your content resizes properly while staying accessible for all users:

.accessible-container {
  min-width: 320px;
  max-width: 100%;
  padding: 1rem;
  overflow-x: hidden;
}

12. Using CSS Frameworks

CSS frameworks like Bootstrap and Tailwind CSS simplify web development by offering pre-built components and utilities. They help ensure your designs look polished and function well across various devices.

Framework Benefits Ideal For
Bootstrap Extensive library, great docs Large projects, quick prototypes
Tailwind CSS Utility-first, highly flexible Custom designs, optimized sites
Pure CSS Lightweight and simple Small projects, basic layouts

These frameworks work hand-in-hand with custom CSS techniques, such as grids and media queries, to make responsive design more efficient.

Tips for Choosing the Right Framework

When deciding on a CSS framework, think about:

  • Project Size: Bigger projects often need more feature-rich frameworks.
  • Performance Goals: Utility-first frameworks like Tailwind can help fine-tune performance.
  • Team Skills: Pick something your team is already comfortable with.
  • Customization: Check if the framework allows the level of styling you need.

Example of Framework Implementation

Here’s a simple Bootstrap example to show how components adjust to different screen sizes:

<div class="container">
  <div class="row">
    <div class="col-sm-12 col-md-6 col-lg-4">
      <!-- Content adjusts based on screen size -->
    </div>
  </div>
</div>

Keep Performance in Mind

To avoid bloated CSS files, import only the parts you need:

/* Importing specific Bootstrap components */
@import 'bootstrap/scss/grid';
@import 'bootstrap/scss/utilities';

CSS frameworks provide a great starting point, but combining them with features like viewport units can help you create designs that are even more tailored to different screen sizes.

13. Using Viewport Units for Flexible Sizing

Viewport units allow elements to adjust based on the size of the browser window, making them a great choice for responsive designs. These units (vw, vh, vmin, vmax) are tied directly to the viewport’s dimensions, giving you precise control over layout adjustments.

Understanding Viewport Units

Unit Type Best Used For
vw Horizontal dimensions, like container widths
vh Vertical layouts, such as full-height sections
vmin Consistent sizing regardless of orientation
vmax Large, attention-grabbing elements

Practical Implementation

Here’s how you can use viewport units in your CSS:

.responsive-element {
  height: 50vh; /* Sets height to half the viewport */
  padding: 2vw; /* Padding adjusts with viewport width */
  margin-bottom: max(20px, 3vh); /* Ensures consistent spacing */
}

.dynamic-container {
  width: clamp(300px, 80vw, 1200px); /* Limits width between 300px and 1200px */
  min-height: 40vh; /* Minimum height is 40% of the viewport */
}

Mobile and Accessibility Considerations

When using viewport units, it’s important to keep accessibility and mobile devices in mind:

  • Combine viewport units with relative units like em or rem for better flexibility.
  • Test designs at various zoom levels to ensure they remain functional.
  • Check that text stays legible across all viewport sizes.
  • Account for device-specific quirks, especially with full-viewport layouts.
.accessible-container {
  padding: max(1rem, 2vw); /* Ensures padding is never too small */
  min-height: 50vh; /* Keeps a consistent minimum height */
}

Modern browsers support viewport units, making them a reliable choice for crafting responsive designs. They work seamlessly alongside other techniques like CSS grids and media queries, helping you build layouts that respond beautifully to different screen sizes.

Now, let’s dive into how grid templates can take your responsive designs to the next level.

14. Designing with Grid Templates

CSS Grid templates give you precise control over layouts using properties like grid-template-columns and grid-template-rows. They make it easier to create responsive designs that adjust seamlessly to different screen sizes.

Creating Flexible Grid Structures

Here’s an example of a flexible grid container:

.grid-container {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 20px;
  padding: 1rem;
}

This setup automatically adjusts the number of columns based on the available space, ensuring a clean and responsive design.

Advanced Grid Template Techniques

CSS Grid offers tools for a variety of use cases. Here’s a quick reference:

Template Type Use Case Example
Common Layouts Sidebar or image galleries grid-template-columns: 300px 1fr or repeat(auto-fill, minmax(200px, 1fr))
Grid Areas Managing complex layouts grid-template-areas: "header header" "nav main" "footer footer"

By combining grid templates with techniques like flexible units and media queries, you can create layouts that adapt smoothly to different screen sizes:

.responsive-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1rem;
}

@media (max-width: 768px) {
  .responsive-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 480px) {
  .responsive-grid {
    grid-template-columns: 1fr;
  }
}

Accessibility Considerations

Using grid-template-areas can enhance accessibility by defining clear, semantic regions for assistive technologies. This not only improves navigation but also keeps your layout flexible:

.layout {
  grid-template-areas: 
    "header header"
    "sidebar content"
    "footer footer";
}

Grid templates provide a powerful way to design layouts with precision and accessibility in mind. From here, you can focus on optimizing images to ensure smooth responsiveness across all devices.

15. Optimizing Images for Responsiveness

Getting images right is a key part of building websites that look great and work well on any device. By using the srcset attribute alongside responsive CSS properties like max-width: 100% and object-fit, you can make sure your images scale properly while staying sharp:

<img srcset="small.jpg 400w,
             medium.jpg 800w,
             large.jpg 1200w"
     sizes="(max-width: 600px) 400px,
            (max-width: 900px) 800px,
            1200px"
     src="large.jpg"
     alt="Responsive Image">
.responsive-image {
  max-width: 100%;
  height: auto;
  object-fit: cover;
  object-position: center;
}

Switching to modern formats like WebP and AVIF can also make a big difference. These formats compress images better than older ones like JPEG, cutting file sizes while keeping quality intact. WebP, for example, can significantly reduce load times.

Another helpful technique is lazy loading, which delays loading images that aren’t immediately visible on the screen:

<img src="image.jpg" 
     loading="lazy" 
     alt="Lazy loaded image">

For background images, use CSS properties like background-size: cover and background-position: center to ensure they adjust smoothly across screen sizes. Always test your images on different devices and under various network conditions to confirm they load quickly, scale correctly, and maintain quality.

"Optimizing images is crucial for improving page load times and user experience." – Addy Osmani, Engineering Manager at Google [1]

When combined with responsive grids and fluid typography, optimized images create a seamless and efficient design. This not only improves how your site looks but also ensures faster loading times, giving users a better experience on any device.

Conclusion

This guide has shown how CSS gives developers the tools to create designs that work well on any device. Features like min(), max(), and clamp() make it easier to build layouts that adjust smoothly across different screen sizes. When paired with fluid typography and flexible grid systems, these features help maintain a consistent look while adapting to various devices.

CSS frameworks such as Bootstrap and Tailwind offer pre-built components and utilities that simplify responsive design. They speed up development and ensure consistency across projects. By combining these frameworks with modern CSS techniques, developers can create responsive websites more efficiently.

Responsive design isn’t just about making things fit on a screen – it’s about delivering a great experience on any device. Using the techniques discussed here, along with thoughtful design principles, helps create websites that meet users’ needs effectively.

Web development is always changing, with new CSS features and approaches like container queries and mobile-first design leading the way. Stay connected with the developer community and keep an eye on trends to continue improving your skills.

Related posts

Leave a Reply

Your email address will not be published.Required fields are marked *