Published: September 20, 2018
Responsive Images with PatternLab and Drupal - the easy way
Responsive images in PatternLab get a bit of a bad rap sometimes, because they are tricky to have in PL and Drupal. Here's my "easy way" of achieving it.
This came up today in the DrupalTwig Slack (join it). A user wanted to know how to use responsive images with the Emulsify Drupal theme. I don't use the Emulsify theme (yet - I will soon), though Four Kitchens, the geniuses who created it, have responsive images built in. Recently I created my own - simple and rudimentary, but it works a treat.
I first create a "Responsive Image" pattern. In this I have two files - responsive-image.twig and responsive-image.yml. Here's the contents:
responsive-image.twig:
<img srcset="{{ image_src_sets }}" sizes="{{ image_sizes }}" src="{{ image_src }}">
responsive-image.yml:
image_src_sets:
join():
- 'https://placeimg.com/500/500/nature 500w, '
- 'https://placeimg.com/1000/750/nature 1000w, '
- 'https://placeimg.com/1440/475/nature 1440w'
image_sizes: '(max-width: 600px) 100vw, (max-width: 960px) 100vw'
image_src: ''https://placeimg.com/1440/475/nature'
To use it in another component, I just call a variable and set that variable in the YML file.
For example, to call the hero image as a responsive image in my event component, I'll print this: {{ hero_image }}. Then in my corresponding event.yml file, I'll define the hero_image item like so:
hero_image:
join():
- include():
pattern: 'basic-elements-responsive-image'
with:
image_src_sets:
join():
- 'https://placeimg.com/600/600/tech 500w, '
- 'https://placeimg.com/1200/360/nature 1000w'
image_src: 'https://placeimg.com/1200/360/nature'
The {{ image_src }} variable is needed to provide a default fallback for browsers that don't support srcset or sizes, such as IE9/10/11.
Then in my Drupal template I just swap my image field variable for the responsive image one, like this:
{% if node.field_hero_image.value %}
{% set hero_image: content.field_hero_image %}
{% endif %}
{% include ... usual path to component stuff ... %}
Drupal then renders the image field using whatever settings I have given it in Drupal - presumably responsive image ones.
This post might not help you if you are using Emulsify, but it might help others who stumble upon it.