diff --git a/core/modules/layout_builder/css/layout-builder.css b/core/modules/layout_builder/css/layout-builder.css
index f9d349889f..5a109300b8 100644
--- a/core/modules/layout_builder/css/layout-builder.css
+++ b/core/modules/layout_builder/css/layout-builder.css
@@ -118,3 +118,9 @@
   display: block;
   padding: 15px 0 15px 25px;
 }
+
+.layout-builder-highlight {
+  position: relative;
+  z-index: 1;
+  outline: 3px solid;
+}
diff --git a/core/modules/layout_builder/js/layout-builder.es6.js b/core/modules/layout_builder/js/layout-builder.es6.js
index f882224a4d..d1fa061ca0 100644
--- a/core/modules/layout_builder/js/layout-builder.es6.js
+++ b/core/modules/layout_builder/js/layout-builder.es6.js
@@ -195,4 +195,61 @@
         .attr('tabindex', -1);
     },
   };
+
+  // After a dialog opens, highlight element that the dialog is acting on.
+  $(window).on('dialog:aftercreate', (event, dialog, $element) => {
+    // Start by removing any existing highlighted elements.
+    $('.layout-builder-highlight').removeClass('layout-builder-highlight');
+
+    /*
+     * Every dialog has a single 'data-layout-builder-target-highlight-id'
+     * attribute.
+     * Every dialog-opening element has a unique
+     * 'data-layout-builder-highlight-id' attribute.
+     *
+     * When the value of data-layout-builder-target-highlight-id matches
+     * an elements value of data-layout-builder-highlight-id, the class
+     * 'layout-builder-highlight' is added to it.
+     */
+    const id = $element
+      .find('[data-layout-builder-target-highlight-id]')
+      .attr('data-layout-builder-target-highlight-id');
+    if (id) {
+      $(`[data-layout-builder-highlight-id="${id}"]`).addClass(
+        'layout-builder-highlight',
+      );
+
+      const $target = $('.layout-builder-highlight');
+      const targetTopPreResize = $target.offset().top;
+
+      /*
+       * Wait 700ms for the off canvas dialog to appear and for the page to be
+       * sized. After this, see if target element is still visible in viewport.
+       * If not, scroll page so target element is visible in its pre-click
+       * position.
+       *
+       * @todo Replace this custom solution when a general solution is made
+       *   available with https://www.drupal.org/node/3033410
+       */
+      setTimeout(() => {
+        const targetTop = $target.offset().top;
+        const targetBottom = targetTop + $target.outerHeight();
+        const viewportTop = $(window).scrollTop();
+        const viewportBottom = viewportTop + $(window).height();
+        const scrollAmount = targetTop - targetTopPreResize;
+        if (targetBottom < viewportTop || targetTop > viewportBottom) {
+          window.scrollBy({
+            top: scrollAmount,
+            left: 0,
+            behavior: 'smooth',
+          });
+        }
+      }, 700);
+    }
+  });
+
+  // When a dialog closes, remove highlight from all elements.
+  $(window).on('dialog:afterclose', () => {
+    $('.layout-builder-highlight').removeClass('layout-builder-highlight');
+  });
 })(jQuery, Drupal);
diff --git a/core/modules/layout_builder/js/layout-builder.js b/core/modules/layout_builder/js/layout-builder.js
index 2495e7e935..06d63e8c11 100644
--- a/core/modules/layout_builder/js/layout-builder.js
+++ b/core/modules/layout_builder/js/layout-builder.js
@@ -91,4 +91,35 @@
       }).attr('tabindex', -1);
     }
   };
