diff --git a/src/validate/html/a11y.ts b/src/validate/html/a11y.ts
index 0b34c9b451..205a6388f5 100644
--- a/src/validate/html/a11y.ts
+++ b/src/validate/html/a11y.ts
@@ -78,6 +78,14 @@ export default function a11y(
 			validator.warn(`A11y: The scope attribute should only be used with <th> elements`, attribute.start);
 		}
 
+		// tabindex-no-positive
+		if (name === 'tabindex') {
+			const value = getStaticAttributeValue(node, 'tabindex');
+			if (!isNaN(value) && +value > 0) {
+				validator.warn(`A11y: avoid tabindex values above zero`, attribute.start);
+			}
+		}
+
 		attributeMap.set(attribute.name, attribute);
 	});
 
diff --git a/test/validator/samples/a11y-tabindex-no-positive/input.html b/test/validator/samples/a11y-tabindex-no-positive/input.html
new file mode 100644
index 0000000000..fa34d69f2d
--- /dev/null
+++ b/test/validator/samples/a11y-tabindex-no-positive/input.html
@@ -0,0 +1,4 @@
+<div tabindex='-1'/>
+<div tabindex='0'/>
+<div tabindex='1'/>
+<div tabindex='{{foo}}'/>
\ No newline at end of file
diff --git a/test/validator/samples/a11y-tabindex-no-positive/warnings.json b/test/validator/samples/a11y-tabindex-no-positive/warnings.json
new file mode 100644
index 0000000000..6c163a8834
--- /dev/null
+++ b/test/validator/samples/a11y-tabindex-no-positive/warnings.json
@@ -0,0 +1,10 @@
+[
+	{
+		"message": "A11y: avoid tabindex values above zero",
+		"loc": {
+			"line": 3,
+			"column": 5
+		},
+		"pos": 46
+	}
+]