• <li id="yeaqi"><button id="yeaqi"></button></li>
  • <fieldset id="yeaqi"></fieldset>
    <fieldset id="yeaqi"><table id="yeaqi"></table></fieldset>

    •  

      重點聚焦!卡片放大播放效果實現總結,不同元素間的放大過渡效果如何實現?
      發布時間:2023-01-11 10:59:18 文章來源:程序員客棧
      背景最近一段時間做了幾個需求,其中涉及的素材列表展示,需要實現類似下方圖片中的動效,暫且稱之為【卡片放大播放動效】,具體細節如下:初

      背景

      最近一段時間做了幾個需求,其中涉及的素材列表展示,需要實現類似下方圖片中的動效,暫且稱之為【卡片放大播放動效】,具體細節如下:


      (相關資料圖)

      初始展示的是封面圖片,鼠標經過時是視頻放大的效果;下方文字內容區域,在放大前后展示的內容不同,而且兩者的字體大小是一致的,不是簡單的放大實現;四五個頁面都需要實現相同列表效果,列表的行數和列數是不一致的;
      image
      遇到的四個問題

      在整個實現過程中,遇到以下四個問題,后面的解析中會有對應解答。

      不同元素間的放大過渡效果如何實現?抽離為通用性組件時,如何實現類vue中的具名插槽效果,來替換下方文字信息區域?不同頁面中的列表區域寬度不同,有的頁面列表還是彈性寬度,常用的flex布局無法滿足要求,如何實現呢?邊界卡片放大后,如何避免被父級列表容器overflow:hidden`隱藏掉?實現解析

      這個動效,在愛奇藝官網也有類似效果,愛奇藝官網是通過生成初始狀態卡片列表和鼠標放大卡片列表兩套列表,然后通過動態計算放大卡片位置,相對于body進行絕對定位展示的。

      本實現方案通過將卡片初始狀態和放大狀態,封裝到一個組件中,通過兩者間的相對關系,利用css自動完成對應關系,避免了大量的JS計算。

      1. 放大效果實現

      UI對該動效的要求實際就是鼠標視頻放大播放,如果卡片初始狀態也放置視頻video,通過transition對同一元素進行scale放大也可以實現,但是這是一個列表,用戶進入頁面,就會同時加載多個視頻,用戶體驗不是很好。

      所以,實現方案就是卡片初始狀態放置poster圖片,鼠標經過時,在poster上方展示視頻層(絕對定位),然后對視頻執行animation動畫來模擬放大效果。

      卡片底部文字區域如何處理?

      由于卡片初始狀態下,底部文字區域在列表布局中是占位的,所以在卡片初始狀態下,底部文字區域使用正常文檔流。

      卡片鼠標經過狀態下,視頻層的放大效果是以poster中心點為放大原點的,所以底部文字區域使用absolute定位,相對于player進行定位處理。

      interfaceIItemData{src?:string;poster?:string;industry?:string;}interfaceIProps{posterClass:string;//poster區域寬高playerClass:string;//放大后視頻寬高樣式itemData:IItemData;children:{[key:string]:any};}lett:NodeJS.Timeout;constVideoItem:FC=({posterClass,playerClass,itemData,children,})=>{const[isHover,setIsHover]=useState(false);constonMouseEnter=()=>{t=setTimeout(()=>{//避免快速移動鼠標,造成視頻無法隱藏問題setIsHover(true);},50);};constonMouseLeave=()=>{clearTimeout(t);setIsHover(false);};return(Top1
      {isHover?({children?.playerBottom}
      ):null}
      {children?.posterBottom});};exportdefaultVideoItem;

      .container{position:relative;.poster{position:relative;background-position:center;background-size:cover;background-repeat:no-repeat;.player{z-index:10;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)scale(0.929);animation:showPlayer0.2sease;animation-fill-mode:forwards;.playerBottom{width:100%;position:absolute;top:100%;left:0;box-shadow:0px6px16px-8pxrgba(0,0,0,0.08),0px12px48px16pxrgba(0,0,0,0.03);filter:drop-shadow(0px9px28pxrgba(0,0,0,0.05));}}}.posterBottom{width:100%;}}@keyframesshowPlayer{0%{transform:translate(-50%,-50%)scale(0.929);}100%{transform:translate(-50%,-50%)scale(1);}}

      2. 抽離為通用組件時,卡片底部文字區域如何動態替換

      整個卡片組件,底部的文字區域在不同的場景下可能是不同的,所以作為通用性組件,需要將這部分抽離,支持動態替換。

      vue中最簡單的方式,就是插槽,通過插槽從外部動態傳入。但是react框架是不支持具名插槽的。所以,這個問題就轉換成了,react如何實現具名插槽?

      網上搜到了一種實現方式,通過傳入一個object來實現,具體效果如下:

      //cardList{{posterBottom:bottomInfo,playerBottom:bottomInfo,onClickPlayer:()=>{consturl=`${window.location.origin}/#/market/service/${item.itemId}`;window.open(url,"_blank");},}}//VideoItem{props.children?.playerBottom}{props.children?.posterBottom}

      當然,具名插槽還有其它的實現方式,后面會專門寫一篇文章總結學習下。

      3. 列表容器如果是彈性布局時,每行的列數無法固定,flex布局無法滿足

      這個問題是一個通用性問題,在容器寬度不固定時,flex布局,每行最后一個元素無法選中設置樣式,同時子元素個數不固定時,最后一行元素的間距會變大。

      這種情況下,就需要grid布局大顯身手了,以前很少用grid布局,這次也是學習到了,具體效果如下圖:

      在示例中,調整瀏覽器窗口大小,來實驗彈性布局觀看效果代碼片段

      image.png
      4. 卡片放大后,可能會被容器設置的overflow:hidden給遮蓋隱藏掉

      目前放大效果的實現方式,放大的視頻層是絕對定位的,參照物是每個卡片本身。所以在四周邊界處的卡片,放大后,很容易被容器給遮蓋。

      處理方式也很簡單,給容器多設置一些padding,讓放大部分足夠展示,然后用margin設置負值來調整布局

      .container{margin-left:-20px;margin-right:-20px;padding-left:20px;padding-right:20px;}

      總結

      每個產品需求里,可能都會隱藏著自己的盲點,將效果做到極致,就能獲得技術成長。在重復的需求里,多反思總結,尋找自己的提升點,這就是進步吧啊。

      相關推薦

      1.CSS 實現按鈕點擊動效的套路

      2.年份數字拼圖效果

      3.跑馬燈簡單版

      4.中心點靠近動畫解析

      關鍵詞: 初始狀態 絕對定位 這個問題

      樂活HOT

      • 四川正式啟動三級保供電調控措施保障民生用電 優化各類電源發電計劃
        四川正式啟動三級保供電調控措施

        繼8月11日、14日連續兩次召開電力保供工作緊急視頻會議后,8月15日,四川再次召開電力保供調度會。記者從會上獲悉,預計全省最大用電負荷將

      • 前7月四川能源項目累計完成投資493億元 油氣類項目完成投資159億元
        前7月四川能源項目累計完成投資4

        今年以來,四川積極擴大能源領域有效投資,前7月能源項目累計完成投資493億元、同比增長4%。8月15日,省能源局相關負責人介紹,前7月煤炭類

      • 四川加力加勁堅決遏制事故多發頻發態勢 有效提升預報預警水平
        四川加力加勁堅決遏制事故多發頻

        8月15日,全省防汛減災、森林草原防滅火工作電視電話會議召開,深刻汲取彭州8·13山洪災害教訓,分析研判當前形勢,安排部署下一步重點工作

      • 四川攀枝花推動打造職業能力建設工作品牌 提供人才廣闊展示舞臺
        四川攀枝花推動打造職業能力建設

        8月9日,攀枝花技師學院實習工廠里,焊花四濺,機器聲此起彼伏。身穿工作服的教師周樹春,在一間間操作室里進進出出,指導學生們焊接。過去

      • 上半年湖南物流需求平穩增長行業運行平穩 快遞業務量完成10.3億件
        上半年湖南物流需求平穩增長行業

        記者從省發改委獲悉,上半年全省物流需求平穩增長,行業運行總體平穩。全省社會物流總額64096 2億元,同比增長4 4%;全省物流業總收入為2270

      • 湖南各地工業企業忙生產全力以赴穩增長 生產線全力運轉
        湖南各地工業企業忙生產全力以赴

        在全球最大地下工程裝備制造基地,掘進機生產計劃已排到年底;千億級工程機械產業園區邊建設邊生產,打造智能制造標桿……時已立秋,三湘大

      • 江西贛州醫療衛生服務體系進一步完善 完善“三醫”聯動機制
        江西贛州醫療衛生服務體系進一步

        上猶縣水巖鄉衛生院醫生蔡昌才驅車前往金盆村為村民駱運招治病。以往,每月去醫院就診不僅路途遠,還要排隊。這幾年有了家庭醫生后,直接送

      • 江西堅持問題導向推進藥品安全專項整治走深走實 持續完善投訴舉報渠道
        江西堅持問題導向推進藥品安全專

        今年2月以來,省藥監局深入開展藥品安全專項整治行動,堅持問題導向,以嚴厲打擊違法犯罪行為、全面排查風險隱患為手段,推進專項整治行動

      • 江西九江多舉措為創業者營造良好創業貸款環境 就業創業事項一次性辦
        江西九江多舉措為創業者營造良好

        沒想到,現在直接在窗口就能辦理,真是太方便了。蔣瓊在九江市經營一家造型工作室,近期有意擴大生意規模,需要資金周轉。她帶齊資料來到九

      • 上半年江西新余全市外貿進出口總值同比增長84.3% 外貿主體活力持續激發
        上半年江西新余全市外貿進出口總

        記者從新余海關獲悉,今年上半年,新余市外貿取得了較好成績,全市外貿進出口總值184 3億元,同比增長84 3%,高出全國平均水平74 9個百分點

      • 南昌高新區多舉措推動重點項目建設加速跑 完善重大重點項目推進機制
        南昌高新區多舉措推動重點項目建

        作為南昌市第二季度集中開工的重大項目之一,南昌數谷產業園項目總投資100億元,計劃2024年5月完工交付使用,擬引進字節跳動、華為(南昌)工

      • 安徽淮南頒發優才卡落實高層次人才服務保障制度
        安徽淮南頒發優才卡落實高層次人

        淮南市向中國工程院院士、安徽理工大學校長袁亮頒發了第一張淮南市高層次人才優才卡。為深化我為人才辦實事實踐活動,落實高層次人才服務保

      • 宿州市埇橋區細化工作舉措筑牢防汛“安全堤”
        宿州市埇橋區細化工作舉措筑牢防

        連日來,宿州市埇橋區不斷細化各項工作舉措,壓實防汛各項責任,提升應急救援保障能力,筑牢防汛安全堤。目前,該區防汛物資已儲備到位,全

      • 安徽無為市“交地即交證”優化營商環境政策正式落地
        安徽無為市“交地即交證”優化營

        近日,無為市自然資源和規劃局、無為市福渡鎮人民政府在無為潤峰中海置業有限公司項目部現場舉行交地即交證頒證儀式,標志該市交地即交證優

      • 安徽全椒縣推動農村寄宿制學校試點工作
        安徽全椒縣推動農村寄宿制學校試

        設施齊全的衛生食堂、水沖式的獨立衛生間、樓道墻體粉刷一新的宿舍……走進安徽省全椒縣武崗學校,已經運行滿一年的農村特色寄宿制學校成果

      娛樂LOVE