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.
Join the "Something nice ..." newsletter
The full title is "Something nice, something quirky, something else".
I send an email once a week with something nice, something quirky, and something else that I think is interesting (all with a web development theme, of course).