+
+  $(window).on('dialog:aftercreate', function (event, dialog, $element) {
+    $('.layout-builder-highlight').removeClass('layout-builder-highlight');
+
+    var id = $element.find('[data-layout-builder-target-highlight-id]').attr('data-layout-builder-target-highlight-id');
+    if (id) {
+      $('[data-layout-builder-highlight-id="' + id + '"]').addClass('layout-builder-highlight');
+
+      var $target = $('.layout-builder-highlight');
+      var targetTopPreResize = $target.offset().top;
+
+      setTimeout(function () {
+        var targetTop = $target.offset().top;
+        var targetBottom = targetTop + $target.outerHeight();
+        var viewportTop = $(window).scrollTop();
+        var viewportBottom = viewportTop + $(window).height();
+        var scrollAmount = targetTop - targetTopPreResize;
+        if (targetBottom < viewportTop || targetTop > viewportBottom) {
+          window.scrollBy({
+            top: scrollAmount,
+            left: 0,
+            behavior: 'smooth'
+          });
+        }
+      }, 700);
+    }
+  });
+
+  $(window).on('dialog:afterclose', function () {
+    $('.layout-builder-highlight').removeClass('layout-builder-highlight');
+  });
 })(jQuery, Drupal);
\ No newline at end of file
diff --git a/core/modules/layout_builder/src/Controller/ChooseBlockController.php b/core/modules/layout_builder/src/Controller/ChooseBlockController.php
index 67bd528ce6..1355353989 100644
--- a/core/modules/layout_builder/src/Controller/ChooseBlockController.php
+++ b/core/modules/layout_builder/src/Controller/ChooseBlockController.php
@@ -9,6 +9,7 @@
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\Core\Url;
 use Drupal\layout_builder\Context\LayoutBuilderContextTrait;
