import styled from'styled-components';import breakpoint,{map}from'styled-components-breakpoint';constHeading=styled.h1`  color: #444;  font-family: sans-serif;  font-size: 12px;${breakpoint('md')`    font-size: 16px;`}${breakpoint('xl')`    font-size: 24px;`}${map({mobile'red', desktop'green'},color=>`color: ${color};`)}`;
import React from'react';import ReactDOM from'react-dom';import{ThemeProvider}from'styled-components';consttheme={  breakpoints{    xs,    sm576,    md768,    lg992,    xl1200,},};ReactDOM.render(<ThemeProvidertheme={theme}>{}</ThemeProvider>,document.getElementById('app'),);

If you’re using Typescript, you’ll also need to define the breakpoints and spacings on the theme.


If your breakpoints and spacings don’t need to be themable then you can use the static mixin factories.

: Configure the breakpoints

import styled from'styled-components';import{createBreakpoint, createMap}from'styled-components-breakpoint';constbreakpoints={  xs,  sm576,  md768,  lg992,  xl1200,};constbreakpoint=createBreakpoint(breakpoints);constmap=createMap(breakpoints);constHeading=styled.h1`  color: #444;  font-family: sans-serif;  font-size: 12px;${breakpoint('md')`    font-size: 16px;`}${breakpoint('xl')`    font-size: 24px;`}${map({md'red', xl'green'},color=>`color: ${color};`)}`;

⚡️ Component list

See in an example how you can use it:

import{ BreakpointsProvider }from'react-with-breakpoints';constbreakpoints={  small468,  medium768,  large1024,  xlargeInfinity,}constmyApp=()=>(<BreakpointsProviderbreakpoints={ breakpoints }><App/></BreakpointsProvider>);

NOTE: As you can see in the example above, the prop has been moved from HideAt and ShowAt to the BreakpointsProvider component. There is a disadvantage and an advantage of this. You can finally modify the breakpoints object at one place in your app, it became centralised. The disadvantage is that now you need to refactor your code if you manually set the breakpoints in your project if you used v2.

Prop name Type Value Default value Description Required
Here you can override the default Airbnb breakpoints. It needs to be an object with a strict shape, which is shown at the value row.
Callback invoked on breakpoint change.

HideAt is a stateless function, which helps you make your DOM leaner. It hides its children, when the proper criterias are met.

Let’s see it in action:

import{ HideAt }from'react-with-breakpoints';constmyApp=()=>(<HideAtbreakpoint="small"><div>Hello World!</div></HideAt>);

Here, the div with the ‘Hello World!’ text is going to appear only if you are viewing your website on a medium or larger sized screen. It’ll be hidden and removed from the DOM on small screen width. HideAt gets the current breakpoint (screen width described as a text eg.: small) from BreakpointsProvider.

NOTE: As HideAt and ShowAt function the same way (they do the opposite things of each other), they share the same props and prop-types.

Prop name Type Value Default value Description Required
Either one of these: , , , , , You can set either one of the values to tell the component where to hide or show its children.
Either one of these: , , , It’s used by withBreakpoints. Whenever there is a change with the breakpoints, the appropriate value will be passed down to HideAt or ShowAt.

ShowAt functions the opposite way as HideAt does. It reveals its children when the current breakpoint matches its breakpoint. (eg.: small, smallAndBelow)

As said above, ShowAt and HideAt share the same and , so please look at the prop descriptions at HideAt.

import{ ShowAt }from'react-with-breakpoints';constmyApp=()=>(<ShowAtbreakpoint="mediumAndBelow"><div>Hello World!</div></ShowAt>);

Add a Breakpoint

Earlier in this tutorial we made a web page with rows and columns, and it was responsive, but it did not look good on a small screen.

Media queries can help with that. We can add a breakpoint where certain parts of the design will behave differently on each side of the breakpoint.

Desktop Phone

Use a media query to add a breakpoint at 768px:


When the screen (browser window) gets smaller than 768px, each column should have a width of 100%:

