Configuring the Responsive Emulator

This task lets you see the responsive Emulator on your site.

Register your Page Components for Emulation

To enable the emulator to support your pages, you must register your page components. See Registering Page Components for Simulation.

Specify the Device Groups

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

Activate Layout Mode for your Site

These procedures are used to enable the Layout mode on your site.

Configure the Breakpoints

Breakpoints:

  • Are used in responsive design.

  • Can be defined:

    • On the page template, from where the settings are copied to any pages created with that template.
    • On the page node, from where the settings are inherited by any child pages.
  • Define a title and a width:

    • The title describes the generic device grouping, with orientation if necessary; for example, phone, tablet, tabletlandscape.
    • The width defines the maximum width in pixels for that generic device grouping. For example, if the breakpoint phone has a width of 768 then that it the maximum width of the layout used for a phone device.
  • 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.

NOTE
If you are setting up a new project:
  • add breakpoints to the templates.
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.

Configuring Breakpoints using CRXDE Lite

  1. Using CRXDE Lite (or equivalent), navigate to either:

    • Your template definition.
    • The jcr:content node of your page.
  2. Under jcr:content create the node:

    • Name: cq:responsive
    • Type: nt:unstructured
  3. Under this create the node:

    • Name: breakpoints
    • Type: nt:unstructured
  4. Under the breakpoints node you can create any number of breakpoints. Each definition is a single node with the following properties:

    • Name: <descriptive name>
    • Type: nt:unstructured
    • Title: String * <descriptive title seen in Emulator>*
    • Width: Decimal * <value of breakpoint>*

Configuring Breakpoints using XML

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>

Add a Responsive Information Provider

NOTE
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

Enable Component Resizing for the Page

These procedures are required so you can resize components in the Layout mode.

Set Layout Container as Main Parsys

To set the main parsys of your page to be a layout container, define the parsys as:

wcm/foundation/components/responsivegrid

In either the:

  • Page component
  • Page template (for future use)

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" />
    

Include the Responsive CSS

CSS for Breakpoints using LESS

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

Styling Considerations

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

Resizing and Adaptive Image Compliance

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.

CAUTION
Custom stylesheet clientlibs must be loaded as part of the header for them to work properly on author and publish.

Enable the Layout Container Component for Page

These tasks allow authors to drag instances of the Layout Container component onto the page.

Enable the Layout Container Component for Page Editing

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.

Configure the Grid of the Layout Container

You can configure the number of columns available for each specific instance of layout container:

  1. 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.

  2. 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, ...

Nested Responsive Grids

There may be occasions when you find it necessary to nest responsive grids to support your project’s needs. However, keep in mind that Adobe’s recommended best practice is to keep the structure as flat as possible.

When you can not avoid using nested responsive grids, make sure:

  • All containers (containers, tabs, accordions, etc.) have the property layout = responsiveGrid.
  • Do not mix the property layout = simple in the container hierarchy.

This includes all the structural containers from the page template.

The column number of the inner container should never be greater than that of the outer container. The following example satisfies this condition. While the column number of the outer container is 8 for the default (desktop) screen, the column number of the inner container is 4.

container
  @layout = responsiveGrid
  cq:responsive
    default
      @offset = 0
      @width = 8
  container
  @layout = responsiveGrid
    cq:responsive
      default
        @offset = 0
        @width = 4
    text
      @text =" Text Column 1"
<div class="container responsivegrid aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--8 aem-GridColumn--offset--default--0">
  <div id="container-c9955c233c" class="cmp-container">
    <div class="aem-Grid aem-Grid--8 aem-Grid--default--8 ">
      <div class="container responsivegrid aem-GridColumn--default--none aem-GridColumn aem-GridColumn--offset--default--0 aem-GridColumn--default--4">
        <div id="container-8414e95866" class="cmp-container">
          <div class="aem-Grid aem-Grid--4 aem-Grid--default--4 ">
            <div class="text aem-GridColumn aem-GridColumn--default--4">
              <div data-cmp-data-layer="..." id="text-1234567890" class="cmp-text">
                <p>Text Column 1</p>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

Experience Manager


Connect with Experience League at Summit!

Get front-row access to top sessions, hands-on activities, and networking—wherever you are!

Learn more