Как написать медиа-запрос в файле typescript?

#javascript #css #angular #sass

#javascript #css #angular #sass

Вопрос:

Мне нужно изменить медиа-запрос в ts-файле, потому что моя переменная visible показывает видимую панель, если ширина <580 пикселей = true. Мне нужно решение, как узнать в файле ts, когда разрешение ниже 580 пикселей, чтобы установить для переменной значение true.

 TS.file

  showSideBar = false;

SCSS. file

.aside-bar {
   @media(max-width: 580px) {
     ....any value
  }
}
  

Ответ №1:

Вы можете использовать что-то подобное в обычном js. https://www.w3schools.com/howto/howto_js_media_queries.asp

Вы можете использовать .matches в примере, чтобы задать свое значение.

 function doCheck(query) {
  if (query.matches) { // If media query matches
    document.querySelector('.aside-bar').innerHTML = 'red'
  } else {
    document.querySelector('.aside-bar').innerHTML = 'blue'
  }
}

const query = window.matchMedia("(max-width: 400px)")
doCheck(query) // Call listener function at run time
query.addListener(doCheck) // Attach listener function on state changes  
 .aside-bar {
  width: 100px;
  height: 100px;
  color: white;
  background: blue;
}
  
@media(max-width: 400px) {
  .aside-bar {
    background: red;
  }
}  
 <div class="aside-bar">aside bar</div>  

Комментарии:

1. Это должен быть общепринятый ответ, потому что «matchmedia» — это функциональность, которая ближе всего подходит к ответу на вопрос. Следует также отметить, что он значительно более мощный, чем прослушиватель изменения размера. Спасибо!

2. Не следует принимать, потому что я уже это знаю, и я здесь для типа query

Ответ №2:

Я бы использовал угловые наблюдатели компоновки cdk для получения наблюдаемого

https://material.angular.io/cdk/layout/overview

 @Component({...})
class MyComponent {
  constructor(breakpointObserver: BreakpointObserver) {
    breakpointObserver.observe([
      Breakpoints.HandsetLandscape,
      Breakpoints.HandsetPortrait
    ]).subscribe(result => {
      if (result.matches) {
        this.activateHandsetLayout();
      }
    });
  }
}
  
 @Component({...})
class MyComponent {
  constructor(mediaMatcher: MediaMatcher) {
    const mediaQueryList = mediaMatcher.matchMedia('(min-width: 1px)');
  }
}
  

Комментарии:

1. Я уже использую библиотеку для material design, которая не является angular material, потому что я хочу без.material