As we talked earlier, the mobiles appear to be a greater part of all of the devices the Internet get accessed through. So it's not a big surprise the way web pages get created and structured more and more gets to turn around that the responsive frameworks and the most popular amongst them – the Bootstrap framework – now come to be the only acceptable way to create a web page – responsive and mobile-friendly. Additionally, some new ways to get things done appear, like the Accelerated Mobile Pages by Google or AMP – a stripped down to the bone HTML code eventually spiced up with a list of allowed scripts by (of course) the AMP library – endorsed by its creator and claiming to provide your content a faster and better appearance on mobiles, free Google CDN caching of your content and a better ranking in the search results. That's what they claim.
Due to the way they get constructed, AMP pages themselves can't be taken as fully functional pages, but rather as alternative mirrors which your potential audience can get access on from their mobile devices and is what the AMP web builder says is true – it has good loading times and fast access to the content you would like to share.
The AMP standard is generally mobile-oriented and the most logical thing to conclude is - it also has some means to handle some different screen widths since, as we took a quick glimpse not so while ago, it’s not impossible to make a normal Bootstrap and AMP page as one, but it's rather an interesting experience. As it looks like, the AMP tries to also prove itself as a mobile-friendly framework in a way – providing a strict and a bit complicated scheme marking up the content and a few custom layout attributes which can be handled by their script only for achieving some of the tasks we got used to as granted in The Bootstrap framework.
Let's take a look at how the AMP page markup should be written in order to act responsively.
Let's start with the simplest thing – the images. As you probably know – there is no such thing as
<div class="img"><img></div> tag in AMP. What they use instead is their own
<amp-img> tag. In order to behave responsively it has to have the
layout="responsive" attribute (we'll get to the layout attribute and its possible values in just a bit) and to probably make the page load a bit faster here we have the so-called
srcset attribute following the good classical
src What it does is providing to AMP base script a list of image – screen width pairs separated by comma defining which image to get displayed on a page according to the viewport width.
srcset="/assets/images/img-xs.jpg 575w, /assets/images/img-md.jpg 767w" and so on. So, we guess the right way to think about this as for a
max-width rule concerning not the viewport, but the image itself.
Additionally, if an AMP image needs to have a responsive appearance (with the responsive layout defined) it also needs to have its dimensions like
height explicitly provided. This seems confusing – if an image will scale up/ down according to the viewport why do we need to defied its dimensions? The answer – in order the AMP script to be able to get the images proportions and scale it properly since that's what
layout="responsive" actually does -
Maybe here comes the place to mention a small quote from the AMP official documentation:
"These things are possible with pure CSS – but they're much harder, and require a myriad of hacks"
And we totally agree with it.
Let's take a look at all of the possible layouts in AMP. There are seven of them available and covering some of the possible responsive appearances a web page might have. Some of them like
responsive explicitly require the
height attributes being defined, some need just one of them and some don't need them in order to function properly.
If you need an element to not take place on a page but only in your code (or
display:none; ) the AMP way doing it is assigning
layout="nodisplay" to it. No
height are required. The AMP responsive framework also has a layout for nonresponsive elements. Defining
layout="fixed" and explicitly providing its
height will get you a nice nonresponsive element looking exactly the same on any screen width.
As we mentioned above the responsive behavior gets achieved by
height are still needed. The width of the element spans the whole width of its container and the height follows proportionally. The next layout is a bit confusing – it fixes the element's height only so it takes the space available to it, but remains fixed in height. The attribute – value pair is
layout = "fixed-height" and obviously -
height is required. So this AMP-responsive element will have the same height on a 300px phone and 2880px retina display.
If you need your element to entirely cover its parent you need to assign
layout="fill" to it. No
height are required.
The opposite behavior – the element taking as much space as its children require gets achieved by assigning
layout="container" to it. No
width required either.
And finally – as The Bootstrap framework embraces flexbox so tries to do AMP providing an optional
layout="flex-item" option. Elements set this way need not
height attributes. The layout pretty much works like
display:flex CSS declaration.
So the AMP manages the elements layouts when they are explicitly defined. If not – it tries to guess the right one to use in the following sequence:
- If we have only
height defined it assigned
- When the
sizes attributes are present the layout to be assigned is
- When only
height take place (no
sizes ) we're getting
layout="fixed" - one size on all viewports
- If there are no
height defined the elements gets assumed to be acting as container and therefore we have
layout = "container"
When it comes to the media queries, surprisingly, AMP has no specific restrictions – we can use them in the good classical way we got used to – as long as we define them in the
amp-custom style tag. Since we can't reference them from a stylesheet – remember?
Additionally, the AMP introduces another attribute called
media which comes to take place as some kind of element-specific query hiding / displaying it according to the viewport width. While using - it is pretty much CSS like – all you need to do is write the appropriate part of the
@media rule as a value to the
media attribute. For example – if you need to have an image shown only on the small screens you can set
media="max-width: 767px" as an attribute to the
amp-image tag referencing it.
The layout feature grants you easy, per-element management over the way your element needs to be rendered on screen. Many of these things are possible with pure CSS-- but they're much harder, and require a myriad of hacks. Utilize the
layout feature as an alternative.
The following values can surely be utilized in the
heightare actually undefined?
In a few cases if width or height are not really established, the AMP runtime can certainly default these kinds of values as the following:
amp-pixel: Both width and height are default to 0.
amp-audio: The default width and height are actually supposed from a web browser.
layoutcharacteristic actually is not specified ?
layout characteristic actually is not defined, AMP aims to deduce or predict the appropriate value:
@media to know how the webpage format looks and behaves, as you would do on any other website. When the internet browser window changes size or orientation, the media queries are re-evaluated and elements are hidden and shown based on the new results.
Another extra element for responsive concept readily available in AMP is the
media property. This attribute can possibly be employed on each and every AMP element; it performs much like media queries in your global stylesheet, but only impacts the certain component on a single webpage.
Here you can see some examples.
<amp-img media="(min-width: 650px)" src="wide.jpg" width=466 height=355 layout="responsive"> </amp-img>
Depending on the display width, one or the other will definitely be delivered and rendered.
<amp-img media="(max-width: 649px)" src="narrow.jpg" width=527 height=193 layout="responsive"> </amp-img>
That's pretty much how AMP try to achieve responsiveness to the pages meant to be for mobile devices mostly. It's not a full-sized responsive framework like The Bootstrap and the way things get done are a bit different than the regular way we are used to, but in case you want your pages validated as AMP - that's the way you need to go for. At least now you know where to start from.