/* For desktop: */.col-1 {width: 8.33%;}.col-2 {width: 16.66%;}.col-3 {width: 25%;} .col-4 {width: 33.33%;}.col-5 {width: 41.66%;}.col-6 {width: 50%;} .col-7 {width: 58.33%;}.col-8 {width: 66.66%;}.col-9 {width: 75%;} .col-10 {width: 83.33%;}.col-11 {width: 91.66%;}.col-12 {width: 100%;}@media only screen and (max-width: 768px) {  /* For mobile phones: */   {    width: 100%;  }}


Every utility class in Tailwind can be applied conditionally at different breakpoints, which makes it a piece of cake to build complex responsive interfaces without ever leaving your HTML.

There are four breakpoints by default, inspired by common device resolutions:

To add a utility but only have it take effect at a certain breakpoint, all you need to do is prefix the utility with the breakpoint name, followed by the character:

This works for every utility class in the framework, which means you can change literally anything at a given breakpoint — even things like letter spacing or cursor styles.

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):


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.

Here’s how the example above works:

  • By default, the outer is , but by adding the utility, it becomes on medium screens and larger.
  • When the parent is a flex container, we want to make sure the image never shrinks, so we’ve added to prevent shrinking on medium screens and larger. Technically we could have just used since it would do nothing on smaller screens, but since it only matters on screens, it’s a good idea to make that clear in the class name.
  • On small screens the image is automatically full width by default. On medium screens and up, we’ve constrained that width to a fixed size using .
  • On small screens, the content section uses to add some margin between the content and the image. This margin isn’t necessary in the horizontal layout, so we’ve used to undo that margin, and used to add some left margin instead.

We’ve only used one breakpoint in this example, but you could easily customize this component at other sizes using the , , or responsive prefixes as well.

Mobile First

By default, Tailwind uses a mobile first breakpoint system, similar to what you might be used to in Bootstrap or Foundation.

What this means is that unprefixed utilities (like ) take effect on all screen sizes, while prefixed utilities (like ) only take effect at the specified breakpoint and above.

Here’s a simple example that cycles through several background colors at different breakpoints (resize your browser to see the background color change):

Throughout the documentation, you’ll often see this interactive widget which we use to quickly demonstrate how some code would look on different screen sizes without forcing you to resize the browser — simply click the device icons at the top to see how the code below would render at that breakpoint:






Examples like this intentionally do not react to changing your browser size. This is by design — it allows even people reading the documentation on smaller screens to preview how some code would look on a desktop display.

Targeting mobile screens

Where this approach surprises people most often is that to style something for mobile, you need to use the unprefixed version of a utility, not the prefixed version. Don’t think of as meaning «on small screens», think of it as «at the small breakpoint».

Don’t use to target mobile devices

Use unprefixed utilities to target mobile, and override them at larger breakpoints

For this reason, it’s often a good idea to implement the mobile layout for a design first, then layer on any changes that make sense for screens, followed by screens, etc.

Targeting a single breakpoint

Tailwind’s breakpoints only include a and don’t include a , which means any utilities you add at a smaller breakpoint will also be applied at larger breakpoints.

If you’d like to apply a utility at one breakpoint only, the solution is to undo that utility at larger sizes by adding another utility that counteracts it.

Here is an example where the background color is red at the breakpoint, but teal at every other breakpoint:






Notice that we did not have to specify a background color for the breakpoint or the breakpoint — you only need to specify when a utility should start taking effect, not when it should stop.

По ту сторону призраков

События Tom Clancy’s Ghost Recon: Breakpoint разворачиваются спустя четыре года после Wildlands. Место действия — вымышленный архипелаг Авроа в Тихом океане, которым (архипелагом, не океаном) владеет гений современной инженерии и миллиардер Джейс Скелл. Его компания занимается производством чипов для дронов и беспилотников нового поколения для правительства США: на таких военных подрядах грех не заработать не на одну счастливую старость.

