服务器端渲染时图像在加载时拉伸到 100%

Image stretches to 100% while loading when server-side rendering

我有以下代码,它使用 Angular Material 使我的图像响应:

<picture [ngStyle.xs]="{'width': '100%'}" [ngStyle.gt-xs]="{'width': '448px', 'height': '60px'}">
  <source srcset="/assets/images/logo-text-lg.webp" type="image/webp" [ngStyle.xs]="{'width': '100%'}" [ngStyle.gt-xs]="{'width': '448px', 'height': '60px'}">
  <source srcset="/assets/images/logo-text-lg.png" type="image/png" [ngStyle.xs]="{'width': '100%'}" [ngStyle.gt-xs]="{'width': '448px', 'height': '60px'}">
  <img src="/assets/images/logo-text-lg.png" alt="TechScore" [ngStyle.xs]="{'width': '100%'}" [ngStyle.gt-xs]="{'width': '448px', 'height': '60px'}">
</picture>

除非是在超小屏幕上,否则目标是使其恰好为 448x60。那么它应该是页面宽度的 100%。这是可行的,因为我通过 Angular Universal 实现了服务器端渲染,即使在更大的屏幕上,我也能以 100% 的速度获得图像的闪光。

如果我查看源代码(禁用缓存),我可以看到来自服务器的标记包括 style="width: 100%",这意味着服务器端呈现的版本认为屏幕特别小。

如何让 Angular Universal 知道屏幕分辨率是多少,以及如何将该信息传递给 Angular Material 并覆盖它 认为的是分辨率,以便它选择正确的宽度?

更新

我想通过用户代理字符串检测它是否是移动浏览器,然后设置默认断点,如下所述:https://github.com/angular/flex-layout/wiki/Using-SSR-with-Flex-Layout

FlexLayoutModule.withConfig({ssrObserveBreakpoints: [isMobile() ? 'xs' : 'md']})

但我一定是做错了,因为我没有看到任何效果。

您可以考虑使用 CSS 媒体查询来处理图像的响应式样式。然后不会将硬编码的内联样式发送到客户端。浏览器将决定最初如何呈现图像。在应用适当的样式之前,您不必等待 JavaScript 执行(flash!)。

这是一个例子:

<picture class="my-picture">
  <source srcset="/assets/images/logo-text-lg.webp" type="image/webp">
  <source srcset="/assets/images/logo-text-lg.png" type="image/png" >
  <img src="/assets/images/logo-text-lg.png" alt="TechScore">
</picture>
.my-picture, .my-picture img, .my-picture source {
  width: 448px;
  height: 60px;
}

@media only screen and (min-width : 480px) {
  .my-picture, .my-picture img, .my-picture source {
    width: 100%;
    height: auto;
  }
}

您可以在 Typescript 中设置一个变量,说明屏幕是否处于移动状态(按宽度),然后更改 类。

这里有一个例子:

isMobile = false;
ngOnInit() {
    if (window.screen.width <= 480) { // 768px portrait
      this.isMobile = true;
    }
}

然后在您的模板中:

<picture [ngClass.xs] = "isMobile">
 ...
</picture>

Edit:

我看到您希望将屏幕尺寸输入服务器。除非您将此数据发送给他并保存,否则服务器无法获取屏幕尺寸。您可以在客户端启动时将 window.screen.width 发送到服务器,然后以您拥有的屏幕尺寸为特定用户提供服务。

如果您想在整个站点中保持相同的大小。可能对你有帮助。

 <picture>
          <source srcset="/assets/images/logo-text-lg.webp" class="my-picture" type="image/webp">
          <source srcset="/assets/images/logo-text-lg.png" class="my-picture" type="image/png" >
          <img src="/assets/images/logo-text-lg.png" class="my-picture" alt="TechScore">
 </picture>

<style>
        .my-picture {
          width: 448px;
          height: 60px;
        }

        @media only screen and (max-width : 480px) {
          .my-picture {
            width: 100%;
            height: auto;
          }
        }

       @media only screen and (max-width : 667px) {
          .my-picture {
            width: 50%;
            height: auto;
          }
        }

       @media only screen and (min-width : 668px) {
          .my-picture {
            width: 448px;
           height: 60px;
          }
        }

</style>

您可以根据需要更改尺寸。

请尝试CSS以下,这将保持比率。

 .img-fluid {
    max-width: 100%;
    height: auto;
     }

FlexLayout 可以 support server side rendering 但有一定的限制。

如果不先阅读本文档,我不会尝试使用它

Angular Flex Layout - Server Side Rendering