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

CSS3+Bezier curve to achieve scalable input search box effect

Without further ado, here are the renderings. The...

21 MySQL standardization and optimization best practices!

Preface Every good habit is a treasure. This arti...

Detailed explanation of Javascript closures and applications

Table of contents Preface 1. What is a closure? 1...

Develop calculator example code using native javascript

The main function of a calculator is to perform n...

mysql 5.7.18 winx64 password change

After MySQL 5.7.18 is successfully installed, sin...

JavaScript to achieve lottery effect

This article shares the specific code of JavaScri...

Detailed explanation of the concept, principle and usage of MySQL triggers

This article uses examples to explain the concept...

win10 docker-toolsbox tutorial on building a php development environment

Download image docker pull mysql:5.7 docker pull ...

MySQL 5.7.17 installation graphic tutorial (windows)

I recently started learning database, and I feel ...

Teach you how to build a react+antd project from scratch

The previous articles were all my own learning lo...

innodb_flush_method value method (example explanation)

Several typical values ​​of innodb_flush_method f...

Mysql varchar type sum example operation

Some friends, when learning about databases, acci...