Но в 2023 году технологии Скелла неожиданно попали не в те руки. Архипелаг пропал с радаров и перестал выходить на связь, а грузовое судно, проплывавшее мимо Авроа, пошло ко дну. ЦРУ отправила спецотряд Ghost Recon для разведки на закрытой территории, а там бойцов встретили, что называется, с красной ковровой дорожкой: рой дронов, словно в какой-нибудь Star Trek Beyond, за считанные секунды изрешетил вертолёты, а весь отряд разбросало по Авроа. Мидас пропал без вести, Холт ранен и не может сражаться, а Уивера убил главный антагонист — Коул Уокер, которого как раз и сыграл Джон Бернтал. Играем мы за Номада — уцелевшего лидера отряда. После событий Wildlands он (или она, пол протагониста можно выбрать) собирался уйти на пенсию, но… не судьба. Теперь придётся отомстить за товарищей и только потом отправляться на покой. Сам по себе сюжет, конечно, не блещет оригинальностью, но со своей задачей — познакомить игрока с архипелагом — справляется. Второстепенные персонажи не подкачали; главный злодей раскрывается в лучших традициях Metal Gear:разочаровался в правительстве, солдат не ценят, поэтому воюю один против всех. Прочие антагонисты Breakpoint меркнут на его фоне, потому что их главная цель — орать на подчинённых, убивать мирных жителей и угрожать всем вокруг.

Quick start

Looking to quickly add Bootstrap to your project? Use the Bootstrap CDN, provided for free by the folks at MaxCDN. Using a package manager or need to download the source files? Head to the downloads page.

Copy-paste the stylesheet into your before all other stylesheets to load our CSS.

Add our JavaScript plugins, jQuery, and Tether near the end of your pages, right before the closing tag. Be sure to place jQuery and Tether first, as our code depends on them. While we use jQuery’s slim build in our docs, the full version is also supported.

And that’s it—you’re on your way to a fully Bootstrapped site. If you’re at all unsure about the general page structure, keep reading for an example page template.

Машина по уничтожению ЧВК

Для победы над Уокером придётся заручиться поддержкой аборигенов. И местные жители, и бывшие сотрудники компании Скелла, знающие технологии дронов вдоль и поперёк, просто так помогать освобождать остров не станут. Как обычно, чтобы втереться в доверие к нужным людям, придётся выполнять умопомрачительно интересные задания: принеси то, помоги тем, убей десяток врагов там, убей ещё с десяток здесь. Эта рутина из Wildlands почти не изменилась, разве что теперь всё привязано к человеческому сюжету.

Система снаряжения пришла сюда прямиком из The Division: всё оружие и предметы экипировки закодированы по цвету и ценности, как в любой встречной ММО. И работает оно… спорно. Допустим, я нашёл идеальную снайперскую винтовку и автомат, с которыми разношу всех в щепки. Потом получаю пушку выше уровнем, но слабее по характеристикам. Казалось бы, зачем её использовать? Да, можно воевать с тем, что нравится, вот только без нужного уровня снаряжения вас не пустят в активности с самыми вкусными наградами. Допустим, в какие-нибудь горячие точки пускают только при 150-м уровне, но за двадцать часов игры я добрался лишь до 90-го. В остальных случаях приходится тщательно выбирать из огромного списка тот ствол, который и подходит под любимый стиль игры, и не проседает по характеристикам. То есть, как и говорили разработчики, справиться с противниками можно любым оружием… а толку-то?

При этом сама по себе стрельба удалась на славу. Каждая пушка чувствуется по-своему: отдача, кучность, дальность, попадания по противникам — всё сделано на высшем уровне. При желании каждый ствол ещё и можно изменить на свой вкус. Для этого придётся выкупить все дополнительные запчасти в магазине и порядком побегать по побочным заданиям, но оно того стоит. Да и дрон теперь не просто дополнительная опция, но полноценный геймплейный элемент: помимо разведки, он лечит раненых товарищей и дистанционно усыпляет или убивает врагов. Он же, кстати, заменяет собой столь любимые французами вышки, открывая на карте точки интереса и примечательные локации. Под прокачку девайса отведена отдельная ветка, и пренебрегать ею — себе дороже. Есть только одно «но»: заниматься сбором запчастей, рецептов и схем придется очень часто, и это быстро утомляет. Потратив несколько часов на то, чтобы добыть новенький пистолет-пулемёт, я был безумно рад находке, вот только на следующем задании из противника выпал тот же самый гаджет, только с характеристиками получше. Подобные моменты с (по сути) бесполезной тратой времени бьют прямо в сердце.