+use Drupal\layout_builder\LayoutBuilderHighlightTrait;
 use Drupal\layout_builder\SectionStorageInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -21,6 +22,7 @@ class ChooseBlockController implements ContainerInjectionInterface {
 
   use AjaxHelperTrait;
   use LayoutBuilderContextTrait;
+  use LayoutBuilderHighlightTrait;
   use StringTranslationTrait;
 
   /**
@@ -125,6 +127,7 @@ public function build(SectionStorageInterface $section_storage, $delta, $region)
     $block_categories['#type'] = 'container';
     $block_categories['#attributes']['class'][] = 'block-categories';
     $block_categories['#attributes']['class'][] = 'js-layout-builder-categories';
+    $block_categories['#attributes']['data-layout-builder-target-highlight-id'] = $this->blockAddHighlightId($delta, $region);
 
     // @todo Explicitly cast delta to an integer, remove this in
     //   https://www.drupal.org/project/drupal/issues/2984509.
@@ -189,6 +192,7 @@ public function inlineBlockList(SectionStorageInterface $section_storage, $delta
         '#attributes' => $this->getAjaxAttributes(),
       ];
     }
+    $build['links']['#attributes']['data-layout-builder-target-highlight-id'] = $this->blockAddHighlightId($delta, $region);
     return $build;
   }
 
diff --git a/core/modules/layout_builder/src/Controller/ChooseSectionController.php b/core/modules/layout_builder/src/Controller/ChooseSectionController.php
index 3405692e53..2a3561e5ea 100644
--- a/core/modules/layout_builder/src/Controller/ChooseSectionController.php
+++ b/core/modules/layout_builder/src/Controller/ChooseSectionController.php
@@ -8,6 +8,7 @@
 use Drupal\Core\Plugin\PluginFormInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\Core\Url;
+use Drupal\layout_builder\LayoutBuilderHighlightTrait;
 use Drupal\layout_builder\SectionStorageInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -19,6 +20,7 @@
 class ChooseSectionController implements ContainerInjectionInterface {
 
   use AjaxHelperTrait;
+  use LayoutBuilderHighlightTrait;
   use StringTranslationTrait;
 
   /**
@@ -98,6 +100,7 @@ public function build(SectionStorageInterface $section_storage, $delta) {
         'class' => [
           'layout-selection',
         ],
+        'data-layout-builder-target-highlight-id' => $this->sectionAddHighlightId($delta),
       ],
     ];
 
diff --git a/core/modules/layout_builder/src/Element/LayoutBuilder.php b/core/modules/layout_builder/src/Element/LayoutBuilder.php
index 99970b208f..ab1479bf93 100644
--- a/core/modules/layout_builder/src/Element/LayoutBuilder.php
+++ b/core/modules/layout_builder/src/Element/LayoutBuilder.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Render\Element\RenderElement;
 use Drupal\Core\Url;
 use Drupal\layout_builder\Context\LayoutBuilderContextTrait;
+use Drupal\layout_builder\LayoutBuilderHighlightTrait;
 use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
 use Drupal\layout_builder\OverridesSectionStorageInterface;
 use Drupal\layout_builder\Section;
@@ -25,6 +26,7 @@ class LayoutBuilder extends RenderElement implements ContainerFactoryPluginInter
 
   use AjaxHelperTrait;
   use LayoutBuilderContextTrait;
+  use LayoutBuilderHighlightTrait;
 
   /**
    * The layout tempstore repository.
@@ -218,6 +220,7 @@ protected function buildAddSectionLink(SectionStorageInterface $section_storage,
       '#type' => 'container',
       '#attributes' => [
         'class' => ['new-section'],
+        'data-layout-builder-highlight-id' => $this->sectionAddHighlightId($delta),
       ],
     ];
   }
@@ -248,6 +251,7 @@ protected function buildAdministrativeSection(SectionStorageInterface $section_s
         foreach (Element::children($build[$region]) as $uuid) {
           $build[$region][$uuid]['#attributes']['class'][] = 'draggable';
           $build[$region][$uuid]['#attributes']['data-layout-block-uuid'] = $uuid;
+          $build[$region][$uuid]['#attributes']['data-layout-builder-highlight-id'] = $this->blockUpdateHighlightId($uuid);
           $build[$region][$uuid]['#contextual_links'] = [
             'layout_builder_block' => [
               'route_parameters' => [
@@ -283,7 +287,10 @@ protected function buildAdministrativeSection(SectionStorageInterface $section_s
         ),
       ];
       $build[$region]['layout_builder_add_block']['#type'] = 'container';
-      $build[$region]['layout_builder_add_block']['#attributes'] = ['class' => ['new-block']];
+      $build[$region]['layout_builder_add_block']['#attributes'] = [
+        'class' => ['new-block'],
+        'data-layout-builder-highlight-id' => $this->blockAddHighlightId($delta, $region),
+      ];
       $build[$region]['layout_builder_add_block']['#weight'] = 1000;
       $build[$region]['#attributes']['data-region'] = $region;
       $build[$region]['#attributes']['class'][] = 'layout-builder--layout__region';
@@ -294,6 +301,7 @@ protected function buildAdministrativeSection(SectionStorageInterface $section_s
       'section_storage' => $storage_id,
     ])->toString();
     $build['#attributes']['data-layout-delta'] = $delta;
+    $build['#attributes']['data-layout-builder-highlight-id'] = $this->sectionUpdateHighlightId($delta);
     $build['#attributes']['class'][] = 'layout-builder--layout';
 
     return [
diff --git a/core/modules/layout_builder/src/Form/AddBlockForm.php b/core/modules/layout_builder/src/Form/AddBlockForm.php
index 1d873308a1..ccfea97e2f 100644
--- a/core/modules/layout_builder/src/Form/AddBlockForm.php
+++ b/core/modules/layout_builder/src/Form/AddBlockForm.php
@@ -3,6 +3,7 @@
 namespace Drupal\layout_builder\Form;
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\layout_builder\LayoutBuilderHighlightTrait;
 use Drupal\layout_builder\SectionComponent;
 use Drupal\layout_builder\SectionStorageInterface;
 
@@ -13,6 +14,8 @@
  */
 class AddBlockForm extends ConfigureBlockFormBase {
 
+  use LayoutBuilderHighlightTrait;
+
   /**
    * {@inheritdoc}
    */
@@ -53,6 +56,7 @@ public function buildForm(array $form, FormStateInterface $form_state, SectionSt
       $section_storage->getSection($delta)->appendComponent($component);
       $form_state->set('layout_builder__component', $component);
     }
+    $form['#attributes']['data-layout-builder-target-highlight-id'] = $this->blockAddHighlightId($delta, $region);
     return $this->doBuildForm($form, $form_state, $section_storage, $delta, $component);
   }
 
diff --git a/core/modules/layout_builder/src/Form/ConfigureSectionForm.php b/core/modules/layout_builder/src/Form/ConfigureSectionForm.php
index 92584b5893..82fce6156b 100644
--- a/core/modules/layout_builder/src/Form/ConfigureSectionForm.php
+++ b/core/modules/layout_builder/src/Form/ConfigureSectionForm.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Plugin\PluginFormInterface;
 use Drupal\Core\Plugin\PluginWithFormsInterface;
 use Drupal\layout_builder\Controller\LayoutRebuildTrait;
+use Drupal\layout_builder\LayoutBuilderHighlightTrait;
 use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
 use Drupal\layout_builder\Section;
 use Drupal\layout_builder\SectionStorageInterface;
@@ -24,6 +25,7 @@
 class ConfigureSectionForm extends FormBase {
 
   use AjaxFormHelperTrait;
+  use LayoutBuilderHighlightTrait;
   use LayoutRebuildTrait;
 
   /**
@@ -127,6 +129,8 @@ public function buildForm(array $form, FormStateInterface $form_state, SectionSt
     if ($this->isAjax()) {
       $form['actions']['submit']['#ajax']['callback'] = '::ajaxSubmit';
     }
+    $target_highlight_id = $this->isUpdate ? $this->sectionUpdateHighlightId($delta) : $this->sectionAddHighlightId($delta);
+    $form['#attributes']['data-layout-builder-target-highlight-id'] = $target_highlight_id;
 
     return $form;
   }
diff --git a/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php b/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php
index d6c05f87bf..06f09ae9b7 100644
--- a/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php
+++ b/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\layout_builder\Controller\LayoutRebuildTrait;
+use Drupal\layout_builder\LayoutBuilderHighlightTrait;
 use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
 use Drupal\layout_builder\SectionStorageInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -18,6 +19,7 @@
 abstract class LayoutRebuildConfirmFormBase extends ConfirmFormBase {
 
   use AjaxFormHelperTrait;
+  use LayoutBuilderHighlightTrait;
   use LayoutRebuildTrait;
 
   /**
@@ -79,6 +81,8 @@ public function buildForm(array $form, FormStateInterface $form_state, SectionSt
     if ($this->isAjax()) {
       $form['actions']['submit']['#ajax']['callback'] = '::ajaxSubmit';
       $form['actions']['cancel']['#attributes']['class'][] = 'dialog-cancel';
+      $target_highlight_id = !empty($this->uuid) ? $this->blockUpdateHighlightId($this->uuid) : $this->sectionUpdateHighlightId($delta);
+      $form['#attributes']['data-layout-builder-target-highlight-id'] = $target_highlight_id;
     }
 
     return $form;
diff --git a/core/modules/layout_builder/src/Form/UpdateBlockForm.php b/core/modules/layout_builder/src/Form/UpdateBlockForm.php
index c00b406eb2..59cf91fd56 100644
--- a/core/modules/layout_builder/src/Form/UpdateBlockForm.php
+++ b/core/modules/layout_builder/src/Form/UpdateBlockForm.php
@@ -3,6 +3,7 @@
 namespace Drupal\layout_builder\Form;
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\layout_builder\LayoutBuilderHighlightTrait;
 use Drupal\layout_builder\SectionStorageInterface;
 
 /**
@@ -12,6 +13,8 @@
  */
 class UpdateBlockForm extends ConfigureBlockFormBase {
 
+  use LayoutBuilderHighlightTrait;
+
   /**
    * {@inheritdoc}
    */
@@ -40,6 +43,7 @@ public function getFormId() {
    */
   public function buildForm(array $form, FormStateInterface $form_state, SectionStorageInterface $section_storage = NULL, $delta = NULL, $region = NULL, $uuid = NULL) {
     $component = $section_storage->getSection($delta)->getComponent($uuid);
+    $form['#attributes']['data-layout-builder-target-highlight-id'] = $this->blockUpdateHighlightId($uuid);
     return $this->doBuildForm($form, $form_state, $section_storage, $delta, $component);
   }
 
diff --git a/core/modules/layout_builder/src/LayoutBuilderHighlightTrait.php b/core/modules/layout_builder/src/LayoutBuilderHighlightTrait.php
new file mode 100644
index 0000000000..65a470c31b
--- /dev/null
+++ b/core/modules/layout_builder/src/LayoutBuilderHighlightTrait.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Drupal\layout_builder;
+
+/**
+ * A trait for generating IDs used to highlight active UI elements.
+ */
+trait LayoutBuilderHighlightTrait {
+
+  /**
+   * Provides the ID used to highlight the active Layout Builder UI element.
+   *
+   * @param string $delta
+   *   The section the block is in.
+   * @param string $region
+   *   The region within the section the block is placed.
+   *
+   * @return string
+   *   The highlight ID of the block.
+   */
+  protected function blockAddHighlightId($delta, $region) {
+    return "block-$delta-$region";
+  }
+
+  /**
+   * Provides the ID used to highlight the active Layout Builder UI element.
+   *
+   * @param string $uuid
+   *   The uuid of the block.
+   *
+   * @return string
+   *   The highlight ID of the block.
+   */
+  protected function blockUpdateHighlightId($uuid) {
+    return $uuid;
+  }
+
+  /**
+   * Provides the ID used to highlight the active Layout Builder UI element.
+   *
+   * @param string $delta
+   *   The location of the section.
+   *
+   * @return string
+   *   The highlight ID of the section.
+   */
+  protected function sectionAddHighlightId($delta) {
+    return "section-$delta";
+  }
+
+  /**
+   * Provides the ID used to highlight the active Layout Builder UI element.
+   *
+   * @param string $delta
+   *   The location of the section.
+   *
+   * @return string
+   *   The highlight ID of the section.
+   */
+  protected function sectionUpdateHighlightId($delta) {
+    return "section-update-$delta";
+  }
+
+}
diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderUiTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderUiTest.php
index 1b6c73b0f5..beec2b530f 100644
--- a/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderUiTest.php
+++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderUiTest.php
@@ -2,7 +2,9 @@
 
 namespace Drupal\Tests\layout_builder\FunctionalJavascript;
 
+use Drupal\block_content\Entity\BlockContentType;
 use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
+use Drupal\Tests\contextual\FunctionalJavascript\ContextualLinkClickTrait;
 
 /**
  * Tests the Layout Builder UI.
@@ -11,6 +13,8 @@
  */
 class LayoutBuilderUiTest extends WebDriverTestBase {
 
+  use ContextualLinkClickTrait;
+
   /**
    * Path prefix for the field UI for the test bundle.
    *
@@ -22,6 +26,10 @@ class LayoutBuilderUiTest extends WebDriverTestBase {
     'layout_builder',
     'block',
     'node',
+    'block_content',
+    'contextual',
+    'views',
+    'layout_builder_test_css_transitions',
   ];
 
   /**
@@ -40,6 +48,7 @@ protected function setUp() {
       'configure any layout',
       'administer node display',
       'administer node fields',
+      'access contextual links',
     ]));
 
     // Enable layout builder.
@@ -116,4 +125,146 @@ protected function assertModifiedLayout($path) {
     $assert_session->pageTextContainsOnce('You have unsaved changes.');
   }
 
+  /**
+   * Tests that dialog opening elements are properly highlighted.
+   */
+  public function testAddHighlights() {
+    $assert_session = $this->assertSession();
+    $page = $this->getSession()->getPage();
+
+    $bundle = BlockContentType::create([
+      'id' => 'basic',
+      'label' => 'Basic block',
+      'revision' => 1,
+    ]);
+    $bundle->save();
+    block_content_add_body_field($bundle->id());
+
+    $this->drupalGet(static::FIELD_UI_PREFIX . '/display/default/layout');
+    $assert_session->elementsCount('css', '.new-section', 2);
+    $assert_session->elementNotExists('css', '.layout-builder-highlight');
+    $page->clickLink('Add Section');
+    $this->assertNotEmpty($assert_session->waitForElement('css', '#drupal-off-canvas .item-list'));
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Highlight is present with AddSectionController.
+    $this->assertHighlightedElement('[data-layout-builder-highlight-id="section-0"]');
+    $page->clickLink('Two column');
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#drupal-off-canvas input[type="submit"][value="Add section"]'));
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Highlight is present with ConfigureSectionForm.
+    $this->assertHighlightedElement('[data-layout-builder-highlight-id="section-0"]');
+
+    // Submit form to add section then confirm no element highlighted.
+    $page->pressButton("Add section");
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertHighlightNotExists();
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '[data-layout-delta="1"]'));
+    $assert_session->elementsCount('css', '.new-block', 3);
+
+    // Add custom block.
+    $page->clickLink('Add Block');
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'a:contains("Create custom block")'));
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Highlight is present with ChooseBlockController::build().
+    $this->assertHighlightedElement('[data-layout-builder-highlight-id="block-0-first"]');
+    $page->clickLink('Create custom block');
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#drupal-off-canvas input[value="Add Block"]'));
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Highlight is present with ChooseBlockController::inlineBlockList().
+    $this->assertHighlightedElement('[data-layout-builder-highlight-id="block-0-first"]');
+    $page->pressButton('Close');
+    $this->assertHighlightNotExists();
+
+    // Highlight should persist with all block config dialogs.
+    $page->clickLink('Add Block');
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'a:contains("Recent content")'));
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertHighlightedElement('[data-layout-builder-highlight-id="block-0-first"]');
+    $page->clickLink('Recent content');
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#drupal-off-canvas input[value="Add Block"]'));
+
+    // Highlight is present with ConfigureBlockFormBase::doBuildForm.
+    $this->assertHighlightedElement('[data-layout-builder-highlight-id="block-0-first"]');
+    $page->pressButton('Close');
+    $this->assertHighlightNotExists();
+
+    // Highlight is present when Configure section dialog open.
+    $page->clickLink('Configure section');
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#drupal-off-canvas'));
+    $this->assertHighlightedElement('[data-layout-builder-highlight-id="section-update-0"]');
+    $page->pressButton('Close');
+    $this->assertHighlightNotExists();
+
+    // Highlight is present when Remove section dialog open.
+    $page->clickLink('Remove section');
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#drupal-off-canvas'));
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertHighlightedElement('[data-layout-builder-highlight-id="section-update-0"]');
+    $page->pressButton('Close');
+    $this->assertHighlightNotExists();
+
+    // Block is highlighted when its "Configure" contextual link is clicked.
+    $this->clickContextualLink('.block-field-blocknodebundle-with-section-fieldbody', 'Configure');
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#drupal-off-canvas'));
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertHighlightedElement('.block-field-blocknodebundle-with-section-fieldbody');
+    $page->pressButton('Close');
+    $this->assertHighlightNotExists();
+
+    // @todo: Remove reload after https://www.drupal.org/node/2918718 completed.
+    $this->getSession()->reload();
+
+    // Block is highlighted when its "Remove block" contextual link is clicked.
+    $this->clickContextualLink('.block-field-blocknodebundle-with-section-fieldbody', 'Remove block');
+    $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#drupal-off-canvas'));
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->assertHighlightedElement('.block-field-blocknodebundle-with-section-fieldbody');
+    $page->pressButton('Close');
+    $this->assertHighlightNotExists();
+  }
+
+  /**
+   * Confirm presence of layout-builder-highlight with specific properties.
+   *
+   * @param string $selector
+   *   The highlighted element must also match this selector.
+   */
+  private function assertHighlightedElement($selector) {
+    $assert_session = $this->assertSession();
+    $page = $this->getSession()->getPage();
+
+    // There is only one highlighted element.
+    $assert_session->elementsCount('css', '.layout-builder-highlight', 1);
+
+    // The selector is also the highlighted element.
+    $this->assertTrue($page->find('css', $selector)->hasClass('layout-builder-highlight'));
+  }
+
+  /**
+   * Waits for dialog to close and confirms no highlights present.
+   */
+  private function assertHighlightNotExists() {
+    $this->waitForNoElement('#drupal-off-canvas');
+    $this->waitForNoElement('.layout-builder-highlight');
+  }
+
+  /**
+   * Waits for an element to be removed from the page.
+   *
+   * @param string $selector
+   *   CSS selector.
+   * @param int $timeout
+   *   (optional) Timeout in milliseconds, defaults to 10000.
+   *
+   * @todo Remove in https://www.drupal.org/node/2892440.
+   */
+  protected function waitForNoElement($selector, $timeout = 10000) {
+    $condition = "(typeof jQuery !== 'undefined' && jQuery('$selector').length === 0)";
+    $this->assertJsCondition($condition, $timeout);
+  }
+
 }
