Responsive Layout is a mechanism for realizing responsive web design. This allows the user to create web pages that have a layout and dimensions dependent on the devices their users use.
This can be compared with the Mobile Web mechanisms, which use adaptive web design (primarily for the classic UI).
AEM realizes responsive layout for your pages using a combination of mechanisms:
Layout Container component
This component provides a grid-paragraph system to allow you to add and position components within a responsive grid. It can be used as the default parsys for your page and/or made available to authors in the component browser.
The default Layout Container component is defined under:
/libs/wcm/foundation/components/responsivegrid
You can define layout containers:
As a component that the user can add to a page.
As the default parsys for the page.
Both.
You can have the layout container as standard for the page, while allowing the user to add further layout containers within this; for example, to achieve column control.
Layout Mode
Once the layout container is positioned on your page you can use the Layout mode to position content within the responsive grid.
Emulator
This allows you to create and edit responsive websites that rearrange the layout according to device/window size by resizing components interactively. The user can then see how the content is rendered using the Emulator.
Although the Layout Container component is available in the classic UI, its full functionality is only available in the touch-enabled UI.
With these responsive grid mechanisms you can:
In an out-of-the-box installation, responsive layout has been configured for the We.Retail reference site. You must still activate the Layout Container component for other pages.
This tasks allow you to see the responsive Emulator on your site.
To enable the emulator to support your pages, you must register your page components. See Registering Page Components for Simulation.
To specify the device groups that appear in the Devices list of the emulator see Specifying the Device Groups.
To include the emulator, link your site to the device groups. See Adding the Devices List (for both the classic and touch-optimized UI).
These procedures are used to enable the Layout mode on your site.
Are used in responsive design.
Can be defined:
Define a title and a width:
Are visible as markers at the top of the page editor when you are using the emulator.
Are inherited from the parent node hierarchy and can be overridden at will.
There is a default (out-of-the-box) breakpoint which covers everything above the last configured breakpoint.
They can be defined using CRXDE Lite or XML.
If you are setting up a new project:
If you are migrating an existing project (with existing content), you must:
add breakpoints to the templates
add the same breakpoints to the existing pages
As inheritance is in operation you can limit this to the root page of your content.
Using CRXDE Lite (or equivalent), navigate to either:
jcr:content
node of your page.Under jcr:content
create the node:
cq:responsive
nt:unstructured
Under this create the node:
breakpoints
nt:unstructured
Under the breakpoints node you can create any number of breakpoints. Each definition is a single node with the following properties:
<descriptive name>
nt:unstructured
String
* <descriptive title seen in Emulator>
*Decimal
* <value of breakpoint>
*Breakpoints are located inside the <jcr:content>
section of the .context.html
under the appropriate template (or content) folder.
An example definition:
<cq:responsive jcr:primaryType="nt:unstructured">
<breakpoints jcr:primaryType="nt:unstructured">
<phone jcr:primaryType="nt:unstructured" title="{String}Phone" width="{Decimal}768"/>
<tablet jcr:primaryType="nt:unstructured" title="{String}Tablet" width="{Decimal}1200"/>
</breakpoints>
</cq:responsive>
This is only needed if the page component is not based on the foundation page component.
Copy the following cq:infoProviders
node structure into your parent page component:
/libs/foundation/components/page/cq:infoProviders/responsive
These procedures are required so you can resize components in the Layout mode.
To set the main parsys of your page to be a layout container, define the parsys as:
wcm/foundation/components/responsivegrid
In either the:
The following two examples illustrate the definition:
HTL:
<sly data-sly-resource="${'par' @ resourceType='wcm/foundation/components/responsivegrid'}/>
JSP:
<cq:include path="par" resourceType="wcm/foundation/components/responsivegrid" />
AEM uses LESS to generate parts of the necessary CSS, these need to be included for your projects.
You will also must create a client library to provide additional configuration and function calls. The following LESS extract is an example of the minimum that you must add to your project:
@import (once) "/libs/wcm/foundation/clientlibs/grid/grid_base.less";
/* maximum amount of grid cells to be provided */
@max_col: 12;
/* default breakpoint */
.aem-Grid {
.generate-grid(default, @max_col);
}
/* phone breakpoint */
@media (max-width: 768px) {
.aem-Grid {
.generate-grid(phone, @max_col);
}
}
/* tablet breakpoint */
@media (min-width: 769px) and (max-width: 1200px) {
.aem-Grid {
.generate-grid(tablet, @max_col);
}
}
The base grid definition can be found under:
/libs/wcm/foundation/clientlibs/grid/grid_base.less
Components held within a responsive container are resized (together with their respective HTML DOM elements) according to the responsive grid size. Therefore, in these circumstances, it is recommended to avoid (or update) definitions of fixed width (contained) DOM elements.
For example:
Before:
width=100px
After:
max-width=100px
Any resizing of a component within the grid will trigger the following listeners as appropriate:
beforeedit
beforechildedit
afteredit
afterchildedit
To properly resize and update the content of an adaptive image included in a responsive grid, you need to add an afterEdit
set to REFRESH_PAGE
listener into the EditConfig
file of every contained component.
For example:
<cq:listeners jcr:primaryType="cq:EditListenersConfig" afteredit="REFRESH_PAGE" />
The adaptive image mechanism is made available via a script that controls selection of the correct image for the current size of the window. It activates after the DOM is ready or when receiving a dedicated event. Currently the page must be refreshed to properly reflect the result of the user’s action.
Custom stylesheet clientlibs must be loaded as part of the header for them to work properly on author as well as publish.
These tasks allow authors to drag instances of the Layout Container component onto the page.
To allow authors to add further responsive grids to the content pages you need to enable the Layout Container component for your page. You can do this using either:
Author Environment
Use Design mode to activate the Layer Container component for a page.
Component Definition
Use allowedComponent
or a static include when defining the component.
You can configure the number of columns available for each specific instance of layout container:
Author Environment
You can configure the number of columns available for each specific instance of layout container.
To do this, use Design mode, then open the design dialog for the required container. Here you can specific how many columns will be available for positioning and sizing. The default is 12.
XML
Definitions for the responsive grid are specified in:
etc/design/<*your-project-name*>/.content.xml
The following parameters can be defined:
Number of columns available:
columns="{String}8"
Components that can be added to the current component:
components="[/libs/wcm/foundation/components/responsivegrid, ...