【发布时间】:2011-09-08 11:15:08
【问题描述】:
有没有一种方法可以使用 CSS3 边框半径属性切断我的 html5 视频元素的角?
查看this example。它不工作。
【问题讨论】:
标签: google-chrome webkit html5-video css
有没有一种方法可以使用 CSS3 边框半径属性切断我的 html5 视频元素的角?
查看this example。它不工作。
【问题讨论】:
标签: google-chrome webkit html5-video css
创建一个带有圆角和溢出:隐藏的 div 容器。然后将视频放入其中。
<style>
.video-mask{
width: 350px;
border-radius: 10px;
overflow: hidden;
}
</style>
<div class="video-mask">
<video></video>
</div>
【讨论】:
我们有一个圆角和阴影播放的视频,它很简单:
border-radius: 22px;
overflow: hidden;
-webkit-transform: translateZ(0);
box-shadow: 0 19px 51px 0 rgba(0,0,0,0.16), 0 14px 19px 0 rgba(0,0,0,0.07);
密钥是-webkit-transform: translateZ(0)。这行代码告诉浏览器在 GPU 上渲染,而不是使用
从 Safari 11、Chrome 65、Firefox 59、Edge Win 10 和 IE 11 开始测试和工作
【讨论】:
只要您set the appropriate 180px height for the 320px width video(16:9 宽高比),它就可以在 Firefox 中使用 - 否则弯曲的边框是不可见的,因为它们在视频的框架之外。
WebKit 中有一些突出的错误与它与 border-radius、like this one 或 this one specifically about the video element 一致地剪辑内容有关。
【讨论】:
很遗憾,Chrome 和 Safari 不支持 <video> 元素的边框半径。
【讨论】:
如果您的所有视频大小相同,您可以使用带有 SVG 文件的 CSS mask。如果您的视频是动态大小的,那会让事情变得更加困难...... (编辑:SVG 蒙版似乎会自动缩放,所以这个解决方案应该可以工作)
例如,您可以添加
-webkit-mask-image: url(http://f.cl.ly/items/1e181Q0e3j0L3L3z2j3Z/rect.svg)
到你的 .rc 类,它应该可以在 Chrome 中工作。
编辑:这似乎只有在您删除视频中的内联 height 和 width 声明时才有效...不过,您可以将它们放入您的 CSS 中。
【讨论】:
试试这个。它应该可以工作。
-webkit-mask: url(mypath/mask.png);
其中 mask.png 应该是圆角形状。 用一个圆圈快速做到这一点。 [删除网址]
【讨论】:
2019 年 10 月更新
视频的边框半径现在可以在 firefox、chrome 和 safari 上使用 mac、安卓和iOS。
Chrome Mobile Bug - 如果某些 Chrome android 浏览器导致您出现舍入问题,只需将以下属性添加到视频 css。只是一个1px的透明图片,解决了安卓手机的chrome边框半径渲染问题
-webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);
在这里测试 - https://jsfiddle.net/hzd4vec2/
<!DOCTYPE html>
<html>
<head>
<title>Border-radius test</title>
<style type="text/css">
body{
background: #000000;
margin: 0px;
}
#capsule{
height: 600px;
background: #000;
border-radius: 1000px;
-webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);
}
</style>
</head>
<body>
<video id="capsule" src="http://clips.vorwaerts-gmbh.de/VfE_html5.mp4"
autoplay muted loop></video>
</body>
</html>
【讨论】:
【讨论】:
试试看这个:http://www.gerbenvanerkelens.com/1778/let%E2%80%99s-talk-about-the-html5-video-tag/
对于 CSS 来说是:
video{
width:320px;
-moz-border-radius:40px;
-webkit-border-radius:40px;
border-radius:40px;
overflow:hidden;
}
【讨论】:
这至少可以通过画布和 JavaScript 来完成 (Introduction how to manipulate video frame data with canvas)。你基本上画了一个新的画布,在那里应用视频帧数据,然后剪掉圆角。我快速创建了这个,所以没有检查抗锯齿是否可以改进,但至少它做了四舍五入。性能方面,你可以想象这并不像应用 CSS 或其他东西那么好,但它至少应该适用于所有支持画布的浏览器。
var video = document.getElementById("video");
var c1 = document.getElementById("roundy");
var ctx = c1.getContext("2d");
video.addEventListener("play", function() {
timerCallback();
}, false);
var timerCallback = function() {
if (video.paused || video.ended) {
return;
}
computeFrame();
setTimeout(function () {
timerCallback();
}, 0);
};
var computeFrame = function() {
var w = 480;
var h = 320;
var r = 20;
ctx.clearRect(0,0,w,h);
ctx.globalCompositeOperation = 'destination-atop';
ctx.fillStyle = "#09f";
roundRect(ctx, 0,0,w,h,r,true,false);
ctx.drawImage(video, 0, 0, w, h);
return;
}
// http://js-bits.blogspot.com/2010/07/canvas-rounded-corner-rectangles.html
function roundRect(ctx, x, y, width, height, radius, fill, stroke) {
if (typeof stroke == "undefined" ) {
stroke = true;
}
if (typeof radius === "undefined") {
radius = 5;
}
ctx.beginPath();
ctx.moveTo(x + radius, y);
ctx.lineTo(x + width - radius, y);
ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
ctx.lineTo(x + width, y + height - radius);
ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
ctx.lineTo(x + radius, y + height);
ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
ctx.lineTo(x, y + radius);
ctx.quadraticCurveTo(x, y, x + radius, y);
ctx.closePath();
ctx.clip();
}
示例:http://jsfiddle.net/niklasvh/aFcUh/(播放顶部视频以查看底部画布上的效果)。
【讨论】:
来自 bootstrap 的class="img-rounded" 使用 video.js 对我来说效果很好
<link href="//vjs.zencdn.net/4.3/video-js.css" rel="stylesheet">
<script src="//vjs.zencdn.net/4.3/video.js"></script>
<video id="example_video_1" class="video-js vjs-default-skin img-rounded"
controls preload="auto" width="640" height="264">
<source src="http://example.com/test_video.mp4" type='video/mp4'/>
</video>
【讨论】:
以下解决方案适用于我的网站,嵌入了视频标签和 youtube
.video{
border-radius: 10px;
overflow: hidden;
z-index: 1;
height: 480px; /*it can deleted, if height is not restricted*/
width: 640px;
}
<div class="video">
<iframe width="640" height="480" src="https://www.youtube.com/embed/..." frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe>
</div>
<div class="video">
<video controls>
<source src="..." type="video/mp4">
</video>
</div>
UPD 我遇到了 youtube 嵌入式 iframe 的问题,容器 .video 的高度比其子 iframe 大 3px。它使底角有点不正确。 只需在 .video 类中添加 font-size: 0 即可解决问题
.video{
border-radius: 10px;
overflow: hidden;
z-index: 1;
font-zie: 0
height: 480px; /*it can deleted, if height is not restricted*/
width: 640px;
}
【讨论】:
在 Chrome、Firefox 和 Safari 上测试:
CSS:
.rounded {
border-radius: 20px;
overflow: hidden;
-webkit-transform: translateZ(0);
}
HTML:
<div class="rounded">
<video>.....</video>
</div>
【讨论】:
我仅使用 CSS 和精灵图像就完成了这项工作。这适用于所有浏览器,不需要任何 JavaScript。
通过设置为 position: relative; 的 div 包围视频您可以使用 z-index 和绝对定位在视频顶部的四个角分别放置四个 div。然后将精灵背景图像放入与背景颜色相同颜色的四个圆角中的每一个中。本质上是用一个角落的图像覆盖视频。
这是一个工作示例:http://jsfiddle.net/476tC/
它的代码也位于下面:
<style>
video {
width: 100%;
height: auto;
}
.corner-frame {
width: 100%;
position: relative;
}
.corner-top-left, .corner-top-right, .corner-bot-left, .corner-bot-right {
width: 10px;
height: 10px;
position: absolute;
background: url(http://i45.tinypic.com/5l520j.png) no-repeat;
z-index: 1;
}
.corner-top-left { top: 0; left: 0; background-position: 0 0 ; }
.corner-top-right { top: 0; right: 0; background-position: -10px 0 ; }
.corner-bot-left { bottom: 4px; left: 0; background-position: 0 -10px ; }
.corner-bot-right { bottom: 4px; right: 0; background-position: -10px -10px ; }
</style>
<div class="corner-frame">
<video controls>
<source src="http://ia700204.us.archive.org/18/items/blue_shoes/blue_shoes.mp4" type="video/mp4">
<source src="http://ia700204.us.archive.org/18/items/blue_shoes/blue_shoes-portable.ogv" type="video/ogg">
</video>
<div class="corner-top-left"></div>
<div class="corner-top-right"></div>
<div class="corner-bot-left"></div>
<div class="corner-bot-right"></div>
</div>
我创建的精灵只有 20 像素 x 20 像素,并且只有大约 10 像素的圆角。如果您想下载 Photoshop 文件并更改角落颜色或增加尺寸,您可以在此处获取 PSD 文件:http://www.mediafire.com/?bt9j0vhsmzfm9ta
【讨论】:
我在带有父级 (div) 和内部视频的现代浏览器中使用它。
父级具有border-radius: 8px 和overflow: hidden。视频只需要display: grid 使底部边缘也圆润。
【讨论】:
如前所述,border-radius 确实可以在 Firefox 和 Chrome 中使用,具体取决于视频类型。我发现有必要使用 video, video::first-child for mp4 来设置样式。 mp4 可能有一个内层(边框)。当我注意到 ogg 和 webm 正在工作而 mp4 没有工作时,我做了第一个孩子。
【讨论】:
从视频标签内部删除width="320" height="240"并添加到您的css文件.rc{width:320; height:240; outline:none; border-radius:15px }
我希望这个解决方案对你有用:)
【讨论】: