DEV Community

abbazs
abbazs

Posted on

How to conditionally set the style of an HTML element using Alpine.js

Creating a Conditional Style with Alpine.js

In this tutorial, we will explore how to conditionally set the style of an HTML element using Alpine.js. Our goal is to create an interactive color-changing application where a container contains multiple buttons representing different colors. When a button is clicked, the background color of an <h1> element will dynamically update based on the selected color.

Step 1: Set up the HTML structure and Alpine.js

First, let's set up the basic HTML structure and include the Alpine.js library. Create a new HTML file and add the following code:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Alpine.js Example</title>
    <script src="https://cdn.jsdelivr.net/npm/alpinejs@2.8.2/dist/alpine.js"></script>
    <style>
      body {
        display: flex;
        justify-content: center;
        align-items: center;
      }
      .color-button {
        margin-right: 5px;
        margin-top: 5px;
      }
      .container {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        text-align: center;
        width: 600px;
        border: 1px solid lightgray;
        padding: 20px;
        transition: box-shadow 0.3s;
        box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
      }

      .container:hover {
        box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
      }
      .container-btn {
        display: flex;
        flex-direction: row;
        align-items: center;
        justify-content: center;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <!-- HTML code goes here -->
    </div>
  </body>
</html>
Enter fullscreen mode Exit fullscreen mode

Step 2: Define the data using x-data

Next, let's define the data using the x-data directive provided by Alpine.js. This directive allows us to create an instance of Alpine.js and define its data properties. Add the x-data attribute to the <div> element inside the container and initialize the color property as an empty string. Update the code as follows:

<div x-data="{ color: '' }" class="container">
  <!-- HTML code goes here -->
</div>
Enter fullscreen mode Exit fullscreen mode

Step 3: Bind the style using x-bind

To dynamically update the style of the <h1> element based on the selected color, we will use the x-bind directive. With x-bind, we can bind the value of an attribute to an expression. Add the x-bind directive to the <h1> element's style attribute and bind it to the color data property. Update the code as follows:

<h1 x-bind:style="'background-color: ' + color">HELLO WORLD</h1>
Enter fullscreen mode Exit fullscreen mode

Step 4: Handle button clicks using x-on

Now, let's handle the button clicks using the x-on directive provided by Alpine.js. This directive allows us to listen for events and execute expressions when those events occur. Add the x-on directive to each button and define the click event handler. Inside the event handler, update the color data property based on the selected color. Update the code as follows:

<div class="container-btn">
  <button x-on:click="color = 'red'" class="color-button">Red</button>
  <button x-on:click="color = 'white'" class="color-button">White</button>
  <button x-on:click="color = 'blue'" class="color-button">Blue</button>
  <button x-on:click="color = 'green'" class="color-button">Green</button>
  <button x-on:click="color = 'yellow'" class="color-button">Yellow</button>
</div>
Enter fullscreen mode Exit fullscreen mode

Step 5: Test the functionality

Now that you have completed the necessary steps, it's time to test the functionality of our color-changing application. Your finished html code shall look like this:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Alpine.js Example</title>
    <script src="https://cdn.jsdelivr.net/npm/alpinejs@2.8.2/dist/alpine.js"></script>
    <style>
      body {
        display: flex;
        justify-content: center;
        align-items: center;
      }
      .color-button {
        margin-right: 5px;
        margin-top: 5px;
      }
      .container {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        text-align: center;
        width: 600px;
        border: 1px solid lightgray;
        padding: 20px;
        transition: box-shadow 0.3s;
        box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
      }

      .container:hover {
        box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
      }
      .container-btn {
        display: flex;
        flex-direction: row;
        align-items: center;
        justify-content: center;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <div x-data="{ color: '' }" class="container">
      <h1 x-bind:style="'background-color: ' + color">HELLO WORLD</h1>
      <div class="container-btn">
        <button x-on:click="color = 'red'" class="color-button">Red</button>
        <button x-on:click="color = 'white'" class="color-button">White</button>
        <button x-on:click="color = 'blue'" class="color-button">Blue</button>
        <button x-on:click="color = 'green'" class="color-button">Green</button>
        <button x-on:click="color = 'yellow'" class="color-button">
          Yellow
        </button>
      </div>
    </div>
  </body>
</html>
Enter fullscreen mode Exit fullscreen mode

Open the HTML file in a web browser and click on the buttons. The background color of the <h1> element should dynamically update based on the selected color.

You have successfully learned how to use Alpine.js to create a conditional style in web application. Understanding the concepts of x-data, data properties, and the x-bind and x-on directives is crucial for building interactive applications with Alpine.js. Feel free to customize the code and experiment with different styles and interactions to enhance your projects.

Top comments (0)