Turn the regular WordPress gallery block into a series of CSS-animated link-tiles. It’s a fun way to add bling to your site without slowing down the page-load. We’ll set it up so all we need to do is add the “animated-gallery-links” class to any gallery block we want to animate.
Scaffold the project
The only front-end asset we want in this project is a small CSS file, and we only it to be enqueued on pages where it’s needed. We could enqueue the CSS on every page-load, but that would be lazy and could impair the site’s performance. So we’ll create a small bit of PHP to detect when a gallery block is rendered, and if it has the “animated-gallery-links” CSS class, we’ll enqueue our CSS file.
In your custom child theme, create a file called “wpt-animated-gallery-links.php” and paste the following into it. There’s nothing complicated in here, it’s just a sequence of if...then...else
checks followed by a call to wp_enqueue_style() (if all the checks return true
).
<?php /** * WP Tutorials Animated Gallery Links (WPTAGL) * * https://wp-tutorials.tech/refine-wordpress/animated-wordpress-gallery-links/ * */ // Block direct access. defined('WPINC') || die(); // Add this CSS class to any WP Gallery block you want to animate. const WPTAGL_CLASS_NAME = 'animated-gallery-links'; /** * Detect when a standard WordPress gallery block is rendered with the * "animated-gallery-links" CSS class. * We don't modify the rendered content here - just enqueue our CSS file. */ function wptagl_render_block(string $block_content, array $block) { global $wptagl_are_assets_enqueued; if (!is_null($wptagl_are_assets_enqueued)) { // Our stylesheet has already been enqueued, // so we don't need to run any of these checks. } elseif (is_admin() || wp_doing_ajax()) { // We're not in the front-end. Don't do anything. } elseif ($block['blockName'] != 'core/gallery') { // This isn't a WP Gallery block. } elseif (!array_key_exists('attrs', $block)) { // The gallery block has no attributes. } elseif (!array_key_exists('className', $block['attrs'])) { // The className attribute is not specified. } elseif (empty($class_name = $block['attrs']['className'])) { // The className attribute is empty. } elseif (empty($gallery_classes = array_filter(explode(' ', $class_name)))) { // The className attribute is empty. } elseif (!in_array(WPTAGL_CLASS_NAME, $gallery_classes)) { // "animated-gallery-links" isn't in the list of CSS Classes. } else { $theme_version = wp_get_theme()->get('Version'); $base_uri = get_stylesheet_directory_uri(); wp_enqueue_style( 'animated-gallery-links', $base_uri . '/animated-gallery-links.css', null, // No dependencies $theme_version ); $wptagl_are_assets_enqueued = true; } return $block_content; } add_filter('render_block', 'wptagl_render_block', 10, 2);
Next, we need to edit your child theme’s functions.php and add the following couple of lines:
// WP Tutorials : Animated Gallery Links require_once dirname(__FILE__) . '/wpt-animated-gallery-links.php';
Finally, create a file in your child theme called “animated-gallery-links.css” and add the following, to get scaffold the styles.
/** * WP Tutorials Animated Gallery Links (WPTAGL) * * https://wp-tutorials.tech/refine-wordpress/animated-wordpress-gallery-links/ * */ .animated-gallery-links { margin-bottom: 1.5em; } .animated-gallery-links .wp-block-image { position: relative; overflow: hidden; } .animated-gallery-links .wp-block-image a { position: relative; display: block; }
Create a gallery block
Before we can add the actual CSS rules, create some content and add a gallery block with some images in it.
Select the gallery block (not any of the image blocks) and set the CSS Class to “animated-gallery-links”, under the “Advanced” tab.
For each image in the gallery, add a caption (to act as the link text) and set the target URLs for when each image is clicked.
Build the CSS animations
Now we can start on the fun stuff – creating the CSS animations in “animated-gallery-links.css”. Add the following to apply styles to the image captions, and animate them when the images are hovered.
/** * Configure and animate the image captions when hovered. */ .wp-block-gallery.has-nested-images.animated-gallery-links figure.wp-block-image figcaption { background: transparent; font-size: 100%; font-weight: 900; text-shadow: -1px -1px 2px #000, 1px -1px 2px #000, -1px 1px 2px #000, 1px 1px 2px #000; position: absolute; text-align: left; transition: 0.3s bottom, 0.3s transform; padding-top: 0; padding-bottom: 0; padding-left: 1em; bottom: 1em; pointer-events: none; line-height: 1.3em; z-index: 20; } .wp-block-gallery.has-nested-images.animated-gallery-links figure.wp-block-image:hover figcaption { bottom: 50%; transform: translateY(50%); }
All this does is set some styles for the figcaption
element, then changes its vertical position when the mouse hovers over the image.
To zoom/scale the image when hovered, add this chunk to the CSS file:
/** * Zoom in on the image when its hovered hover. */ .wp-block-gallery.has-nested-images.animated-gallery-links figure.wp-block-image img { transition: 0.3s transform; } .wp-block-gallery.has-nested-images.animated-gallery-links figure.wp-block-image:hover img { transform: scale(1.2); }
The following snippet adds a semi-transparent overlay when hovered.
/** * Create a totally transparent overlay for the image, then make it * semi-transparent when the image is hovered. */ .wp-block-gallery.has-nested-images.animated-gallery-links figure.wp-block-image a::before { content: ' '; position: absolute; width: 100%; height: 100%; left: 0; top: 0; z-index: 10; transition: 0.3s opacity; background-color: black; opacity: 0.0; } .wp-block-gallery.has-nested-images.animated-gallery-links figure.wp-block-image:hover a::before { opacity: 0.5; }
The final chunk adds an arrow that appears when the image is hovered. We’ve used Font Awesome 5 for the arrow, but you can use anything you want – or just don’t add this chunk if you don’t want the arrow to pop-up.
/** * Create an animated arrow that comes into view when the image is hovered. */ .wp-block-gallery.has-nested-images.animated-gallery-links figure.wp-block-image a::after { font-family: 'Font Awesome 5 Free'; font-weight: 700; content: '\f061'; position: absolute; left: 0; bottom: 2em; color: #ADF5FF; opacity: 0.0; transition: 0.3s left, 0.3s opacity, 0.3s transform; transform: scale(0.5); z-index: 20; } .wp-block-gallery.has-nested-images.animated-gallery-links figure.wp-block-image:hover a::after { bottom: 2em; left: 1.2em; opacity: 1.0; transform: scale(1.5); }
And there we have it – a lightweight hack for the standard WordPress gallery block 😎👍