CSS3 diamond puzzle realizes the function of rotating only div and not rotating the background image

CSS3 diamond puzzle realizes the function of rotating only div and not rotating the background image

Demand background

The project is made using Vue, and the business requirement has a puzzle effect. The default background image is dark, and it is divided into five areas. One area will be lit each time, and the whole image will be lit, and the puzzle is completed. Let’s take a look at the final rendering first.

CSS3 diamond puzzle to rotate only the div and not the background image

Applied knowledge points:

  • background-size
  • background-position
  • transform:rotate

Implementation ideas:

The outer large box is used to hold the dark background image. The five puzzle pieces inside are five divs. Each puzzle piece uses背景定位的方式to display a fixed area of ​​the background image. The puzzle piece in the middle is rotated. But after the rotation, another problem occurred: the background image also rotated, like this:

CSS3 diamond puzzle to rotate only the div and not the background image

The idea to solve the background rotation problem is: you can put a box on the outer layer of the 5th puzzle piece, rotate the outer box 45 degrees to the right, and then rotate the background elements 45 degrees to the left. After the operation, I found a new problem. The black border in the picture below is the outer box (for ease of viewing, the other puzzle pieces are set to invisible). If overflow:hidden is set for the outer box, the top, bottom, left, and right corners of the middle puzzle will be missing.

We need to make the width and height of the fifth puzzle piece larger, and then set its outer box overflow:hidden . If the width and height are set large, the corresponding background-size must also be changed.

CSS3 diamond puzzle to rotate only the div and not the background image

Finally, you can achieve the effect you just started with. The complete Vue code is as follows:

<template>
    <section class="box">
        <div class="bg" :style="{ backgroundImage: `url(${bgImg}) ` }"></div>
        <div v-if="item1Show" class="item item1" :style="{ backgroundImage: `url(${bgImg}) ` }"></div>
        <div v-if="item2Show" class="item item2" :style="{ backgroundImage: `url(${bgImg}) ` }"></div>
        <div v-if="item3Show" class="item item3" :style="{ backgroundImage: `url(${bgImg}) ` }"></div>
        <div v-if="item4Show" class="item item4" :style="{ backgroundImage: `url(${bgImg}) ` }"></div>
        <div v-if="item5Show" class="item item5wrap">
            <div class="item5" :style="{ backgroundImage: `url(${bgImg}) ` }"></div>
        </div>
    </section>
</template>
<script>
import bgImg from "@/assets/bg.jpeg";
export default {
    data() {
        return {
            bgImg,
            item1Show: false,
            item2Show: true,
            item3Show: true,
            item4Show: true,
            item5Show: true
        };
    }
};
</script>
<style lang="less">
@borderColor: #333;
.box {
    margin: 0px auto;
    width: 300px;
    height: 200px;
    background-color: #000;
    position: relative;
    .bg {
        width: 100%;
        height: 100%;
        position: absolute;
        left: 0;
        top: 0;
        background-position: center center;
        background-repeat: no-repeat;
        background-size: 100% 100%;
        opacity: 0.5;
    }
    .item {
        width: 50%;
        height: 50%;
        box-sizing: border-box;
        background-size: 200% 200%;
        border-right: 1px solid @borderColor;
        border-bottom: 1px solid @borderColor;
        position: absolute;
    }
    .item1 {
        background-position: 0 0;
        left: 0;
        top: 0;
    }
    .item2 {
        background-position: 100% 0;
        left: 50%;
        top: 0;
    }
    .item3 {
        background-position: 0 100%;
        left: 0;
        top: 50%;
    }
    .item4 {
        background-position: 100% 100%;
        left: 50%;
        top: 50%;
    }
    .item5wrap {
        width: 100px;
        height: 100px;
        border-left: 1px solid @borderColor;
        border-top: 1px solid @borderColor;
        transform: rotate(45deg);
        left: 50%;
        top: 50%;            
        transform: translate(-50%, -50%) rotate(45deg);
        overflow: hidden;
        .item5 {
            width: 150px;
            height: 150px;
            background-position: 50% 50%;
            background-size: 200% 133%;
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%) rotate(-45deg);
        }
    }
}
</style>

This is the end of this article about how to use CSS3 diamond puzzle to rotate only the div background image without rotating it. For more relevant CSS3 rotating image content, please search 123WORDPRESS.COM's previous articles or continue to browse the related articles below. I hope you will support 123WORDPRESS.COM in the future!

<<:  How to use iframe to apply the data of other web pages while maintaining compatibility

>>:  How to implement communication between Docker containers

Recommend

The magic of tr command in counting the frequency of English words

We are all familiar with the tr command, which ca...

How to install Solr 8.6.2 in Docker and configure the Chinese word segmenter

1. Environment version Docker version 19.03.12 ce...

A brief discussion on Python's function knowledge

Table of contents Two major categories of functio...

Sample code for a simple seamless scrolling carousel implemented with native Js

There are many loopholes in the simple seamless s...

Detailed explanation of CentOS configuration of Nginx official Yum source

I have been using the CentOS purchased by Alibaba...

js to achieve the effect of dragging the slider

This article shares the specific code of how to d...

Common solutions for Mysql read-write separation expiration

The pitfalls of MySQL read-write separation The m...

Tutorial on how to use profile in MySQL

What is a profile? We can use it when we want to ...

React event mechanism source code analysis

Table of contents Principle Source code analysis ...

JS implements user registration interface function

This article example shares the specific code of ...

JavaScript to achieve a simple countdown effect

This article example shares the specific code of ...

Vue implements start time and end time range query

This article shares with you how to query the sta...

Vue realizes the palace grid rotation lottery

Vue implements the palace grid rotation lottery (...