Skip to content

Commit 480df38

Browse files
committed
feat: add dppx when the browser does not support the x unit in resolution media queries
1 parent 616c442 commit 480df38

File tree

6 files changed

+32
-7
lines changed

6 files changed

+32
-7
lines changed

lib/resolution.js

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ let Prefixer = require('./prefixer')
44
let utils = require('./utils')
55

66
const REGEXP = /(min|max)-resolution\s*:\s*\d*\.?\d+(dppx|dpcm|dpi|x)/gi
7-
const SPLIT = /(min|max)-resolution(\s*:\s*)(\d*\.?\d+)(dppx|dpcm|dpi|x)/i
7+
const SPLIT = /((min|max)-resolution)(\s*:\s*)(\d*\.?\d+)(dppx|dpcm|dpi|x)/i
88

99
class Resolution extends Prefixer {
1010
/**
@@ -73,19 +73,36 @@ class Resolution extends Prefixer {
7373
continue
7474
}
7575

76+
let fallbackExpression
77+
let addFallbackExpression = false
7678
for (let prefix of prefixes) {
7779
let processed = query.replace(REGEXP, str => {
7880
let parts = str.match(SPLIT)
81+
let fallbackName = parts[1]
82+
let colon = parts[3]
83+
let value = parts[4]
84+
let units = parts[5]
85+
86+
// Add `ddpx` for browsers that do not support `x` unit.
87+
// `x` unit: Chrome 68+, Edge 79+, Opera 55+, Safari 16+, Firefox 62+
88+
// See: https://developer.mozilla.org/en-US/docs/Web/CSS/resolution#browser_compatibility
89+
if (units === 'x') {
90+
fallbackExpression = '(' + fallbackName + colon + value + 'dppx' + ')'
91+
addFallbackExpression = true
92+
}
93+
7994
return this.prefixQuery(
8095
prefix,
81-
parts[1],
82-
parts[2],
83-
parts[3],
84-
parts[4]
96+
parts[2], // min- or max-
97+
colon,
98+
value,
99+
units
85100
)
86101
})
87102
prefixed.push(processed)
88103
}
104+
105+
if (addFallbackExpression) prefixed.push(fallbackExpression)
89106
prefixed.push(query)
90107
}
91108

test/autoprefixer.test.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ const COMMONS = [
231231
'supports',
232232
'viewport',
233233
'resolution',
234+
'resolution-dppx-fallback',
234235
'logical',
235236
'appearance',
236237
'advanced-filter',
@@ -505,6 +506,11 @@ test('removes unnecessary prefixes', () => {
505506
if (i === 'grid-template-areas') continue
506507
let input = read(i + '.out')
507508
let output = read(i)
509+
510+
if (i === 'resolution-dppx-fallback') {
511+
output = '@media (min-resolution: 2dppx), (min-resolution: 2x) { }\n'
512+
}
513+
508514
equal(processor.process(input).css, output)
509515
}
510516
})
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@media (min-resolution: 2x) { }
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@media (-webkit-min-device-pixel-ratio: 2), (-o-min-device-pixel-ratio: 2/1), (min-resolution: 2dppx), (min-resolution: 2x) { }

test/cases/resolution.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
@media (min-resolution: 144dpi) { }
77

8-
@media (min-resolution: 2x) { }
8+
@media (min-resolution: 2dppx), (min-resolution: 2x) { }
99

1010
@media (min-resolution: 120dpi) { }
1111

test/cases/resolution.out.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
@media (-webkit-min-device-pixel-ratio: 1.5), (min--moz-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3/2), (min-resolution: 144dpi) { }
1010

11-
@media (-webkit-min-device-pixel-ratio: 2), (min--moz-device-pixel-ratio: 2), (-o-min-device-pixel-ratio: 2/1), (min-resolution: 2x) { }
11+
@media (-webkit-min-device-pixel-ratio: 2), (min--moz-device-pixel-ratio: 2), (-o-min-device-pixel-ratio: 2/1), (min-resolution: 2dppx), (min-resolution: 2x) { }
1212

1313
@media (-webkit-min-device-pixel-ratio: 1.25), (min--moz-device-pixel-ratio: 1.25), (-o-min-device-pixel-ratio: 5/4), (min-resolution: 120dpi) { }
1414

0 commit comments

Comments
 (0)