Остров невезения

Путешествовать по миру можно как на своих двоих, так и на транспорте — и, поверьте, заниматься этим придётся постоянно, потому что задания будто бы нарочно разбросаны как можно дальше друг от друга. Однако в поездках есть на что полюбоваться: острова поражают размерами и качеством проработки. Густые леса, горные массивы, водопады, большие заводы и лаборатории, заброшенные лачуги и подземные бункеры. Точек интереса на карте столько, что проще собрать всех покемонов, чем осмотреть каждую. Рассекать по природе не надоедает даже в одиночку, поскольку вокруг постоянно что-то происходит. Наёмники захватывают учёных в заложники, беженцы пытаются починить машину, регулярные патрули… повод для перестрелки искать не приходится. Саундтрек тоже радует: здесь Ubisoft умело используют музыку, чтобы подчёркивать настроение даже самой маленькой и случайной сцены. Расстраивает разве что графика: версия для PS4, особенно в сравнении с той же Horizon: Zero Dawn или Red Dead Redemption 2, смотрится блёкло (на ПК всё гораздо лучше).

Но и чёрт с ним, беззаботно кататься по местным красотам вам всё равно никто не даст: кругом вражеские блокпосты. Их много. Очень много. Настолько, что возникает ощущение, словно где-то под землёй находится конвейер по производству солдат. Помимо пехоты, территорию охраняют вертушки, дроны и беспилотники: при их появлении нужно тут же упасть на живот и присыпать себя землёй (без шуток, это отдельная механика). А то, если заметят, к сотне наёмников рядом с вами прибавится ещё десяток элитных бойцов из отряда «Волков», которые не только больнее стреляют, но и бронированы до самых пят.

В сравнении с предыдущей частью ИИ заметно поумнел. Теперь отряды общаются между собой, стараются зайти со стороны, используют дронов, переживают по поводу убитых сослуживцев и вызывают подмогу, если оказываются в невыгодном положении. Войска Уокера делятся на всем знакомые типы: снайпер, пехотинец, пулемётчик, командир, артиллерист, штурмовик… и так далее, и тому подобное. Особый подход к ним искать не нужно, абсолютно все враги (да, слово сдержали) убиваются выстрелом в голову, но, играя в одиночку, переть в открытый бой всё равно не стоит. Противник давит всё же не умением, а числом и без пяти минут сказочной меткостью.

Дополнительные проблемы обеспечивает кривая реализация системы укрытий: герой попросту не может нормально прятаться. Во время прицеливания он либо высовывается из-за гипотетической стены, либо смотрит прямо в неё. Камера порой тоже сбоит, и, пока ты воюешь с глючной механикой, враг уже заходит за спину и убивает с пяти выстрелов. Противники-то прячутся за всякими мешками с песком, как профессионалы своего дела, и всегда точно знают, когда вы их выцеливаете. Со всякой растительностью та же беда: во время перестрелок разглядеть сидящего в траве наёмника почти нереально — а вот зоркий ИИ всегда в курсе, где вы. По идее, флора, наоборот, должна играть нам на руку и маскировать главного героя, вот только снайперам плевать: окуляры у них ничуть не хуже, чем у дронов и беспилотников. Поэтому умирать придётся часто, особенно в боях против высокоуровневых противников. После смерти вас откидывает на контрольную точку метрах в пятиста от задания, так что ещё один забег и, например, случайная встреча с патрулём вам, считай, обеспечены. Убитые враги после смерти оживают вместе с вами, поэтому зачистка локации в одиночку нередко затягивается на несколько часов. Без дрона, особенно на открытых пространствах, порой даже не понять, с какими вражескими силами предстоит столкнуться.

Always Design for Mobile First

Mobile First means designing for mobile before designing for desktop or any other device (This will make the page display faster on smaller devices).

This means that we must make some changes in our CSS.

Instead of changing styles when the width gets smaller than 768px, we should change the design when the width gets larger than 768px. This will make our design Mobile First:


