DEV Community

Pavel Kříž
Pavel Kříž

Posted on

2

VueJS + CSS: grid template based on variable

This is my 10th write up on dev.to site. Example of CSS grid based on variable. Full source code is included as a flems.io link.

CSS grid

CSS grid is one of technics for UI definition (you may know CSS Flexbox too).

Using CSS grid one can define visual template for content displayed on web page.

As frontend developers we can use "static template" with no changes. Sometimes, there is a good practice to change layout based on condition defined with Media Queries.

Did you know we can change our template via variable's value? Let's do this.

CSS grid layout example

Assume we need place four buttons inside div and want change their positions.

HTML code:

<div class="grid-area "> 
  <button class="btn-1 bg-blue" > A </button>
  <button class="btn-2 bg-blue" > B </button>
  <button class="btn-3 bg-blue" > C </button>
  <button class="btn-4 bg-blue" > D </button>
</div>
Enter fullscreen mode Exit fullscreen mode

CSS code:

.grid-area {
  display: grid;
  gap: 1rem;
}
Enter fullscreen mode Exit fullscreen mode

This example shows fixed layout, there is nothing we can change. Let's do the magic.

Since we use VueJS, define variable holding class name we add to the div (grid countainer) and some CSS classes with different layout for our four buttons.

...
  data: function(){
    return {
      template: "",
    }
  },
...
Enter fullscreen mode Exit fullscreen mode

Example definitions of different CSS grid templates:

.grid-area-4 {
  grid-template-areas:  "area1 area2 area3 area4"                 
}

.grid-area-2-2 {
  grid-template-areas:  "area1 area2"
                        "area3 area4"
}

.grid-area-1-2-1 {
  grid-template-areas:  "area1 area1"
                        "area2 area3"
                        "area4 area4"
}

.grid-area-2-1-1 {
  grid-template-areas:  "area1 area2"
                        "area3 area3"
                        "area4 area4"
}

.grid-area-1-1-2 {
  grid-template-areas:  "area1 area1"
                        "area2 area2"
                        "area3 area4"
}
Enter fullscreen mode Exit fullscreen mode

Each button has its own class .btn-1, .btn-2 etc.

.btn-1 {
  grid-area: area1;
}

.btn-2 {
  grid-area: area2;
}

.btn-3 {
  grid-area: area3;
}

.btn-4 {
  grid-area: area4;
}
Enter fullscreen mode Exit fullscreen mode

A small change of HTML code is enough to do the magic:

<div class="grid-area " :class="template"> 
  <button class="btn-1 bg-blue" > A </button>
  <button class="btn-2 bg-blue" > B </button>
  <button class="btn-3 bg-blue" > C </button>
  <button class="btn-4 bg-blue" > D </button>
</div>
Enter fullscreen mode Exit fullscreen mode

Using VueJS variable template we can define dynamic class and apply it to the div (grid container).

I suppose my explanation is clear, here you can see full source code and playground on flems.io

Hope this help you :-)

Sentry blog image

How I fixed 20 seconds of lag for every user in just 20 minutes.

Our AI agent was running 10-20 seconds slower than it should, impacting both our own developers and our early adopters. See how I used Sentry Profiling to fix it in record time.

Read more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay