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 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 240