/* For mobile phones: */ {  width: 100%;}@media only screen and (min-width: 768px) {  /* For desktop: */  .col-1 {width: 8.33%;}  .col-2 {width: 16.66%;}  .col-3 {width: 25%;}  .col-4 {width: 33.33%;}   .col-5 {width: 41.66%;}  .col-6 {width: 50%;}  .col-7 {width: 58.33%;}   .col-8 {width: 66.66%;}  .col-9 {width: 75%;}  .col-10 {width: 83.33%;}  .col-11 {width: 91.66%;}   .col-12 {width: 100%;}}


Set the unit type of the breakpoints. Either ’em’ or ‘px’. The default is ‘px’.

ReactDOM.render(<ReactBreakpoints    breakpoints={...}    breakpointUnit="em"><App ><ReactBreakpoints>,document.getElementById('root'))

By default, this library does NOT debounce the listener. However, by passing the prop to the component it will be enabled with a default delay.

ReactDOM.render(<ReactBreakpoints    breakpoints={...}    debounceResize={true}><App ><ReactBreakpoints>,document.getElementById('root'))

Set a custom delay in milliseconds for how the length of the debounce wait.

ReactDOM.render(<ReactBreakpoints    breakpoints={...}    debounceResize={true}    debounceDelay={100}><App ><ReactBreakpoints>,document.getElementById('root'))

In case you always want to default to a certain breakpoint.

constbreakpoints={  mobile320,  tablet768,  desktop1025,}ReactDOM.render(<ReactBreakpoints    breakpoints={breakpoints}    defaultBreakpoint={breakpoints.mobile}><App ><ReactBreakpoints>,document.getElementById('root'),)


Generate a media query using using the set of breakpoints defined in the theme.


  • — Required — The breakpoint name at which the style applies.
  • — Optional — The breakpoint name at which the style stops applying.


import styled from'styled-components';import breakpoint from'styled-components-breakpoint';exportconstHeading=styled.h1`  font-size: 12px;${breakpoint('tablet')`    font-size: 16px;`}${breakpoint('desktop')`    font-size: 24px;`}`;<Heading>The quick brown fox jumps over the lazy dog</Heading>;

Map a set of values to a set of media queries using the set of breakpoints defined in the theme.


  • — Required — The value or a map of values to style at each breakpoint.
  • — Required — The function used to map a value to style.


import styled from'styled-components';import{map}from'styled-components-breakpoint';constsizes={  sm'12px',  md'16px',  lg'20px',}constfontSize=({size})=>map(size,s=>`font-size: ${sizess};`);exportconstHeading=styled.h1`${fontSize}`;<Headingsize="sm">The quick brown fox jumps over the lazy dog</Heading><Headingsize={{mobile'sm', tablet'lg'}}>The quick brown fox jumps over the lazy dog</Heading>

Create a function to generate a media query using a set of pre-defined breakpoints.


breakpoints — Required — A set of breakpoints.


import{createBreakpoint}from'styled-components-breakpoint';exportconstbreakpoint=createBreakpoint({  xs,  sm300,  md600,  lg900,  xl1200,});

Create a function to map a set of values to a set of media queries using a set of pre-defined breakpoints.


breakpoints — Required — A set of breakpoints.


import{createMap}from'styled-components-breakpoint';exportconstmap=createMap({  xs,  sm300,  md600,  lg900,  xl1200,});

What is a Media Query?

A Media query is a CSS3 feature that makes a webpage adapt its layout to different screen sizes and media types.


We can target different media types under a variety of conditions. If the condition and/or media types meet, then the rules inside the media query will be applied, otherwise, they won’t.

The syntax may seem complicated at the beginning, so let’s explain each part one by one in detail…

@ Media Rule

We start defining media queries with @media rule and later include CSS rules inside the curly braces. The @ media rule is also used to specify target media types.


Inside the parenthesis, we set a condition. For example, I want to apply a larger font size for mobile devices. To do that, we need to set a maximum width which checks the width of a device:

