How to solve the element movement caused by hover-generated border

How to solve the element movement caused by hover-generated border

Preface

Sometimes when hover pseudo-class adds a border to an element, the content in the element shifts. Although we set box-sizing: border-box and specify the width and height of the element, the content is still squeezed by the border. For example, in the following situation:

<style type="text/css" media="screen">
    .test {
        height: 30vmin;
        width: 30vmin;
        background: lightblue;
        box-sizing: border-box;
    }
    .test:hover {
        border: 5px solid black;
    }
</style>
<div class="test">
    this is a div.
</div> 

The reason here is obvious. The size of our element has not changed (if the element width and height are not set or box-sizing: border-box is used, the element size will change). box-sizing: border-box is effective, but the content in the element has been squeezed out because of the suddenly added border. Our box model is margin , border , padding , and content from outside to inside, so the newly added border will inevitably compress content smaller, and the boundary coordinates of content will also change, which will cause the visual content to move. So the solution to the problem is to make sure that the addition of the border does not affect the position of content .

Adding a border to an element

The sudden appearance of the border changes the original layout and moves the content. In this case, we can just let the border exist in the previous layout.

.test {
    height: 30vmin;
    width: 30vmin;
    background: lightblue;
    border: 5px solid transparent;
    box-sizing: border-box;
}
.test:hover {
    border: 5px solid black;
}

Using box-shadow

Using box-shadow or outline that does not take up box model space is also an option.

.test:hover {
    /* border: 5px solid black; */
    box-shadow: 0 0 0 5px black;
    outline: 5px solid black;
}

Use padding

We can reserve space for border by changing padding size.

.test {
    height: 30vmin;
    width: 30vmin;
    background: lightblue;
    box-sizing: border-box;
    padding: 5px;
}
.test:hover {
    padding: 0;
    border: 5px solid black;
}

The above is the full content of this article. I hope it will be helpful for everyone’s study. I also hope that everyone will support 123WORDPRESS.COM.

<<:  Teach you to implement a simple promise step by step

>>:  Detailed tutorial on integrating Apache Tomcat with IDEA editor

Recommend

Detailed explanation of asynchronous iterators in nodejs

Table of contents Preface What are asynchronous i...

Why are the pictures on mobile web apps not clear and very blurry?

Why? The simplest way to put it is that pixels are...

Eight rules for effective web forms

If you're collecting information from your us...

Can asynchrony in JavaScript save await?

I knew before that to synchronously obtain the re...

Implementation process of row_number in MySQL

1. Background Generally, in a data warehouse envi...

React implementation example using Amap (react-amap)

The PC version of React was refactored to use Ama...

jQuery clicks on the love effect

This article shares the specific code of jQuery&#...

How to change the root user's password in MySQL

Method 1: Use the SET PASSWORD command mysql> ...

Docker image optimization (from 1.16GB to 22.4MB)

Table of contents The first step of optimization:...

Use PS to create an xhtml+css website homepage in two minutes

There are too many articles about xhtml+css websi...

Solution to the conflict between nginx and backend port

question: When developing the Alice management sy...