Responsive Styles
Chakra UI Vue supports responsive styles out of the box. Instead of manually adding
@media
queries and adding nested styles throughout your code, Chakra UI allows
you provide array values to add mobile-first responsive styles.
We use the
@media(min-width)
media queries to ensure values are mobile-first.
Responsive syntax relies on the breakpoints defined in the theme object. Chakra UI provides default breakpoints, here's what it looks like:
const breakpoints = {
sm: '30em', // 480px upwards
md: '48em', // 768px upwards
lg: '62em', // 992px upwards
xl: '80em', // 1280px upwards
'2xl': '96em' // 1536px upwards
}
To make styles responsive, you can use either the array or object syntax.
The Array syntax#
All style props accept arrays as values for mobile-first responsive styles. This is the recommended method.
<template>
<c-box
height="40px"
bg="green.400"
:width="[
'100%', // base
'50%', // 480px upwards
'25%', // 768px upwards
'15%', // 992px upwards
]"
/>
<!-- responsive font size -->
<c-box :fontSize="['sm', 'md', 'lg', 'xl']">Font Size</c-box>
<!-- responsive margin -->
<c-box :mt="[2, 4, 6, 8]" width="full" height="24px" bg="tomato" />
<!-- responsive padding -->
<c-box bg="papayawhip" :p="[2, 4, 6, 8]">
Padding
</c-box>
</template>
This works for every style props in the theme specification, which means you can change the style of most properties at a given breakpoint.
What it does#
This shortcut is an alternative to writing media queries out by hand. Given the following:
<c-box :width="['100%', 1 / 2, 1 / 4]" />
or
<c-box :width="['100%', 0.5, 0.25]" />
It'll generate a CSS that looks like this
.Box {
width: 100%;
}
@media screen and (min-width: 40em) {
.Box {
width: 50%;
}
}
@media screen and (min-width: 52em) {
.Box {
width: 25%;
}
}
NOTE: In the shortcut example '100%'
is used instead of 1
because in the default Chakra UI Vue theme, theme.sizes[1] = 0.25rem
. This means that using a prop like :width="1"
will render a width of 4px and not '100%'
To interpret array responsive values, Chakra UI converts the values defined in theme.breakpoints
and sorts them in ascending order. Afterward, we map the
values defined in the array to the breakpoints
// This is the default breakpoint
const breakpoints = {
sm: '30em',
md: '48em',
lg: '62em',
xl: '80em',
'2xl': '96em'
}
// Internally, we transform to this
const breakpoints = ['0em', '30em', '48em', '62em', '80em', '96em']
Here's how to interpret this syntax:
300px
: From0em
upwards400px
: From30em
upwards500px
: From48em
upwards
To skip certain breakpoints, you can pass
null
to any position in the array to avoid generating unnecessary CSS.
The Object syntax#
You can also define responsive values with breakpoint aliases in an object. Any undefined alias key will define the base, non-responsive value.
Let's say you have a CText
that looks like this:
This is a text
<c-text font-size='40px'>This is a text</c-text>
To make the fontSize
responsive using the object syntax, here's what you need
to do:
This is responsive text
<c-text :font-size="{ base: '24px', md: '40px', lg: '56px' }">
This is responsive text
</c-text>
Remember, Chakra UI uses the min-width media query for responsive design. The breakpoints are:
sm = 30em
,md = 48em
,lg = 62em
,xl = 80em
Here's how to interpret this syntax:
base
: From0em
upwardsmd
: From48em
upwardslg
: From62em
upwards
Customizing Breakpoints#
In some scenarios, you might need to define custom breakpoints for your
application. We recommended using common aliases like sm
, md
, lg
, and
xl
.
To define custom breakpoints, pass them as an object containing the aliases.
Note: Ensure the css unit of your breakpoints are the same. Use all
px
or allem
, don't mix them.
// 1. Import the utilities
import { extendTheme } from '@chakra-ui/vue'
// 2. Update the breakpoints as key-value pairs
const customBreakpoints = {
sm: '320px',
md: '768px',
lg: '960px',
xl: '1200px',
'2xl': '1536px'
}
// 3. Extend the theme
Vue.use(Chakra, {
extendTheme: {
breakpoints: customBreakpoints
...
}
}
// 4. Now you can use the custom breakpoints
<c-box :width={ base: '100%', sm: '50%', md: '25%' } />
Note: If you're using pixels as breakpoint values make sure to always provide a value for the
2xl
breakpoint, which by its default pixels value is "1536px".
Demo#
Here's a simple example of a marketing page component that uses a stacked layout on small screens, and a side-by-side layout on larger screens (resize your browser to see it in action):
Marketing
Finding customers for your new businessGetting a new business off the ground is a lot of hard work. Here are five ideas you can use to find your first customers.
<c-box p="4" :display="{ md: 'flex' }">
<c-box flex-shrink="0">
<c-image
rounded="lg"
:width="{ md: 40 }"
src="https://bit.ly/2jYM25F"
alt="Woman paying for a purchase"
/>
</c-box>
<c-box :mt="{ base: 4, md: 0 }" :ml="{ md: 6 }">
<c-text
font-weight="bold"
text-transform="uppercase"
font-size="sm"
letter-spacing="wide"
color="vue.600"
>
Marketing
</c-text>
<c-link
mt="1"
display="block"
font-size="lg"
line-height="normal"
color="black"
font-weight="semibold"
href="#"
>
Finding customers for your new business
</c-link>
<c-text mt="2" color="gray.500">
Getting a new business off the ground is a lot of hard work. Here are five
ideas you can use to find your first customers.
</c-text>
</c-box>
</c-box>
❤️ Contribute to this page
Caught a mistake or want to contribute to the documentation? Edit this page on GitHub!