电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

JS如何讓你的移動端交互體驗更加優秀

瀏覽:111日期:2024-03-26 09:32:52
目錄1. 即時反饋1.1 按鈕的即時反饋1.2 持續性的反饋1.3 頁面初始化1.4 數據的展示2. 行為跟隨2.1 點擊按鈕后呼起彈窗2.2 列表中有對象變動時2.3 絲滑的滑動跟隨3. 考慮移動設備的握持姿勢3.1 避免滾動穿透3.2 原生 select 標簽的使用4. 良好的兜底策略4.1 全屏沉浸式頁面應當保持關閉操作4.2 永遠不要相信后臺一直很穩定4.3 懶加載5. 總結1. 即時反饋

我們在玩游戲的過程中,通常都會遇到一個詞:“打擊感”,通俗的理解就是我們做出的每一個操作,都有很強烈的反饋,比如視覺上的動畫變化,聽覺上產生的聲音,或者移動設備的震動感等。

1.1 按鈕的即時反饋

在前端頁面中,也應當像游戲中的打擊感一樣,用戶任何的操作都應當予以即時的反饋,告訴用戶他的操作是有效的,系統已收到他的操作,內部正在處理中。

例如用戶在點擊頁面中的按鈕時,按鈕最好有一種被按下的效果:

button:active { transform: translateY(4px);}

若按鈕被下壓的效果不太適合頁面整體的風格,您也可以做一個背景顏色上的變化。

1.2 持續性的反饋

每個用戶的設備型號、網絡狀態等情況都不一樣,我們不能要求每個用戶都在良好的 WiFi 下操作我們的頁面。

若用戶的某個行為產生了網絡請求,并要根據請求返回的結果,反饋給用戶。這種情況,頁面都應當給用戶一種持續性的反饋,表示一個動作正在后臺執行。如果沒有這種效果,即使已經在請求接口了,用戶也會認為點擊沒有反應,會多次的去點擊按鈕,以期望得到響應。

我們可以在這里給自己定下一條規則:

凡是有網絡請求的情形,均要有 loading 效果的持續性反饋。

我們通常可以在用戶觸發的按鈕上展示 loading 效果,也可以在全局頁面上展示 loading 效果,這個根據每個頁面的風格自行選擇即可。

JS如何讓你的移動端交互體驗更加優秀

例如頁面上有個紅包需要點擊按鈕開啟,當用戶點擊按鈕后,按鈕就可以展示出一個旋轉的 loading 效果,待接口返回結果再打開紅包,展示具體的金額,或者其他的結果。

1.3 頁面初始化

在現在大部分前后端分離的場景下(同時沒有使用同構直出方案),都是先展示出一個沒有數據的前端頁面,然后請求數據,待數據返回后再渲染頁面。

這種情形和上面 1.2 中是一樣的,不過這個是在剛進入頁面就觸發的!這里我們也是要展示出 loading 效果的,只不過是 loading 展示的時機的問題。

1.先一個全局 loading 的開啟頁,在數據沒有返回回來時,看不到任何相關活動元素;

2.先用初始化的假數據或者兜底數據,渲染一個基本框架,然后在某個位置展示 loading 效果,并請求數據,數據返回后再替換假數據進行渲染。

這兩種方式也是各有不同的使用場景,就我個人而言,我更喜歡第 2 種方式,能夠第一時間將頁面中的元素展示給用戶;但如果頁面布局因接口的數據改變較大,建議還是采用第 1 種方式,這樣 loading 結束時,不會出現頁面大幅度閃動的感覺。

1.4 數據的展示

我們拿到接口的數據后,通常會有兩種展示狀態:

1.無數據,進行“暫無數據”之類的提示;

2.有數據,正常展示數據;

比如一個展示獎品列表中數據中,這里我們通常會初始化一個 list 變量來接收接口返回的數據:

