diff --git a/field_group.libraries.yml b/field_group.libraries.yml
index 01f43f6..6642117 100644
--- a/field_group.libraries.yml
+++ b/field_group.libraries.yml
@@ -11,6 +11,22 @@ field_ui:
     - core/drupal
     - core/drupalSettings
 
+details_validation:
+  header: false
+  version: VERSION
+  js:
+    js/field_group.details_validation.js: {}
+  dependencies:
+    - core/jquery
+
+tabs_validation:
+  header: false
+  version: VERSION
+  js:
+    js/field_group.tabs_validation.js: {}
+  dependencies:
+    - core/jquery
+
 core:
   version: VERSION
   js:
diff --git a/js/field_group.details_validation.js b/js/field_group.details_validation.js
new file mode 100644
index 0000000..13a00fd
--- /dev/null
+++ b/js/field_group.details_validation.js
@@ -0,0 +1,26 @@
+(function ($) {
+  'use strict';
+
+  /**
+   * Behaviors for details validation.
+   */
+  Drupal.behaviors.fieldGroupDetailsValidation = {
+    attach: function (context, settings) {
+      $('.field-group-details :input', context).each(function (i) {
+        var $field_group_input = $(this);
+        this.addEventListener('invalid', function (e) {
+          // Open any hidden parents first.
+          $(e.target).parents('details:not([open])').each(function () {
+            $(this).attr('open', '');
+          });
+        }, false);
+        if ($field_group_input.hasClass('error')) {
+          $field_group_input.parents('details:not([open])').each(function () {
+            $(this).attr('open', '');
+          });
+        }
+      });
+    }
+  };
+
+})(jQuery);
diff --git a/js/field_group.tabs_validation.js b/js/field_group.tabs_validation.js
new file mode 100644
index 0000000..7f6accd
--- /dev/null
+++ b/js/field_group.tabs_validation.js
@@ -0,0 +1,37 @@
+(function ($) {
+  'use strict';
+
+  /**
+   * Behaviors for tab validation.
+   */
+  Drupal.behaviors.fieldGroupTabsValidation = {
+    attach: function (context, settings) {
+      var fieldGroupTabsOpen = function () {
+        var $field_group = $(this);
+        if ($field_group.data('verticalTab')) {
+          $field_group.data('verticalTab').tabShow();
+        }
+        else {
+          if ($field_group.data('horizontalTab')) {
+            $field_group.data('horizontalTab').tabShow();
+          }
+          else {
+            $field_group.attr('open', '');
+          }
+        }
+      };
+      $('.field-group-tabs-wrapper :input', context).each(function (i) {
+        var $field_group_input = $(this);
+        this.addEventListener('invalid', function (e) {
+          // Open any hidden parents first.
+          $(e.target).parents('details:not(:visible), details.horizontal-tab-hidden, details.vertical-tab-hidden').each(fieldGroupTabsOpen);
+        }, false);
+        // Open any parents for submission validation errors.
+        if ($field_group_input.hasClass('error')) {
+          $field_group_input.parents('details:not(:visible), details.horizontal-tab-hidden, details.vertical-tab-hidden').each(fieldGroupTabsOpen);
+        }
+      });
+    }
+  };
+
+})(jQuery);
diff --git a/src/Plugin/field_group/FieldGroupFormatter/Details.php b/src/Plugin/field_group/FieldGroupFormatter/Details.php
index 8a78c6e..83c4e38 100644
--- a/src/Plugin/field_group/FieldGroupFormatter/Details.php
+++ b/src/Plugin/field_group/FieldGroupFormatter/Details.php
@@ -53,6 +53,7 @@ class Details extends FieldGroupFormatterBase {
       $element['#attached']['library'][] = 'field_group/formatter.details';
       $element['#attached']['library'][] = 'field_group/core';
     }
+    $element['#attached']['library'][] = 'field_group/details_validation';
   }
 
   /**
diff --git a/src/Plugin/field_group/FieldGroupFormatter/Tabs.php b/src/Plugin/field_group/FieldGroupFormatter/Tabs.php
index 4f49ec3..681bf71 100644
--- a/src/Plugin/field_group/FieldGroupFormatter/Tabs.php
+++ b/src/Plugin/field_group/FieldGroupFormatter/Tabs.php
@@ -80,6 +80,7 @@ class Tabs extends FieldGroupFormatterBase {
       }
     }
 
+    $element['#attached']['library'][] = 'field_group/tabs_validation';
   }
 
   /**