Normally, the text size will be 14px. However since we applied a media query, it will change to 16px when a device has a maximum width of 480px or less.

Important: Always put your media queries at the end of your CSS file.

Media Types

If we don’t apply a media type, the @ media rule selects all types of devices by default. Otherwise, Media types come right after the @ media rule. There are many kinds of devices but we can group them into 4 categories:

  • all — for all media types
  • print — for printers
  • screen — for computer screens, tablets and, smart-phones
  • speech — for screen readers that “read” the page out loud

For example, when I want to select only screens, I will set the screen keyword right after the @ media rule. I also must concatenate the rules with the “and” keyword:


Breakpoints are maybe the most common term you will hear and use. A breakpoint is a key to determine when to change the layout and adapt the new rules inside the media queries. Let’s go back to our example at the beginning:

Here, the breakpoint is 480px. Now the media query knows when to set or overwrite the new class. Basically, if the width of a device is smaller than 480px, the text class will be applied, otherwise, it won’t.

Common Breakpoints: Is there a Standard Resolution?

One of the most commonly asked questions is “Which breakpoint should I use?”. There are a ton of devices on the market so we can’t and we shouldn’t define fixed breakpoints for each of them.

That’s why we can’t say that there is a standard resolution for devices, but there are some commonly used breakpoints in daily programming. If you’re using a CSS framework (like Bootstrap, Bulma, etc.) you can also use their breakpoints.

Now let’s see some common breakpoints for widths of devices:

  • 320px — 480px: Mobile devices
  • 481px — 768px: iPads, Tablets
  • 769px — 1024px: Small screens, laptops
  • 1025px — 1200px: Desktops, large screens
  • 1201px and more —  Extra large screens, TV

As I said above, these breakpoints can differ and there is no standard exactly defined, but these are some commonly used ones.


SlideshowSlideshow GalleryModal ImagesLightboxResponsive Image GridImage GridTab GalleryImage Overlay FadeImage Overlay SlideImage Overlay ZoomImage Overlay TitleImage Overlay IconImage EffectsBlack and White ImageImage TextImage Text BlocksTransparent Image TextFull Page ImageForm on ImageHero ImageBlur Background ImageChange Bg on ScrollSide-by-Side ImagesRounded ImagesAvatar ImagesResponsive ImagesCenter ImagesThumbnailsBorder Around ImageMeet the TeamSticky ImageFlip an ImageShake an ImagePortfolio GalleryPortfolio with FilteringImage ZoomImage Magnifier GlassImage Comparison Slider


Fullscreen VideoModal BoxesDelete ModalTimelineScroll IndicatorProgress BarsSkill BarRange SlidersTooltipsDisplay Element HoverPopupsCollapsibleCalendarHTML IncludesTo Do ListLoadersStar RatingUser RatingOverlay EffectContact ChipsCardsFlip CardProfile CardProduct CardAlertsCalloutNotesLabelsCirclesStyle HRCouponList GroupList Without BulletsResponsive TextCutout TextGlowing TextFixed FooterSticky ElementEqual HeightClearfixResponsive FloatsSnackbarFullscreen WindowScroll DrawingSmooth ScrollGradient Bg ScrollSticky HeaderShrink Header on ScrollPricing TableParallaxAspect RatioResponsive IframesToggle Like/DislikeToggle Hide/ShowToggle Dark ModeToggle TextToggle ClassAdd ClassRemove ClassActive ClassTree ViewRemove PropertyOffline DetectionFind Hidden ElementRedirect WebpageZoom HoverFlip BoxCenter VerticallyCenter Button in DIVTransition on HoverArrowsShapesDownload LinkFull Height ElementBrowser WindowCustom ScrollbarHide ScrollbarDevice LookContenteditable BorderPlaceholder ColorText Selection ColorBullet ColorVertical LineDividersAnimate IconsCountdown TimerTypewriterComing Soon PageChat MessagesPopup Chat WindowSplit ScreenTestimonialsSection CounterQuotes SlideshowClosable List ItemsTypical Device BreakpointsDraggable HTML ElementJS Media QueriesSyntax HighlighterJS AnimationsGet Iframe Elements

С этим читают