曾幾何時(shí),項(xiàng)目中有碰到視頻比例拉伸的需求,但是發(fā)現(xiàn)這個(gè)看似再普通不過(guò)的一個(gè)需求,找遍全網(wǎng)至今都沒(méi)有找到解決方法。因?yàn)閺?qiáng)制給video標(biāo)簽設(shè)置width和height的話(huà)只會(huì)將video的顯示區(qū)域拉伸,但是里面的視頻還是保持原始比例,怎么調(diào)都沒(méi)用:
因?yàn)楫?dāng)我橫向拉伸時(shí):

當(dāng)我縱向拉伸時(shí):

2016-09-21 11:15:40 更新:
感謝 @RileyRen 提醒,原來(lái)還有object-fit這一屬性,把它設(shè)置為fill就滿(mǎn)足需求了,淚奔~,這篇文章就當(dāng)看個(gè)笑話(huà)吧,哎,不過(guò)可以看看我家喵星人的處女秀。
style>
video {
object-fit:fill;
width:800px;
height:320px;
}
/style>
h1>測(cè)試視頻比例拉伸:/h1>
video src="http://7xnzpx.com1.z0.glb.clouddn.com/miaoxingren_360p.mp4" controls autoplay loop>/video>
不過(guò)這一屬性兼容性不太好,IE全軍覆沒(méi),安卓要4.4.3以上才支持:

所以我這個(gè)方法還是有一點(diǎn)點(diǎn)價(jià)值的,哈哈。
解決方法一
有人會(huì)說(shuō),既然網(wǎng)頁(yè)上拉伸不了比例,那么直接把視頻用轉(zhuǎn)碼工具拉伸比例然后重新轉(zhuǎn)碼不就是了?
沒(méi)錯(cuò),這就是我說(shuō)的第一種解決方法,但是這對(duì)于少量視頻沒(méi)啥問(wèn)題,如果有很多個(gè)視頻,全部轉(zhuǎn)碼又重新上傳也不太現(xiàn)實(shí)。剛開(kāi)始我也確實(shí)是這么做的,但是后來(lái)發(fā)現(xiàn)還有其它方法。
解決方法二
就是標(biāo)題說(shuō)的,借用transform來(lái)實(shí)現(xiàn)視頻比例拉伸。分2種情況,寬高比變大和寬高比變小。
完整DEMO演示
先來(lái)看個(gè)完整的DEMO,視頻主角是我家的喵星人,阿喵說(shuō):哎呀,要露臉了,好害羞~~~
http://demo.liuxianan.com/2016/01/09/html5-video-resize/
寬高比變大
保持寬度不變,調(diào)整rotateX即可實(shí)現(xiàn)高度變小,也就是寬高比變大了??聪聢D:

舉個(gè)例子,假如原始視頻分辨率是640*320(16:9),我想把它調(diào)成16:7,也就是640*280,那么:
cos θ = 新高度 / 舊高度 = 280 / 360
用js計(jì)算角度(單位是deg):
var rotate = (Math.acos(280/360)*180/Math.PI).toFixed(2); // 新高度 / 舊高度
寬高比變小
寬高比減小時(shí),以高度為基準(zhǔn),調(diào)整rotateY即可實(shí)現(xiàn)寬度變小,也就是寬高比變小了。
舉個(gè)例子,假如原始視頻分辨率是640*320(16:9),我想把它調(diào)成4:3,也就是480*320,那么:
cos θ = 新寬度 / 舊寬度 = 480 / 640
用js計(jì)算角度(單位是deg):
var rotate = (Math.acos(480/640)*180/Math.PI).toFixed(2); // 新寬度 / 舊寬度
總結(jié)
綜上,有了這2個(gè)方法就可以實(shí)現(xiàn)任意比例的視頻拉伸了,不過(guò)變形過(guò)程中需要注意位置可能發(fā)現(xiàn)的變化。
附
附上前面演示選擇的DEMO:
!DOCTYPE html>
html lang="zh">
head>
meta charset="utf-8">
meta name="viewport" content="width=device-width, initial-scale=1.0">
title>旋轉(zhuǎn)比例模擬/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>
您可能感興趣的文章:- html form表單基礎(chǔ)入門(mén)案例講解
- php 下 html5 XHR2 + FormData + File API 上傳文件操作實(shí)例分析
- HTML的form表單和django的form表單
- PHP使用HTML5 FormData對(duì)象提交表單操作示例
- Asp.net webForm設(shè)置允許表單提交Html的方法
- Java Web使用Html5 FormData實(shí)現(xiàn)多文件上傳功能
- C#通過(guò)html調(diào)用WinForm的方法
- HTML form表單提交方法案例詳解