Direct answer: Of 61 cached pages, 57 declare a viewport and four homepages have none; 54 disable zoom through user-scalable=no or user-scalable=0 (88.5%). By page type: 18 of 25 homepages and all 36 article pages. Only three homepages allow zoom.
Of the 57 viewport declarations, 56 include width=device-width; 59 of 61 use an HTML5 doctype, and 14 pages lack an html lang attribute.
Method: two caches, zero requests
The sample combines 25 homepage caches from study 4 (2026-10-31 to 11-01) with 36 article pages from the same 10 sites in study 45 (fetched 2026-11-03 08:40–08:41; five JavaScript shells excluded). Both sets are read offline with zero network requests.
| Item | Rule | Boundary |
|---|---|---|
| viewport | A meta with name=viewport exists | Rendered width not tested |
| width=device-width | Content contains that string | Case and spaces normalised |
| Zoom disabled | Contains user-scalable=no or =0 | Declaration only; browser behaviour not tested |
| HTML5 doctype | Exact <!doctype html> | XHTML doctypes do not count |
| lang | lang attribute on html | Value correctness not judged |
The two caches were fetched on different days, so the study cannot tell whether a site changed in between; differences between page types describe this sample only.
Result: four homepages have no viewport
| Page type | Pages | With viewport | Without |
|---|---|---|---|
| Homepage | 25 | 21 | 4 (E04, E13, E20, E29) |
| Article | 36 | 36 | 0 |
| Total | 61 | 57 | 4 |
Without a viewport, a phone usually renders at desktop width and scales the page down, shrinking body text. Two of these four pages also lack an HTML5 doctype.
Zoom: 54 pages disabled, every article
| Declaration | Pages | Share of 61 |
|---|---|---|
user-scalable=no | 49 | 80.3% |
user-scalable=0 | 5 | 8.2% |
| Zoom allowed | 3 | 4.9% |
| No viewport | 4 | 6.6% |
| Page type | Zoom disabled | Pages | Share |
|---|---|---|---|
| Homepage | 18 | 25 | 72.0% |
| Article | 36 | 36 | 100% |
All 36 article pages disable zoom, which points to a shared template declaration rather than individual omissions. The three homepages that allow zoom only declare width=device-width, initial-scale=1.
width, doctype and lang
| Item | Pages | Note |
|---|---|---|
viewport with width=device-width | 56/57 | One sets only initial and min/max scale |
viewport with initial-scale | 57/57 | — |
| HTML5 doctype | 59/61 | Two homepages still use XHTML |
| html lang present | 47/61 | 14 missing (9 homepages, 5 articles) |
E30 is the one viewport without width=device-width: it locks minimum, maximum and initial scale at 1, fixing the layout width. It is not “missing viewport”, but it is still unfriendly to small screens.
What this means for acceptance
- Check that a viewport exists. Four homepages have none and will render at desktop width on phones.
- Treat zoom blocking as its own issue. 54 of 61 disable zoom and every article does; low-vision readers cannot enlarge the text.
- Pair width=device-width with initial-scale. 56 pages have both; one locks scale without a width.
- Fix the template first. All 36 articles share the same declaration, so one template change covers the section.
- Clean doctype and lang together. Two XHTML doctypes and 14 missing lang values are head-template issues.
Limits
- Cached, zero-request: homepages from 2026-10-31 to 11-01 and articles from 2026-11-03 08:40–08:41; later changes are not reflected.
- Declarations only: real layout width, text scaling and whether a browser ignores the declaration are not tested; browsers differ on user-scalable.
- Not an accessibility verdict: a zoom restriction is a risk signal, not a WCAG violation ruling.
- Sample shape: 61 pages from 25 homepages and 36 articles on 10 sites, not 61 independent sites; the two caches differ in date.
- Pilot: no industry claim.
Data and reproduction
Anonymised data: equipment-viewport-2026.csv (61 rows × 11 columns: page type, sample_id, page, viewport, width, initial-scale, two zoom declarations, zoom-disabled flag, HTML5 doctype, lang). The repository keeps docs/research/2026-11-viewport.csv.
Parser: scripts/viewport_probe.py; unit tests: scripts/test_viewport_probe.py (8 tests, no network). Run:
python -m unittest scripts.test_viewport_probe
Related: the article head metadata pilot, the homepage cache and compression pilot, and the article link structure pilot.
Sources and definitions
- Homepage cache: 25 homepages from study 4 (2026-10-31 to 11-01).
- Article cache: 36 pages from 10 sites in study 45 (2026-11-03 08:40–08:41), five JS shells excluded.
- Rules: viewport meta, zoom keywords, doctype and html lang, all static string matching.
- Scan: 2026-11-03, zero network requests.