---
# System prepended metadata

title: '[2023 15th鐵人賽] Day5 - 解析惡名昭彰的滑動廣告'
tags: [Advertising, 2023鐵人賽, qiita]

---

[![hackmd-github-sync-badge](https://hackmd.io/L0VoE8DxQXaOj0FgMHAaVQ/badge)](https://hackmd.io/L0VoE8DxQXaOj0FgMHAaVQ)
###### tags: `2023鐵人賽` `qiita` `Advertising`
# [2023 15th鐵人賽] Day5 - 解析惡名昭彰的滑動廣告

原文連結：[悪名高きスワイプ広告を解析する - Qiita](https://qiita.com/huzisuke/items/cdc63b4bf9d2ded5b5ca?utm_source=Qiitaニュース&utm_campaign=5f35ea5616-Qiita_newsletter_579_08_16&utm_medium=email&utm_term=0_e44feaa081-5f35ea5616-62820449)

--- 

[toc]

## 本文摘要

在被使用者厭惡的廣告當中，有一種叫做「滑動廣告」。

容易誤觸是原因之一，但經過調查發現，這個廣告似乎是故意將使用者轉移到廣告頁面，而非單純的誤觸。


![](https://i.imgur.com/wSOiSRO.png)

*滑動廣告是一種藉由左右滑動顯示圖片的廣告類型。*

## 什麼是滑動廣告

滑動廣告是在廣告聯盟網站上常見的廣告形式。

使用者可以用手指在螢幕上左右滑動，藉此切換廣告圖片。

特徵是利用滑動的互動性，使用多個訊息和媒體，提供引人入勝的廣告體驗。

## 為什麼會惡名昭彰

然而，滑動廣告並不受使用者歡迎。原因是它容易引發誤觸，一不小心點擊廣告導致頁面跳轉的機會非常高。

當然，從使用者的角度來看，可能會以為是自己誤觸了廣告，或是滑動的手指太早移開螢幕，才會導致跳轉到廣告頁面。

然而，根據本次調查結果，滑動廣告似乎是一種設計，即便使用者並未實際誤觸到，也會模擬誤觸的行為。

以下動畫展示當時的行為：

![](https://imgur.com/opkAgHk.gif)

*只有思慕昔（スムージー）的廣告，在上下滑動時會跳轉到廣告頁面。*

這明顯和*漫畫廣告的行為不同。*

*此外，我們還注意到，左右滑動時也不會造成畫面跳轉。*

## 總結

通過追蹤程式碼，發現滑動廣告只要符合以下條件，就會被視為點擊廣告：

- 點擊起始位置在廣告區域內
- 點擊持續時間不超過 250ms
- 點擊起始和結束位置的 X 坐標差不超過 50pix

換句話說，

**從廣告位置開始的垂直滑動，這動作將會被視為強制點擊廣告。**

所以，至今為止您感受到的「啊、糟糕」，

這絕對不是您的錯，而是廣告的運作方式。

## 相關程式碼

以下是使用 Developer Tools 仔細分析過的內容，其中名為 `swipegallery_layout.js` 的導案負責管理點擊位置等內容。

### 點擊開始時 (touchstart event)

第 1051 行～第 1061 行

重點如下：

- b.time = Date.now(); … 記錄點擊開始時間
- b.p = 0 … 記錄點擊開始座標，初始值為 0

由於 Source code 基本上經過了混淆處理，因此僅供參考。

```jsx
Y.prototype.Ba = function(a) {
    this.V || a.preventDefault();
    if (!this.W && 0 != this.b.length) {
        var b = this.T;
        b.U = !0;
        this.V ? (b.pageX = a.e.touches[0].pageX, b.G = a.e.touches[0].pageX) : (b.pageX = a.e.pageX, b.G = a.e.pageX);
        b.time = Date.now();
        b.A = 0;
        b.p = 0
    }
};
```

### 當手指在點擊時移動 (touchmove event)

第 1061 行～第 1089 行

重點如下：

- a.preventDefault(); … 這段語句將禁用垂直滾動時的畫面移動
- b.p = a.e.touches[0].pageX - b.pageX; … 將初始點擊位置和目前點擊位置的 X 軸座標值相減並代入

```jsx
    Y.prototype.Aa = function(a) {
        if (!this.W && 0 != this.b.length) {
            var b = this.T;
            if (this.V) {
                a.preventDefault();
                if (1 < a.e.touches.length || a.e.scale && 1 !== a.e.scale) return;
                b.p = a.e.touches[0].pageX - b.pageX;
                b.A = a.e.touches[0].pageX - b.G;
                b.G = a.e.touches[0].pageX
            } else {
                if (!b.U) return;
                b.p = a.e.pageX - b.pageX;
                b.A = a.e.pageX - b.G;
                b.G = a.e.pageX
            }
            b.ea = !0;
            var c = this.b[this.d].h();
            this.Ma = 0 > b.p ? 0 : 1;
            a = Math.abs(b.p / this.P);
            var d = !1;
            0 == this.Ma ? ($(c, this.H * a, this.I * a, this.J * a, this.K * a, 0), this.d != this.b.length - 1 ? (c = this.b[this.d + 1].h(),
                $(c, -this.H * (1 - a), -this.I * (1 - a), this.J * (1 - a), this.K * (1 - a), 0)) : d = !0) : ($(c, this.H * -a, this.I * -a, this.J * a, this.K * a, 0), 0 != this.d ? (c = this.b[this.d - 1].h(), $(c, this.H * (1 - a), this.I * (1 - a), this.J * (1 - a), this.K * (1 - a), 0)) : d = !0);
            d && (b.A /= Math.abs(b.A) / this.P + this.La);
            A(this.f.style, Eb(0));
            this.B += b.A;
            A(this.f.style, Fb(this.B, 0, 0))
        }
    };
```

### 結束點擊時 (touchend event)

第 1090 行～第 1097 行

重點如下：

```jsx
((50 > Math.abs(b.p))  // 點擊初始位置和結束位置的 X 座標值差小於 50pix
	&& 250 > a - b.time) // 且點擊持續時間小於 250ms
		&& (this.dispatchEvent("tap"), this.dispatchEvent("tap-" + this.d)), // 發生點擊廣告的事件
```

請注意下方敘述，從第 4 行開始的 `b.U && ...` 這段程式碼實現了上述功能。

```jsx
    Y.prototype.la = function(a) {
        if (!this.W && 0 != this.b.length) {
            var b = this.T;
            b.U && "mouseout" != a.type && (a = Date.now(), 500 < a - this.ua && (50 > Math.abs(b.p) && 250 > a - b.time) && (this.dispatchEvent("tap"), this.dispatchEvent("tap-" + this.d)), this.ua = a);
            b.U = !1;
            b.ea && (a = this.d, Math.abs(b.p) > this.Na && (0 > b.p ? a = this.d == this.b.length - 1 ? this.d : this.d + 1 : 0 < b.p && (a = 0 == this.d ? this.d : this.d - 1)), this.Q(a), b.ea = !1)
        }
    };
```

### 換言之，這些操作代表什麼

當使用者誤以為「在滑動螢幕時，手指卻意外觸摸到廣告」，這種所謂的誤觸實際上是經過精心編寫的「設計」。

當偵測到快速的垂直滑動時，會觸發跳轉到廣告頁面，此時畫面呈現靜止狀態，進而讓使用戶以為是自己「誤點擊」所導致。

反之，如果滑動速度較慢，不論垂直或橫向滑動都不會跳轉廣告頁面。

此外，由於圖像會跟著手指移動，即使被禁止滑動也不容易察覺。

## 誤觸廣告不僅損害使用者體驗，也降低廣告主的品牌價值

每當看到滑動廣告時，最明顯的感受就是，誤觸廣告對使用者並沒有任何好處。不僅損害所在網站的使用者體驗，對於那些被意外點擊的廣告主也不會產生良好印象。

雖然這只是我的猜測，可能存在一些公司利用這種誤觸廣告系統，藉此虛報展示給廣告主看的廣告曝光率。

雖然這次廣告主的產品我也實際使用過，今後也想繼續使用這個品牌，但看到透過這種方式展示廣告真的感覺非常遺憾。

希望廣告主能夠意識到，展示這類型的廣告只會降低品牌價值，並進一步採取相關措施，以確保未來不再出現這種形式的廣告。

從根本上來說，滑動廣告的廣告頁面跳轉絕不是使用者誤觸或程式錯誤造成，而是經過明確設計過的跳頁效果。

我不曉得這是公司的方針或單一工程師想出的壞主意，但比起使用者優先考慮個人利益的態度，同樣作為一名工程師實在令人感到遺憾。

    
## Release Note

### 2023/08/7

- 修正錯誤
- 新增說明

### 2023/08/08

- 新增 *syntax* highlighting 語法高亮效果
    - 感謝 [@getty104](https://qiita.com/getty104) 様

### 2023/08/10

- 新增 Release Note
- 刪除廣告主的名稱
    - 滑動廣告是由刊登網站設定所引起，無法確定廣告主是否得知這件事情。因此考慮品牌名聲，在此選擇不公開廣告主的名稱。
