【问题标题】:*ngIf hide some content on mobile screen, Angular 4*ngIf 在移动屏幕上隐藏一些内容,Angular 4
【发布时间】:2018-04-12 13:45:30
【问题描述】:

我有:

showHide: false;

<div *ngIf="showHide">
  Content
</div>

<button (click)="showHide = !showMap">
  Button visited only max-width: 768px
</button>

在 MAX-width: 768px 上,我有一个按钮。在 MIN-width: 768px 上,按钮被隐藏。 当我单击按钮时 - 它显示一个 DIV。 它工作正常。

但是

如何让 *ngIf 仅在 MAX-width: 768px 时有效?

最大高度:768px

  • 按钮显示:块
  • DIV 是显示:无(但是当我单击按钮时 = 显示:
    块)

最小高度:768px:

  • 按钮显示:无
  • DIV 显示:块

当我从示例 500px 调整到 1000px 时: 这取决于我按下的按钮

【问题讨论】:

  • 通过 CSS 比使用 Angular 更好,只需使用媒体查询来隐藏元素。
  • 无 CSS。在我从示例 500px 调整到 1000px 的那一刻:这取决于我按下的按钮和 MIN-height; 768px - showHide 是假的所以我没有 DIV 内容
  • 当 500px 我不点击按钮 - 我没有 DIV。但是当我调整到 1000 像素时 - 我没有 DIV,但我想要最小高度上的 DIV:768 像素。 *ngIf 隐藏 DIV,直到您单击该按钮。但我想在 500 像素上隐藏 DIV,但我想在 1000 像素上显示 DIV

标签: angular


【解决方案1】:

这在您调整浏览器窗口大小时有效

@HostListener("window:resize", [])
  onResize() {
    var width = window.innerWidth;
    this.mobile = width < 992;
  }

【讨论】:

  • 更新this.mobile =width &lt; 992;的if/else语句
【解决方案2】:

这是另一种继续寻找窗口变化的方法。

<div class="row">
<img class="mx-auto logo" src="">
</div>
@media screen and (max-width: 490px) {
  .logo{
    width: 30vh;
  }
}
@media screen and (min-width: 491px) {
  .logo{
    display: none;
  }
}

【讨论】:

    【解决方案3】:

    在 TS 文件中:

      isMobile() {
        const width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
        return width < 768;
      }
    

    在 HTML 模板中

    <button *ngIf="isMobile()">...</button>
    

    【讨论】:

      【解决方案4】:

      最少行数解决方案:

      在您的 TS 文件中:

      public isMobileLayout = false;
      ngOnInit() {
        window.onresize = () => this.isMobileLayout = window.innerWidth <= 991;
      }
      

      在 HTML 模板中:

      <div *ngIf="isMobileLayout">This is visible only on mobile</div>
      

      编辑: 此外,您可以使用以下代码检测移动设备:

      public get isMobileAgent() {
          const agent = navigator.userAgent || navigator.vendor || (window as any).opera;
          // tslint:disable-next-line:max-line-length
          return (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(agent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(agent.substr(0, 4)));
      }
      

      这可能有助于在发生任何调整大小之前初始化 isMobileLayout 值:

      public isMobileLayout = isMobileAgent;
      

      或者:

      <div *ngIf="isMobileLayout || isMobileAgent">This is visible only on mobile</div>
      

      【讨论】:

      • 不要忘记正确设置初始值。即,当它首次在移动设备上加载并且没有调整大小事件时,isMobile 仍然为 false,并且您将获得非移动布局。
      • @RyanD 是的,我已经在我的真实代码中这样做了,我会添加这部分来回答。
      【解决方案5】:

      刚刚遇到这个答案,我想要一些既能响应又能调整大小的东西。我将 992px 设置为断点,因为我也在同时使用 bootstrap lg 断点。

      export class TestComponent implements OnInit {
      
        constructor() { }
      
        isMobile = false;
        getIsMobile(): boolean {
          const w = document.documentElement.clientWidth;
          const breakpoint = 992;
          console.log(w);
          if (w < breakpoint) {
            return true;
          } else {
            return false;
          }
        }
      
        ngOnInit() {
          this.isMobile = this.getIsMobile();
          window.onresize = () => {
            this.isMobile = this.getIsMobile();
          };
        }
      }
      

      然后在 HTML 中

      &lt;div *ngIf="isMobile === true&gt;Some mobile element!&lt;/div&gt;

      【讨论】:

      • 谢谢里德。工作完美。当购物车在移动设备上打开时,我将您上面的确切代码与 routerLink 结合起来隐藏标题。
      • 我喜欢这个,我为return width &lt; breakpoint更新了getIsMobile方法中的if-else
      【解决方案6】:

      我想我会将这个添加到问题中,因为我在这种特殊情况下发现 @angular/flex-layout 非常有帮助。 https://github.com/angular/flex-layout.

      您可能特别对fxHide 功能感兴趣:https://github.com/angular/flex-layout/wiki/fxHide-API,但在我看来,这个包使使用响应式应用程序变得更加容易。

      您可以像这样显示或隐藏内容。

      在“小”或大于“中”分辨率时不显示

      &lt;div fxShow.sm="false" fxShow.gt-md="false" fxShow="true" &gt;&lt;/div&gt;

      仅在中等分辨率时隐藏

      &lt;div fxShow fxHide.md &gt;&lt;/div&gt;

      断点可以是自定义的,但它们已经设置了默认断点。

      【讨论】:

      • 这很好,值得注意的是,这不是 *ngIf 的等价物,而是 [hidden]。
      【解决方案7】:

      对于未来的我或其他人,如果您需要一个监控屏幕尺寸并使用 Observables/rxjs 的解决方案,那么这个解决方案可以工作:

      ngOnInit(): void {
        // Checks if screen size is less than 1024 pixels
        const checkScreenSize = () => document.body.offsetWidth < 1024;
      
        // Create observable from window resize event throttled so only fires every 500ms
        const screenSizeChanged$ = Observable.fromEvent(window, 'resize').throttleTime(500).map(checkScreenSize);
      
        // Start off with the initial value use the isScreenSmall$ | async in the
        // view to get both the original value and the new value after resize.
        this.isScreenSmall$ = screenSizeChanged$.pipe(startWith(checkScreenSize()))
      }
      

      【讨论】:

      • 去抖动可能更合适,不确定事件链完成后油门是否触发
      • 感谢您的回答。帮了我很多。 debounceTime 做得更好。在 angular7 中,代码发生了一些变化。现在是 const screenSizeChanged$ = fromEvent(window, 'resize').pipe(debounceTime(500)).pipe(map(checkScreenSize));
      • 您可以简单地使用逗号作为分隔符,而不是串联.pipe()fromEvent(window, 'resize').pipe(debounceTime(500), map(checkScreenSize));
      【解决方案8】:

      您可以使用 window.screen.width。 示例:

      ngOnInit() {
        if (window.screen.width === 360) { // 768px portrait
          this.mobile = true;
        }
      }
      

      HTML:

      <button *ngIf="mobile" (click)="showHide = !showMap"></button>
      

      【讨论】:

      • 太棒了!那就是我的意思!谢谢!
      • 根据您的用例,如果用户能够调整窗口大小,则当他们这样做时将不会响应。您需要添加一个调整大小侦听器并在每次调整大小时重新计算。
      • 这只是针对没有响应式浏览器的手机的解决方案。
      • 但它将我的内容隐藏在桌面大小宽度上。所以这个问题也必须解决!
      猜你喜欢
      相关资源
      最近更新 更多
      热门标签