const List = () => { const [list, setList] = useState([]); useEffect(() => { // 設置數據 // setList([]); }, []); return ( <div className='list'> {list.length ? (<div className='container'> {list.map((item) => ( <div key={item.key}>{item.title}</div> ))}</div> ) : (<div className='nothing'>暫無數據</div> )} </div> );};

在請求接口的過程中,頁面會展示什么?“暫無數據”,給用戶的第一視覺感受就是:我的獎品丟了。等過一會兒接口返回數據了,然后又重新將數據展示出來。

這里,我們就忽略了一個很重要的狀態:loading狀態。因為“暫無數據”,也是一種結果,不是過程,是要告訴用戶,您當前是沒有數據的。因此,不能把“暫無數據”作為 loading 狀態來展示。

const List = () => { const [loading, setLoading] = useState(true); const [list, setList] = useState([]); useEffect(() => { // 設置數據 // setList([]); setLoading(false); // 請求完接口,再把loading狀態取消,該展示什么結果就展示什么 }, []); if (loading) { return ( <div className='list'><div className='loading'>請求數據中...</div> </div> ); } return ( <div className='list'> {list.length ? (<div className='container'> {list.map((item) => ( <div key={item.key}>{item.title}</div> ))}</div> ) : (<div className='nothing'>暫無數據</div> )} </div> );};2. 行為跟隨

這里我也不太想好用個什么名字,概況來說,告訴用戶剛才發生了什么,將用戶操作可視化, 來增強用戶對操作行為的感知度, 同時也能對元素內容的認知。

因用戶行為產生的新交互,應當與當前用戶的行為相關。

2.1 點擊按鈕后呼起彈窗

用戶點擊按鈕后,會彈出一個彈窗,彈窗可以從按鈕所在的方向或者位置,彈出到整個頁面的中心。

JS如何讓你的移動端交互體驗更加優秀

給到用戶的感受就是該彈窗與按鈕是相關的。

2.2 列表中有對象變動時

例如在一個表格或者列表中,有新增、修改或者刪除一行(一列)的行為,可以用一個動畫和背景色來區分該元素, 過一段時間再恢復正常。

JS如何讓你的移動端交互體驗更加優秀

2.3 絲滑的滑動跟隨

在不添加任何 CSS 屬性時,滑動有滾動條區域時,總感覺有一種卡頓感,就是手指滑動時頁面就跟著滑動,手指離開則頁面停止滑動。

這里我們添加上一個屬性即可:

body { -webkit-overflow-scrolling: touch;}3. 考慮移動設備的握持姿勢

在現在手機屏幕越來越大的趨勢下,單手握持手機時,大模板只能在以左下角或者右下角為中心的區域活動。因此,在底部區域操作的情況越來越多,例如底部區域的導航,彈窗中點擊空白區域即可關閉等等。

3.1 避免滾動穿透

在一個可滾動的頁面中,呼起一個彈窗,這個彈窗中的內容也比較多,也需要滾動,如果不加處理的話,可能會造成兩個區域同時滾動,體驗不好。也就是避免滾動穿透。

這里我們就要把底層的滾動鎖住,只可以滾動處在最上層的區域。這里的原理我就不多講解,推薦一個我一直在使用的組件tua-body-scroll-lock,該組件導出了 2 個方法:

1.lock: 鎖定區域,傳入 dom 元素,則表示該 dom 區域內是可以滾動的;

2.unlock: 解除鎖定,當彈窗消除時,需要解除被鎖定的區域;

在 react 中的使用方式:

useEffect(() => { // 鎖定body的滾動,只在彈窗內部滾動 // 只有需要設置可以滾動區域時,才使用該方法 if (props.scrollContainer) { lock(props.scrollContainer); } return () => { if (props.scrollContainer) { unlock(props.scrollContainer); } };}, [props.scrollContainer]);

同時的,我們最好在遮罩區域添加可以關閉彈窗的操作,避免用戶伸手夠彈窗右上角的關閉按鈕。

3.2 原生 select 標簽的使用

在移動端開發中,下拉框我們使用原生 select 標簽時,iOS 和 Android 的表現是不一樣的,iOS 會出現在屏幕的底部,滾動選擇某個選項;而 Android 中,則是屏幕中間彈出一個彈層,然后可以進行選擇。

JS如何讓你的移動端交互體驗更加優秀

如果圖方便的話,其實可以使用原生的 select 標簽。但這種方式,總感覺與頁面元素之間產生了割裂,因此如果可以的話,盡量模擬出一個 select 標簽。

4. 良好的兜底策略

每個用戶的設備型號、網絡狀態等情況都不一樣。總會因為各種各樣的原因,導致頁面展示異常。因此,我們應當做好提示和一些兜底策略。

4.1 全屏沉浸式頁面應當保持關閉操作

通常情況下,在移動端 APP 中打開的頁面,頂部都會有一個白色的標題欄。但有些活動頁面為了更好地沉浸式體驗,會把白色標題欄去掉,同時還去掉了右劃退出的操作,只能點擊自定義的返回按鈕才能退出。

JS如何讓你的移動端交互體驗更加優秀

例如這個頁面,左上角的返回按鈕是頁面本身自定義的。而這個頁面必須是接口正常返回數據后才展示出來,在最開始時,如果有異常時,會展示錯誤信息,但沒有返回按鈕。這就導致用戶無法退出該活動,只能殺掉 APP 再重新進入。

體驗非常不好,這里我們就要保證:全屏沉浸式頁面不管是哪種狀態,應當全程保持關閉操作!

當然,現在已經沒有這個問題了。

4.2 永遠不要相信后臺一直很穩定

后臺經常說的一句話是“不要相信任何從前端傳過來的數據”,我們也一樣:

永遠不要相信后臺一直很穩定。

我們要做好接口服務可能會掛掉的預案:

1.設置請求接口的超時時間,不要讓用戶無限制等待;

2.良好的提示;

3.有條件時,可以自動重試,或者讓用戶手動嘗試重試請求接口;

4.采用兜底策略遮蓋;

前 3 種我們都可以理解,當接口異常并無法繼續后續的操作時,應當告知用戶有服務有異常了,可以稍后重試。

對于第 4 種,通常可能會發生在高并發的抽獎過程中,越是讓用戶重試,并發量就越高。因此在抽獎異常時,可以直接告訴用戶未中獎,而不是“服務異常”之類的話術。要不然,一方面會引起用戶的不滿,另一方面會造成用戶的大量重試。

這個百度在春晚發紅包中,就有用到過,在服務器短時間內承受到高并發量時,則直接告訴用戶未抽中紅包;同時,對于一些抽獎會同時發放多個獎品時,也要做好每個獎品服務都可以會掛掉的準備,比如同時會發放 3 個獎品:

1.服務都正常,正常發放;

2.2 個正常,就只發放 2 個獎品,左右排列;

3.只有 1 個服務正常,則只發放 1 個獎品,居中排列;

4.均異常,則告訴用戶未中獎;

千萬不要留有空間或者槽位告訴用戶“該位置本應該有獎品,但實際上沒有”的感覺。

4.3 懶加載

懶加載是一個老生常談的話題,這里我們只針對圖片懶加載來進行梳理。

在頁面中圖片比較多時,請盡量使用圖片懶加載,并考慮好圖片加載失敗的情況,可以先創建一個 Image 來先加載圖片,加載城后再給到頁面中的 dom 元素,否則使用兜底圖片:

// 判斷圖片是否可以加載成功const loadImage = (imgUrl: string): Promise<HTMLImageElement> => { return new Promise((resolve, reject) => { const img = new Image(); img.src = imgUrl; if (img.complete) { return resolve(img); } img.onload = () => { resolve(img); }; img.onerror = reject; });};// IntersectionObserver的回調,當dom元素進入到可是區域內時const targetExposeCallback = async (dom: HTMLElement) => { let original = dom.getAttribute(’data-original’); if (original) { try { await loadImage(original); } catch (err) { // 1x1的圖片 original = ’data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==’; } setLoading(false); if (dom.tagName.toLowerCase() === ’img’) { dom.setAttribute(’src’, original); } else { // eslint-disable-next-line dom.style.backgroundImage = `url('${original}')`; } dom.setAttribute(’data-original’, ’’); }};

同時,我們在體驗的過程中發現,在有些華為手機里,圖片還沒加載完畢時,會展示一個裂開的圖片,如果該圖片 alt 注釋,也把 alt 注釋顯示出來,稍過一會兒,等圖片加載完畢了,就正常展示圖片了。

這種情況,我們也可以使用圖片懶加載,或者將圖片設置為背景圖片,避免出現圖片裂開的狀態。

5. 總結

我們在移動端開發的過程中,總會有多種解決方案。如果我們站在用戶的角度多想一想,就能讓產品的交互體驗變的更好。

以上就是JS如何讓你的移動端交互體驗更加優秀的詳細內容,更多關于JS讓你的移動端交互體驗更加優秀的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 保定市泰宏机械制造厂-河北铸件厂-铸造厂-铸件加工-河北大件加工 | PE拉伸缠绕膜,拉伸缠绕膜厂家,纳米缠绕膜-山东凯祥包装 | 九爱图纸|机械CAD图纸下载交流中心| 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 打孔器,打孔钳厂家【温州新星德牌五金工具】 | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | nalgene洗瓶,nalgene量筒,nalgene窄口瓶,nalgene放水口大瓶,浙江省nalgene代理-杭州雷琪实验器材有限公司 | 不锈钢/气体/液体玻璃转子流量计(防腐,选型,规格)-常州天晟热工仪表有限公司【官网】 | 空气净化器租赁,空气净化器出租,全国直租_奥司汀净化器租赁 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 大型工业风扇_工业大风扇_大吊扇_厂房车间降温-合昌大风扇 | 定量包装秤,吨袋包装称,伸缩溜管,全自动包装秤,码垛机器人,无锡市邦尧机械工程有限公司 | 砂磨机_立式纳米砂磨机_实验室砂磨机-广州儒佳化工设备厂家 | 钢木实验台-全钢实验台-化验室通风柜-实验室装修厂家-杭州博扬实验设备 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 护腰带生产厂家_磁石_医用_热压护腰_登山护膝_背姿矫正带_保健护具_医疗护具-衡水港盛 | 政府园区专业委托招商平台_助力企业选址项目快速落地_东方龙商务集团 | 家乐事净水器官网-净水器厂家「官方」| 温湿度记录纸_圆盘_横河记录纸|霍尼韦尔记录仪-广州汤米斯机电设备有限公司 | 深圳货架厂_仓库货架公司_重型仓储货架_线棒货架批发-深圳市诺普泰仓储设备有限公司 | 蜗轮丝杆升降机-螺旋升降机-丝杠升降机厂家-润驰传动 | 工业铝型材生产厂家_铝合金型材配件批发精加工定制厂商 - 上海岐易铝业 | MOOG伺服阀维修,ATOS比例流量阀维修,伺服阀维修-上海纽顿液压设备有限公司 | 二手电脑回收_二手打印机回收_二手复印机回_硒鼓墨盒回收-广州益美二手电脑回收公司 | 胜为光纤光缆_光纤跳线_单模尾纤_光纤收发器_ODF光纤配线架厂家直销_北京睿创胜为科技有限公司 - 北京睿创胜为科技有限公司 | 高温链条油|高温润滑脂|轴承润滑脂|机器人保养用油|干膜润滑剂-东莞卓越化学 | pH污水传感器电极,溶解氧电极传感器-上海科蓝仪表科技有限公司 | 磁粉制动器|张力控制器|气胀轴|伺服纠偏控制器整套厂家--台灵机电官网 | 金库门,金库房,金库门厂家,金库门价格-河北特旺柜业有限公司 | 杰福伦_磁致伸缩位移传感器_线性位移传感器-意大利GEFRAN杰福伦-河南赉威液压科技有限公司 | 防爆电机生产厂家,YBK3电动机,YBX3系列防爆电机,YBX4节防爆电机--河南省南洋防爆电机有限公司 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 发光字|标识设计|标牌制作|精神堡垒 - 江苏苏通广告有限公司 | 合肥废气治理设备_安徽除尘设备_工业废气处理设备厂家-盈凯环保 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 工作服定制,工作服定做,工作服厂家-卡珀职业服装(苏州)有限公司 | 公交驾校-北京公交驾校欢迎您! 工作心得_读书心得_学习心得_找心得体会范文就上学道文库 | 玻璃瓶厂家_酱菜瓶厂家_饮料瓶厂家_酒瓶厂家_玻璃杯厂家_徐州东明玻璃制品有限公司 | 电动高压冲洗车_价格-江苏速利达机车有限公司 | 微型驱动系统解决方案-深圳市兆威机电股份有限公司 | 天津电机维修|水泵维修-天津晟佳机电设备有限公司 |