网络是一个充满活力的地方。不同的屏幕尺寸,等等。幸运的是,网络已经为此做好了准备。文字换行。CSS 让我们可以控制如何调整大小。我们无法轻易获得的是一种按比例缩放整个元素(及其子元素)的方法——保留其在尺寸改变时的确切布局。
但是我们可以做到。
*容器*的比例缩放非常容易
.parent {
height: 0;
padding-bottom: 56.25%; /* 16:9 */
position: relative;
}
如果您想在里面放置内容,您可以绝对定位一个覆盖容器在里面
.child {
position: absolute;
top: 0; left: 0;
width: 100%; height: 100%;
}
这对图像、可以独立滚动的容器或有大量空闲空间以应对形状发生巨大变化的容器非常有用。
如果此容器的内容是,比如,一个图像,它工作得很好!

但如果里面有 一堆 HTML 元素子元素 只做普通 HTML 元素做的事情,情况就不那么乐观了。

所有内容的比例缩放
假设我们要实现这样的效果

仅 CSS 无法实现。但 CSS 仍然是答案!transform: scale();
是我们需要的。它以完美的比例缩放事物。我们只需要给它一个缩放比例,而这个缩放比例我们可以用一些 JavaScript 来计算。
The trick is
var scale = Math.min(
availableWidth / contentWidth,
availableHeight / contentHeight
);
这是可能的一种方法,使用 jQuery 和 jQuery UI Resizeable(因为这对我很容易也很舒服)
查看 CodePen 上 Chris Coyier 创建的 Pen Resize with Scale (@chriscoyier) 。
其他方法……
SVG 本身就可以做到这一点。我们很快将在文章中介绍这一点。我有几句话要说。;)
此外,您可能可以使用 vw/vh 单位来调整所有内容的大小,但这听起来很麻烦,而且需要很多神奇数字。
您可能很少需要这样做
我之所以这么关注这个想法,是因为我注意到来自 Slides.com 的嵌入式幻灯片演示文稿就是这样工作的。
@chriscoyier 谢谢!内容按比例缩放,但背景大小可灵活调整以填充可用空间的 100%。pic.twitter.com/1CybHUBdoS
— Slides (@slides) 2015 年 11 月 18 日
这是一个完美的用例。Slides.com 为您提供了一个固定大小的画布来创建您的幻灯片,这完全有道理。然后这些幻灯片可以根据需要放大,以在更大的空间中演示。或者缩小以适应更小的屏幕(比如,如果您将它们嵌入到内容列很窄的博客文章中,或者在移动设备上查看)。
我也在考虑 嵌入式 Pen。有时人们设计 Pen 可以在更大的区域中工作,而当它被嵌入时,设计就会失效。我可以使用它来按比例调整内部内容的大小,但仅限于适应所需的大小。
也许是 iframe?可能主要是第三方或用户生成的内容,并且在比例很重要的情况下,否则,继续使用常规的 RWD 操作。
我一直使用 REMux (https://css-tricks.cn/remux-an-experimental-approach-to-responsive-web-design/)。它可以完成任务。但是,正如您所说,它需要“神奇数字”,特别是如果您希望文本在特定屏幕宽度内保持可读性。在 https://labdoor.com 上查看它的实际效果。
可以使用
max-width
/-height
来实现这一点,但这需要大约 4 个包装器<div>
,因为没有max-padding
这样的东西。Twitter 使用拉伸的
<canvas>
来实现这种效果,但这需要在 HTML 中添加一些内容,并在 JS 关闭时爆炸。(<canvas>
的行为就像反向<noscript>
。)可以使用伪元素和内联 SVG 纯粹用 CSS 实现,但这有点乱。我想知道如果有一个现成的 Sass 混合,它是否会更受欢迎……
@Kun 我怀疑您的答案是“使用 SVG”。
我个人使用过一种纯粹的 CSS 方法,即视窗单位(以及
calc()
和一些 Sass)来保持我的 HTML 幻灯片和所有内容的比例。我喜欢视窗单位方法,因为我发现它非常灵活,我所要做的就是更改传递给 混合 的参数的值以获得不同的纵横比。幻灯片上所有内容的尺寸要么设置为视窗单位,要么设置为em
,并且基本font-size
也设置为视窗单位——一个随机值,只是设置为最小尺寸的某个部分。我从未对此有过太多考虑,因为我通常只有一张幻灯片上内容这么多,所以对于幻灯片来说,它在大多数情况下都可以工作,最重要的是,它在所有相关情况下都可以工作,它失效的情况太极端了(无论如何,在那种尺寸下什么都不可读)。我同意 @Ana 的观点——视窗单位/SASS(或 LESS)/CSS calc() 组合是我在这里喜欢使用的方法,因为它省去了 JS 的因素(不过,在支持不支持 . 的浏览器时,必须使用 JS)。
如果上面的“神奇数字”问题与容器对象的边距/填充/边框宽度有关,而这些宽度会影响计算,那么将所有这些值放入 SASS/LESS 变量中,然后将它们放入 calc() 语句中对我来说就足够了。
我遇到的唯一问题是,旧的 Android 浏览器在 calc 语句中进行乘法和除法时会出现问题,但很多时候可以通过在 SASS/LESS 中计算所有常量值(即边距/填充/边框宽度)来解决。当然,IE8 会出现支持问题,但幸运的是,我们大多数人现在都不用担心这个问题了。
这是我们每天都要做的事情,使用带动画的“响应式”HTML 横幅,这些横幅必须按比例缩放,并且——坚持住——不是嵌入在 iframe 中,而是使用 JS 内联。
这基本上排除了视窗单位,而视窗单位会使所有操作变得不那么痛苦……
JS+scale 方法易于使用(Adobe Edge Animate 使用它来创建响应式横幅),但如果您对动画使用 transform,特别是旋转和缩放,然后缩放父容器,您将在 webkit 中遇到大量渲染问题(在桌面移动 Safari 和 Chrome 上有所不同)——模糊、像素化等——通常的情况。
我尝试过一种方法,使用一些 JS 来设置父容器的大小,并对所有内容使用%。比如,真的,完全不使用 px 或其他单位。这样,您可以避免对父容器使用 transform,因此可以消除许多与 webkit 渲染相关的痛苦,但也有很多缺点。CSS 编写起来更困难,您必须使用一些额外的矩形容器/包装器,但它渲染和缩放的效果非常好。
很快就会发布一个 Pen。
:)
是的,如果你想显示嵌入的视频,比例填充技巧非常有用。
至于缩放所有内容,我也在使用 svg(html 中的 foreignObject)。如果你想将字体大小缩放至父级 div(这在 css 中无法实现),这非常有效。
很高兴看到你终于明白了!是的,SVG 可以做得更好,但是直到低于标准的 WebKit 渲染引擎升级到处理 UHD 功能并支持 SVG 之前,苹果和安卓平板电脑(廉价的消费级操作系统)就无法使用。
例如,要使用 SVG 用最少的 CSS 和不进行 Javascript 计算来完成这项工作,请查看:http://svgdesign.guru
哇。
我之前不得不进行一些简单的文本和图片缩放,最后使用了基于视窗的方程式和 calc 来实现。一开始感觉很疯狂,后来我就习惯了。现在我几乎将它用于非常奇怪的过渡(比如 650-960),让更小和更大的过渡更加固定。
这是一个使用 mixinn 的笔:http://codepen.io/dsongman/full/VvWzdP
我在网络广告中使用过这个。我们只有两种类型的广告:移动广告和桌面广告,所以在平板电脑上,我会将桌面广告缩小以适应屏幕。(iframe 具有固定宽度和高度)。
我使用过类似的,虽然更复杂的技术来处理弹出式内容,例如 youtube 视频:http://codepen.io/anon/pen/epwrNQ 它保留了元素的原始纵横比,并根据窗口的纵横比对其进行调整大小。
为了避免在低于 1366 像素的尺寸上进行不必要的裁剪,我在此网站上使用网格手风琴内的背景图像使用了相同的技术:http://varegg.no/(为了获得最佳性能,请在 Windows 上使用 Firefox)。
CSS 单位 em 可以解决这个问题。使用它意味着你可以使用父元素的 font-size 来缩放元素及其内部的所有内容。
我们在 REMux 上工作,它完成了我们的工作,我们很快将在我们的网站 http://helpbase.in/ 上实时应用它。但是,就像你在这里提到的,如果希望文本在特定屏幕宽度内保持可读性,这可能需要这样做。
谢谢
此致 Jiya
有人可以分享一个使用这些概念或类似概念的企业级网站的例子吗?我想看看是否有任何实际应用。