0

I'm making a weather widget with Angular. I want different background colors for the day and the night. I'm using OpenWeather apis for fetching the data. OpenWeather has a method .isDay that returns true if it's day time and false for the night. I want to use this method to change the background color.

weather-widget-main.component.ts

  .....
  ...
  setWeatherData(data) {
    this.WeatherData = data;
    let sunsetTime = new Date(this.WeatherData.sys.sunset * 1000);
    this.WeatherData.sunset_time = sunsetTime.toLocaleTimeString();
    let currentDate = new Date();
    this.WeatherData.isDay = (currentDate.getTime() < sunsetTime.getTime());
    this.WeatherData.temp_celcius = (this.WeatherData.main.temp - 273.15).toFixed(0);
    this.WeatherData.temp_min = (this.WeatherData.main.temp_min - 273.15).toFixed(0);
    this.WeatherData.temp_max = (this.WeatherData.main.temp_max - 273.15).toFixed(0);
    this.WeatherData.temp_feels_like = (this.WeatherData.main.feels_like - 273.15).toFixed(0);
  }
  .....
  ...

weather-widget-main.component.html

<div id="divWeatherMain">
  <div *ngIf="WeatherData.isDay" class="weatherWidgetRow">
    <i class="fas fa-3x fa-sun sun"></i>
  </div>
  <div *ngIf="!WeatherData.isDay" class="weatherWidgetRow">
    <i class="fas fa-3x fa-moon moon"></i>
  </div>
  <div class="weatherWidgetRow cloudDiv">
    <i class="fas fa-3x fa-cloud cloud"></i>
  </div>

  <div class="weatherWidgetRow" style="font-size:32px; margin-top:5px;">
    {{WeatherData.temp_celcius}}°C
  </div>
  <div class="weatherWidgetRow" style="font-size:12px;">
    {{WeatherData.temp_min}}°C / {{WeatherData.temp_max}}°C
  </div>
  <div class="weatherWidgetRow" style="font-size:12px;">
    Feels Like: {{WeatherData.temp_feels_like}}°C
  </div>
  <div class="weatherWidgetRow" style="font-size:25px; margin-top:10px">
    {{WeatherData.name}}
  </div>
  <div class="weatherWidgetRow" style="font-size:12px;">
    Humidity: {{WeatherData.main.humidity}}%
  </div>
</div>

weather-widget-main.component.css

.....
...
#divWeatherMain {
  display: block;
  border-radius: 10px;
  width: 200px;
  height: 220px;
  background: rgb(0,0,0);
  background: linear-gradient(100deg, rgba(0,0,0,1) 0%, rgba(8,7,42,1) 100%);
  color: White;
  font-family: 'Segoe UI', Tamoha, Geneva, Verdana, sans-serif;
}
.....
...
2

4 Answers 4

1

You can use ngClass to achieve this

Example:

 <div class="weatherWidgetRow" [ngClass]="{'class1': WeatherData.isDay === ture, 'class2': WeatherData.isDay === false}">
    <i same for here you can use ng class to change the icon></i>
  </div>
Sign up to request clarification or add additional context in comments.

Comments

0
<div class="weatherWidgetRow">
    <i [ngClass]="WeatherData.isDay ? fas fa-3x fa-sun sun : fas fa-3x fa-moon moon"></i>
</div>

Comments

0

You have to use ngClass, there are different ways to do it depending on your usage.

Check:

https://angular.io/api/common/NgClass

Comments

0

You can use

<div id="divWeatherMain">
<div class="weatherWidgetRow" [ngClass]=”WeatherData.isDay? day-bg-color: night-bg-color”> 
<i class="fas fa-3x" [ngClass]=”WeatherData.isDay?  fa-sun sun : fa-moon moon”></i> 
</div>
    
...
</div>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.