• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用Web组件管理网页缩放
2<!--Kit: ArkWeb-->
3<!--Subsystem: Web-->
4<!--Owner: @zourongchun-->
5<!--Designer: @zhufenghao-->
6<!--Tester: @ghiker-->
7<!--Adviser: @HelloCrease-->
8
9Web组件支持手势缩放、鼠标滚轮、键盘缩放,以方便用户调整到舒适的显示大小。并对应用提供监听、控制页面缩放比例的功能,以便应用实现个性化的视觉效果。
10
11## 启用/禁用网页缩放
12
13### 启用/禁用网页手势缩放
14
15通过属性[zoomAccess](../reference/apis-arkweb/arkts-basic-components-web-attributes.md#zoomaccess)控制网页缩放功能,当设置为false时,网页不允许手势缩放行为。
16
17当html网页设置`<meta name="viewport" id="viewport" content="user-scalable=no">`时,网页不允许手势缩放。
18
19仅当`zoomAccess`和`viewport`标签都设置为允许缩放时,才允许手势缩放。
20
21> **说明:**
22>
23> 在PC/2in1设备上,`viewport`标签不生效,仅能通过设置`zoomAccess`为`false`来禁用手势缩放。
24>
25> 以上方法仅能控制缩放功能的开关,但如果网页在`viewport`标签中设置了`minimum-scale`和`maximum-scale`,那么缩放的范围也会受到这两个属性的限制,当最大、最小值相等时,网页也是不能缩放的。目前,ArkWeb暂未提供强制缩放页面的功能。
26>
27> 另外,网页的内容宽度也会限制缩小的比例。
28
29```ts
30// xxx.ets
31import { webview } from '@kit.ArkWeb';
32
33@Entry
34@Component
35struct WebComponent {
36  controller: webview.WebviewController = new webview.WebviewController();
37
38  build() {
39    Column() {
40      Web({ src: 'www.example.com', controller: this.controller })
41        .zoomAccess(false)
42    }
43  }
44}
45```
46
47### 启用/禁用网页键盘鼠标缩放
48
49ArkWeb默认支持通过`Ctrl`+按键`'-'/'+'` 或者 `Ctrl`+鼠标滚轮进行缩放。应用可以通过拦截键盘事件来阻止按键缩放,当前暂未支持拦截`Ctrl`+鼠标滚轮缩放。
50
51通过拦截键盘事件来阻止按键缩放:
52
53```ts
54// xxx.ets
55import { webview } from '@kit.ArkWeb';
56import { KeyCode } from '@kit.InputKit';
57
58@Entry
59@Component
60struct WebComponent {
61  controller: webview.WebviewController = new webview.WebviewController();
62
63  build() {
64    Column() {
65      Web({ src: 'www.example.com', controller: this.controller })
66        .zoomAccess(true)
67        .onKeyPreIme((event) => {
68          if (event.type == KeyType.Down &&
69              event.getModifierKeyState &&
70              event.getModifierKeyState(['Ctrl']) &&
71              (event.keyCode == KeyCode.KEYCODE_MINUS || event.keyCode == KeyCode.KEYCODE_EQUALS ||
72               event.keyCode == KeyCode.KEYCODE_NUMPAD_SUBTRACT || event.keyCode == KeyCode.KEYCODE_NUMPAD_ADD)) {
73            return true;
74          }
75          return false;
76        })
77    }
78  }
79}
80```
81
82## 监听页面缩放比例变化
83
84应用可以通过[onScaleChange](../reference/apis-arkweb/arkts-basic-components-web-events.md#onscalechange9)接口监听页面缩放比例的变化。
85该接口事件对应手势事件(双指缩放),`event.newScale`对应网页属性`visualViewport.scale`。
86
87```ts
88// xxx.ets
89import { webview } from '@kit.ArkWeb';
90
91@Entry
92@Component
93struct WebComponent {
94  controller: webview.WebviewController = new webview.WebviewController();
95
96  build() {
97    Column() {
98      Web({ src: 'www.example.com', controller: this.controller })
99        .onScaleChange((event) => {
100          console.info('onScaleChange changed from ' + event.oldScale + ' to ' + event.newScale);
101        })
102    }
103  }
104}
105```
106
107## 控制网页的缩放比例
108
109应用可以通过设置[initialScale](../reference/apis-arkweb/arkts-basic-components-web-attributes.md#initialscale9)属性设置页面初始缩放比例。
110
111应用可以通过[zoom](../reference/apis-arkweb/arkts-apis-webview-WebviewController.md#zoom)、[zoomIn](../reference/apis-arkweb/arkts-apis-webview-WebviewController.md#zoomin)、[zoomOut](../reference/apis-arkweb/arkts-apis-webview-WebviewController.md#zoomout)接口控制页面缩放。
112
113 > **说明:**
114 >
115 > 使用以上接口控制页面缩放时,必须设置属性`zoomAccess`为`true`。`zoomAccess`为`false`时,`zoom`类接口会抛出异常`17100004`。
116
117### 以固定比例缩放页面
118
119`zoomIn`将当前网页进行放大,比例为25%;`zoomOut`将当前网页进行缩小,比例为20%。
120
121```ts
122// xxx.ets
123import { webview } from '@kit.ArkWeb';
124import { BusinessError } from '@kit.BasicServicesKit';
125
126@Entry
127@Component
128struct WebComponent {
129  controller: webview.WebviewController = new webview.WebviewController();
130  build() {
131    Column() {
132      Button('zoomIn')
133        .onClick(() => {
134          try {
135            this.controller.zoomIn();
136          } catch (error) {
137            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
138          }
139        })
140      Button('zoomOut')
141        .onClick(() => {
142          try {
143            this.controller.zoomOut();
144          } catch (error) {
145            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
146          }
147        })
148      Web({ src: 'www.example.com', controller: this.controller })
149        .zoomAccess(true)
150    }
151  }
152}
153```
154
155### 根据输入值控制页面缩放比例:
156
157`zoom`基于当前网页比例进行缩放,入参要求大于0,当入参为1时为默认加载网页的缩放比例,入参小于1为缩小,入参大于1为放大。
158
159```ts
160// xxx.ets
161import { webview } from '@kit.ArkWeb';
162import { BusinessError } from '@kit.BasicServicesKit';
163
164@Entry
165@Component
166struct WebComponent {
167  controller: webview.WebviewController = new webview.WebviewController();
168  @State factor: number = 1;
169
170  build() {
171    Column() {
172      TextInput()
173        .type(InputType.NUMBER_DECIMAL)
174        .onChange((value)=>{
175            this.factor = Number(value);
176        })
177      Button('zoom')
178        .onClick(() => {
179          try {
180            this.controller.zoom(this.factor);
181          } catch (error) {
182            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
183          }
184        })
185      Web({ src: 'www.example.com', controller: this.controller })
186        .zoomAccess(true)
187    }
188  }
189}
190```
191![zoom-by-step](./figures/zoom-by-step.gif)
192
193### 缩放页面到目标比例:
194
195通过`onScaleChange`接口,应用可以得知当前网页的缩放比例,配合`zoom`接口即可实现将页面缩放至指定比例的功能。根据当前页面缩放比例`pageFactor`和目标比例`targetFactor`计算`zoom`入参的公式为:
196
197```
198factor = 100 * targetFactor / pageFactor
199```
200
201```ts
202// xxx.ets
203import { webview } from '@kit.ArkWeb';
204import { BusinessError } from '@kit.BasicServicesKit';
205
206@Entry
207@Component
208struct WebComponent {
209  controller: webview.WebviewController = new webview.WebviewController();
210  @State targetFactor: number = 1;
211  @State pageFactor: number = 100;
212
213  build() {
214    Column() {
215      TextInput()
216        .type(InputType.NUMBER_DECIMAL)
217        .onChange((value)=>{
218          this.targetFactor = Number(value);
219        })
220      Button('zoom')
221        .onClick(() => {
222          try {
223            let factor = this.targetFactor * 100 / this.pageFactor;
224            this.controller.zoom(factor);
225          } catch (error) {
226            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
227          }
228        })
229      Web({ src: 'www.example.com', controller: this.controller })
230        .zoomAccess(true)
231        .onScaleChange((event) => {
232          console.info('onScaleChange changed from ' + event.oldScale + ' to ' + event.newScale);
233          this.pageFactor = event.newScale;
234        })
235    }
236  }
237}
238```
239![zoom-to-target](./figures/zoom-to-target.gif)
240