transform實現HTML5 video標籤視頻比例展開執行個體詳解_相關技巧

來源:互聯網
上載者:User

曾幾何時,項目中有碰到視頻比例展開的需求,但是發現這個看似再普通不過的一個需求,找遍全網至今都沒有找到解決方案。因為強制給video標籤設定width和height的話只會將video的顯示地區展開,但是裡面的視頻還是保持原始比例,怎麼調都沒用:

因為當我橫向展開時:

當我縱向展開時:

2016-09-21 11:15:40 更新:

感謝 @RileyRen 提醒,原來還有object-fit這一屬性,把它設定為fill就滿足需求了,淚奔~,這篇文章就當看個笑話吧,哎,不過可以看看我家喵星人的處女秀。

<style>video { object-fit:fill; width:800px; height:320px;}</style><h1>測試視頻比例展開:</h1><video src="http://7xnzpx.com1.z0.glb.clouddn.com/miaoxingren_360p.mp4" controls autoplay loop></video>

不過這一屬性相容性不太好,IE全軍覆沒,安卓要4.4.3以上才支援:

所以我這個方法還是有一點點價值的,哈哈。

解決方案一

有人會說,既然網頁上展開不了比例,那麼直接把視頻用轉碼工具展開比例然後重新轉碼不就是了?

沒錯,這就是我說的第一種解決方案,但是這對於少量視頻沒啥問題,如果有很多個視頻,全部轉碼又重新上傳也不太現實。剛開始我也確實是這麼做的,但是後來發現還有其它方法。

解決方案二

就是標題說的,借用transform來實現視頻比例展開。分2種情況,寬高比變大和寬高比變小。

完整DEMO示範

先來看個完整的DEMO,視頻主角是我家的喵星人,阿喵說:哎呀,要露臉了,好害羞~~~

http://demo.liuxianan.com/2016/01/09/html5-video-resize/

寬高比變大

保持寬度不變,調整rotateX即可實現高度變小,也就是寬高比變大了。看下圖:

舉個例子,假如原始視頻解析度是640*320(16:9),我想把它調成16:7,也就是640*280,那麼:

cos θ = 新高度 / 舊高度 = 280 / 360

用js計算角度(單位是deg):

var rotate = (Math.acos(280/360)*180/Math.PI).toFixed(2); // 新高度 / 舊高度

寬高比變小

寬高比減小時,以高度為基準,調整rotateY即可實現寬度變小,也就是寬高比變小了。

舉個例子,假如原始視頻解析度是640*320(16:9),我想把它調成4:3,也就是480*320,那麼:

cos θ = 新寬度 / 舊寬度 = 480 / 640

用js計算角度(單位是deg):

var rotate = (Math.acos(480/640)*180/Math.PI).toFixed(2); // 新寬度 / 舊寬度

總結

綜上,有了這2個方法就可以實現任意比例的視頻展開了,不過變形過程中需要注意位置可能發現的變化。

附

附上前面示範選擇的DEMO:

<!DOCTYPE html><html lang="zh"><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>旋轉比例類比</title> <style type="text/css">.content { position: absolute; width: 400px; height: 300px; -webkit-perspective: 400px; perspective: 400px; left: 100px; top: 100px;}.wrapper { position: absolute; width: 320px; height: 240px; transform: rotateY(-30deg) rotateX(0deg); border: solid 2px #000;}.wrapper.rotate{ transform: rotateY(-30deg) rotateX(50deg);}.wrapper:after { content: ''; display: block; position: absolute; width: 400px; left: -40px; top: 120px; height: 2px; background: black;}.wrapper img{ width: 100%; height: 100%;} </style></head><body> <div class="content"> <div class="wrapper">  <img src="http://test.liuxianan.com/sample.jpg"/> </div> <div class="wrapper rotate">  <img src="http://test.liuxianan.com/sample.jpg"/> </div> </div></body></html>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.