最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 译|使用原生 CSS 实现自适应视频

    正文概述 掘金(前端zenblo)   2020-11-23   667

    译|使用原生 CSS 实现自适应视频

    我在研究 CSS 数学函数时,曾考虑过响应式 iframe,也能找到一些现有的解决方案,例如这个,但是需要使用包装器或 JavaScript。假如没有包装器,只使用原生 CSS 能实现相同的功能吗?

    首先,我们需要获取视频的宽高比。然而无法从属性中获取视频的宽高比(此方法存在于规范中,但浏览器不支持),因此需要使用自定义属性:

    <iframe
        width="560" height="315"
        style="--width: 560; --height: 315;"
        class="video"
        ...
    ></iframe>
    

    自定义属性中的宽度和高度必须在没有 px 单位的情况下使用,否则无法处理这些值来计算视频的宽高比。

    接着需要计算视频的宽高比:

    .video {
      --aspect-ratio: calc(var(--height) / var(--width));
    }
    

    并给高度添加单位:

    .video {
      --aspect-ratio: calc(var(--height) / var(--width));
      --height-with-units: calc(var(--height) * 1px);
    }
    

    在移动设备上 iframe 必须适应窗口大小,为此添加以下内容:

    .video {
      --aspect-ratio: calc(var(--height) / var(--width));
      --height-with-units: calc(var(--height) * 1px);
      
      max-width: 100%;
    }
    

    最后一步有点棘手,但也不是很难。在移动设备上,iframe 会被宽度压缩。如何才能获取实际的宽度呢?如果 iframe 被拉伸到页面宽度,那么页面宽度大约等于窗口宽度,那么我们可以使用 viewport 数值来表示 iframe 的宽度,它将等于 100vw。使用 iframe 实际的宽度以及宽高比,就可以计算高度:

    calc(100vw * var(--aspect-ratio))
    

    这个表达式只适用于 iframe 的宽度等于窗口宽度的移动设备。桌面应用该怎么处理呢?可以根据屏幕大小,借助 CSS 数学计算为 iframe 获取适当的高度。用 min() 来选择哪个高度更适合:

    height: min(calc(100vw * var(--aspect-ratio)), var(--height-with-units));
    

    如果从 100vw 计算的高度大于初始高度,则 min() 将选择初始高度,iframe 不会增长更多。相反,如果从 100vw 计算的高度小于初始高度,min() 将选择计算高度,iframe 将被高度压缩。

    最终的 CSS 代码:

    .video {
      /* 获取宽高比 */
      --aspect-ratio: calc(var(--height) / var(--width));
      /* 给高度添加单位 */
      --height-with-units: calc(var(--height) * 1px);
    
      max-width: 100%;
    
      /* 获取初始最小高度
         或根据窗口宽高比来计算高度 */
      height: min(calc(100vw * var(--aspect-ratio)), var(--height-with-units));
    }
    

    打开在线示例并通过调整窗口大小来查看其工作方式。

    注意: 如果在预处理器(SCSS、Less)中使用以上代码,要避免在不同的计量单位下处理 min()。使得预处理器强制忽略 CSS 数学函数,在 SCSS 中,函数名必须以大写字母:Min(…) 开头;而对于 Less 函数,必须这样包装:~”min(…)”

    我没有在实际项目中使用过这个解决方案,但希望它会有用。



    起源地下载网 » 译|使用原生 CSS 实现自适应视频

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元