diff --git a/core/src/components/input/input.md.outline.scss b/core/src/components/input/input.md.outline.scss
index 4efbd2fcdd..488ada9217 100644
--- a/core/src/components/input/input.md.outline.scss
+++ b/core/src/components/input/input.md.outline.scss
@@ -82,8 +82,6 @@
:host(.input-fill-outline) .label-text-wrapper,
:host(.input-fill-outline) .label-text-wrapper {
position: relative;
-
- z-index: 1;
}
/**
diff --git a/core/src/components/input/input.scss b/core/src/components/input/input.scss
index 4a18956e01..962f1cd934 100644
--- a/core/src/components/input/input.scss
+++ b/core/src/components/input/input.scss
@@ -581,6 +581,13 @@
@include transform-origin(start, top);
max-width: 100%;
+
+ /**
+ * The 2 ensures the label
+ * remains on top of any browser
+ * autofill background too.
+ */
+ z-index: 2;
}
/**
diff --git a/core/src/components/input/test/label-placement/input.e2e.ts b/core/src/components/input/test/label-placement/input.e2e.ts
index 218e718a3d..2dc2179338 100644
--- a/core/src/components/input/test/label-placement/input.e2e.ts
+++ b/core/src/components/input/test/label-placement/input.e2e.ts
@@ -186,9 +186,6 @@ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, screenshot, co
expect(await input.screenshot()).toMatchSnapshot(screenshot(`input-label-slot-truncate`));
});
});
-});
-
-configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
test.describe(title('input: async label'), () => {
test('input should re-render when label slot is added async', async ({ page }) => {
await page.setContent(
@@ -213,4 +210,27 @@ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, screenshot, co
expect(await input.screenshot()).toMatchSnapshot(screenshot(`input-async-label`));
});
});
+ test.describe(title('input: floating/stacked label layering'), () => {
+ test('label should not be covered by text field', async ({ page }, testInfo) => {
+ testInfo.annotations.push({
+ type: 'issue',
+ description: 'https://github.com/ionic-team/ionic-framework/issues/27812',
+ });
+ await page.setContent(
+ `
+
+
+ `,
+ config
+ );
+
+ const input = page.locator('ion-input');
+
+ expect(await input.screenshot()).toMatchSnapshot(screenshot(`input-label-layering`));
+ });
+ });
});
diff --git a/core/src/components/input/test/label-placement/input.e2e.ts-snapshots/input-label-layering-md-ltr-Mobile-Chrome-linux.png b/core/src/components/input/test/label-placement/input.e2e.ts-snapshots/input-label-layering-md-ltr-Mobile-Chrome-linux.png
new file mode 100644
index 0000000000..073224da4e
Binary files /dev/null and b/core/src/components/input/test/label-placement/input.e2e.ts-snapshots/input-label-layering-md-ltr-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/input/test/label-placement/input.e2e.ts-snapshots/input-label-layering-md-ltr-Mobile-Firefox-linux.png b/core/src/components/input/test/label-placement/input.e2e.ts-snapshots/input-label-layering-md-ltr-Mobile-Firefox-linux.png
new file mode 100644
index 0000000000..5452a219ab
Binary files /dev/null and b/core/src/components/input/test/label-placement/input.e2e.ts-snapshots/input-label-layering-md-ltr-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/input/test/label-placement/input.e2e.ts-snapshots/input-label-layering-md-ltr-Mobile-Safari-linux.png b/core/src/components/input/test/label-placement/input.e2e.ts-snapshots/input-label-layering-md-ltr-Mobile-Safari-linux.png
new file mode 100644
index 0000000000..0fa20ccd64
Binary files /dev/null and b/core/src/components/input/test/label-placement/input.e2e.ts-snapshots/input-label-layering-md-ltr-Mobile-Safari-linux.png differ
diff --git a/core/src/components/textarea/test/label-placement/textarea.e2e.ts b/core/src/components/textarea/test/label-placement/textarea.e2e.ts
index a50672c3bf..f755c5dffe 100644
--- a/core/src/components/textarea/test/label-placement/textarea.e2e.ts
+++ b/core/src/components/textarea/test/label-placement/textarea.e2e.ts
@@ -302,4 +302,27 @@ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, screenshot, co
await expect(page.locator('.container')).toHaveScreenshot(screenshot(`textarea-multi-line-sizing`));
});
});
+ test.describe(title('textarea: floating/stacked label layering'), () => {
+ test('label should not be covered by text field', async ({ page }, testInfo) => {
+ testInfo.annotations.push({
+ type: 'issue',
+ description: 'https://github.com/ionic-team/ionic-framework/issues/27812',
+ });
+ await page.setContent(
+ `
+
+
+ `,
+ config
+ );
+
+ const textarea = page.locator('ion-textarea');
+
+ expect(await textarea.screenshot()).toMatchSnapshot(screenshot(`textarea-label-layering`));
+ });
+ });
});
diff --git a/core/src/components/textarea/test/label-placement/textarea.e2e.ts-snapshots/textarea-focused-placement-floating-no-value-md-rtl-Mobile-Chrome-linux.png b/core/src/components/textarea/test/label-placement/textarea.e2e.ts-snapshots/textarea-focused-placement-floating-no-value-md-rtl-Mobile-Chrome-linux.png
index caacec7958..72c3216204 100644
Binary files a/core/src/components/textarea/test/label-placement/textarea.e2e.ts-snapshots/textarea-focused-placement-floating-no-value-md-rtl-Mobile-Chrome-linux.png and b/core/src/components/textarea/test/label-placement/textarea.e2e.ts-snapshots/textarea-focused-placement-floating-no-value-md-rtl-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/textarea/test/label-placement/textarea.e2e.ts-snapshots/textarea-label-layering-md-ltr-Mobile-Chrome-linux.png b/core/src/components/textarea/test/label-placement/textarea.e2e.ts-snapshots/textarea-label-layering-md-ltr-Mobile-Chrome-linux.png
new file mode 100644
index 0000000000..2caf195984
Binary files /dev/null and b/core/src/components/textarea/test/label-placement/textarea.e2e.ts-snapshots/textarea-label-layering-md-ltr-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/textarea/test/label-placement/textarea.e2e.ts-snapshots/textarea-label-layering-md-ltr-Mobile-Firefox-linux.png b/core/src/components/textarea/test/label-placement/textarea.e2e.ts-snapshots/textarea-label-layering-md-ltr-Mobile-Firefox-linux.png
new file mode 100644
index 0000000000..5b636ccf87
Binary files /dev/null and b/core/src/components/textarea/test/label-placement/textarea.e2e.ts-snapshots/textarea-label-layering-md-ltr-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/textarea/test/label-placement/textarea.e2e.ts-snapshots/textarea-label-layering-md-ltr-Mobile-Safari-linux.png b/core/src/components/textarea/test/label-placement/textarea.e2e.ts-snapshots/textarea-label-layering-md-ltr-Mobile-Safari-linux.png
new file mode 100644
index 0000000000..cf8b66f47b
Binary files /dev/null and b/core/src/components/textarea/test/label-placement/textarea.e2e.ts-snapshots/textarea-label-layering-md-ltr-Mobile-Safari-linux.png differ
diff --git a/core/src/components/textarea/textarea.md.outline.scss b/core/src/components/textarea/textarea.md.outline.scss
index 76f20279ae..6def3ba0ab 100644
--- a/core/src/components/textarea/textarea.md.outline.scss
+++ b/core/src/components/textarea/textarea.md.outline.scss
@@ -82,8 +82,6 @@
:host(.textarea-fill-outline) .label-text-wrapper,
:host(.textarea-fill-outline) .label-text-wrapper {
position: relative;
-
- z-index: 1;
}
/**
diff --git a/core/src/components/textarea/textarea.scss b/core/src/components/textarea/textarea.scss
index e656910bd8..f9a60a0125 100644
--- a/core/src/components/textarea/textarea.scss
+++ b/core/src/components/textarea/textarea.scss
@@ -629,6 +629,13 @@
@include padding(0px);
max-width: 100%;
+
+ /**
+ * The 2 ensures the label
+ * remains on top of any browser
+ * autofill background too.
+ */
+ z-index: 2;
}
/**