JS+CSS3实现超炫的散列画廊特效

yizhihongxing

让我来为您详细讲解一下“JS+CSS3实现超炫的散列画廊特效”的完整攻略。

一、项目背景

散列画廊特效是一种非常流行的网页动效,可以增强用户对网站内容的关注度,提升用户体验。

二、实现思路

该特效的实现主要分为三个部分:

  1. 利用CSS3的transform属性对图片进行平移和旋转;
  2. 利用JavaScript实现图片的散列排列和鼠标悬浮时的效果变化;
  3. 利用CSS3的transition属性实现平滑的过渡效果。

三、示例说明

示例1

下面为一个简单的案例展示:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>散列画廊特效示例</title>
    <style>
        /* 基本样式 */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        body {
            background-color: #252525;
        }
        .container {
            width: 1000px;
            margin: 50px auto;
            display: flex;
            flex-wrap: wrap;
        }
        .box {
            width: 200px;
            height: 200px;
            overflow: hidden;
            transition: transform 0.5s, box-shadow 0.5s;
        }
        .box img {
            width: 100%;
            height: 100%;
            object-fit: cover;
            transform: scale(1);
            transition: transform 0.5s;
        }
        .box:hover {
            transform: scale(1.1);
            box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3);
        }

        /* JS实现散列排列 */
        .box.short {
            height: 100px;
        }
        .box.landscape {
            width: 400px;
        }
        .box.portrait {
            width: 100px;
        }
        .box.tall {
            height: 400px;
        }
        .container.js {
            align-items: flex-start;
        }
        .container.js .box {
            position: absolute;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="box short"><img src="https://picsum.photos/id/1/400/300" alt=""></div>
        <div class="box landscape"><img src="https://picsum.photos/id/2/400/300" alt=""></div>
        <div class="box"><img src="https://picsum.photos/id/3/400/400" alt=""></div>
        <div class="box short"><img src="https://picsum.photos/id/4/400/300" alt=""></div>
        <div class="box tall"><img src="https://picsum.photos/id/5/300/400" alt=""></div>
        <div class="box portrait"><img src="https://picsum.photos/id/6/300/400" alt=""></div>
        <div class="box landscape"><img src="https://picsum.photos/id/7/400/300" alt=""></div>
        <div class="box"><img src="https://picsum.photos/id/8/400/400" alt=""></div>
        <div class="box short"><img src="https://picsum.photos/id/9/400/300" alt=""></div>
    </div>

    <script>
        var container = document.querySelector('.container.js');
        var boxes = container.querySelectorAll('.box');

        // 重新排序盒子
        function reArrange() {

            // 获取盒子的宽度和高度
            var width = boxes[0].offsetWidth;
            var height = boxes[0].offsetHeight;

            // 获取窗口的宽度和高度
            var windowWidth = document.documentElement.clientWidth;
            var windowHeight = document.documentElement.clientHeight;

            // 计算需要多少列
            var cols = Math.floor(windowWidth / width);

            // 列的位置存储在数组中
            var colY = [];
            for (var i = 0; i < cols; i++) {
                colY[i] = 0;
            }

            // 遍历所有盒子
            boxes.forEach(function(box) {

                // 获取盒子的新位置
                var newTop = Math.min.apply(null, colY);
                var newLeft = colY.indexOf(newTop) * width;

                // 更新盒子的位置
                box.style.top = newTop + 'px';
                box.style.left = newLeft + 'px';

                // 保存列的高度
                colY[colY.indexOf(newTop)] += height + 10;
            })
        }

        // 页面加载完成和窗口大小发生变化时重新排序盒子
        window.onload = reArrange;
        window.onresize = reArrange;
    </script>
</body>
</html>

通过创建一个容器和一些盒子来模拟散列排列的画廊效果,可以看到每个盒子通过 CSS3 的“transform”属性实现了平移和旋转之后,在鼠标悬浮时也产生了效果变化。并且通过 JavaScript 在窗口加载完成和窗口大小发生变化时重新排序盒子,实现的效果更加精细。

示例2

下面我们来看一下更加炫酷的一个案例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>散列画廊特效示例</title>
    <style>
        /* 基本样式 */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        body {
            background-color: #f5f5f5;
        }
        .container {
            width: 80%;
            margin: 50px auto;
            perspective: 1000px;
        }
        .box-wrapper {
            position: relative;
            display: flex;
            flex-wrap: wrap;
            transform-style: preserve-3d;
            transition: transform 0.5s;
        }
        .box {
            width: 200px;
            height: 200px;
            margin: 10px;
            background-color: #fff;
            border-radius: 10px;
            box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
            transition: transform 0.5s;
            text-align: center;
        }
        .box img {
            width: 100%;
            height: 100%;
            transform: translateZ(100px);
            backface-visibility: hidden;
        }
        .box-front {
            position: relative;
            transform: translateZ(-1px);
        }
        .box-back {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            transform: translateZ(-100px) rotateY(180deg);
        }
        .box-wrapper.hover .box {
            transform: rotateY(180deg);
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="box-wrapper">
            <div class="box">
                <div class="box-front"><img src="https://picsum.photos/id/1/400/300" alt=""></div>
                <div class="box-back">BACK</div>
            </div>
            <div class="box">
                <div class="box-front"><img src="https://picsum.photos/id/2/400/300" alt=""></div>
                <div class="box-back">BACK</div>
            </div>
            <div class="box">
                <div class="box-front"><img src="https://picsum.photos/id/3/400/300" alt=""></div>
                <div class="box-back">BACK</div>
            </div>
            <div class="box">
                <div class="box-front"><img src="https://picsum.photos/id/4/400/300" alt=""></div>
                <div class="box-back">BACK</div>
            </div>
            <div class="box">
                <div class="box-front"><img src="https://picsum.photos/id/5/400/300" alt=""></div>
                <div class="box-back">BACK</div>
            </div>
            <div class="box">
                <div class="box-front"><img src="https://picsum.photos/id/6/400/300" alt=""></div>
                <div class="box-back">BACK</div>
            </div>
            <div class="box">
                <div class="box-front"><img src="https://picsum.photos/id/7/400/300" alt=""></div>
                <div class="box-back">BACK</div>
            </div>
            <div class="box">
                <div class="box-front"><img src="https://picsum.photos/id/8/400/300" alt=""></div>
                <div class="box-back">BACK</div>
            </div>
            <div class="box">
                <div class="box-front"><img src="https://picsum.photos/id/9/400/300" alt=""></div>
                <div class="box-back">BACK</div>
            </div>
        </div>
    </div>

    <script>
        var boxWrapper = document.querySelector('.box-wrapper');
        boxWrapper.addEventListener('mouseover', function() {
            this.classList.add('hover');
        });
        boxWrapper.addEventListener('mouseout', function() {
            this.classList.remove('hover');
        });
    </script>
</body>
</html>

通过创建一个容器和多个盒子来模拟一个 3D 效果的散列画廊,可以看到每个盒子都可以通过鼠标悬停时翻转显示正反两面。并且通过 CSS3 的 transition 属性和 JavaScript 中监听事件来实现动效的过渡效果。

通过以上两个示例,相信您已经对“JS+CSS3实现超炫的散列画廊特效”的产生有了更加详细的了解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS+CSS3实现超炫的散列画廊特效 - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • CSS3与动画有关的属性transition、animation、transform对比(史上最全版)

    CSS3与动画有关的属性transition、animation、transform对比(史上最全版) 1. transition属性 transition属性是CSS3新特性,用于设定样式过渡效果,在原样式和新样式之间添加过渡动画。它需要指定过渡的属性、过渡的时间以及过渡的方式。过渡的属性可以是任意一个CSS属性,过渡时间可以是秒或毫秒,过渡方式可以是线性…

    css 2023年6月9日
    00
  • CSS Grid 网格布局全解析

    CSS Grid 网格布局全解析 CSS Grid 网格布局是现代 CSS 布局中的一种全新方式。它可以轻松地分割页面为行和列,并使其直接的子元素占据这些区域中的任何数量。 基础概念 在使用 CSS Grid 之前,我们需要先了解一些基础概念。 网格容器(Grid Container) 网格容器是一个包含网格项(Grid Item)的容器。通过将 displ…

    css 2023年6月9日
    00
  • CSS实例教程:制作网页特殊产品列表

    以下是关于“CSS实例教程:制作网页特殊产品列表”的完整攻略。 步骤一:HTML 结构 首先,需要在 HTML 文件中定义一个列表,每个列表项包含一个图片和一些描述信息。以下是一个示例: <ul class="product-list"> <li> <img src="product1.jpg&qu…

    css 2023年5月18日
    00
  • css隐藏移动端滚动条并且ios上平滑滚动的方法

    当开发移动端应用时,我们经常需要在页面上隐藏滚动条,并且保证在iOS设备上的平滑滚动体验。下面是一些实现这一目标的方法: 方法1:使用CSS样式隐藏滚动条 通过修改CSS样式,我们可以很容易地隐藏滚动条。下面是如何实现这一点: /* Hide scrollbar for Chrome, Safari and Opera */ .example::-webki…

    css 2023年6月10日
    00
  • css之display属性之inline-block布局实现详解

    CSS之display属性之inline-block布局实现详解 在网页布局的过程中,有时候我们需要把元素放在一行中并且保持元素间的间距,而且元素的大小不确定,这个时候使用inline-block布局可以很好的解决这个问题。 1. inline-block的基本概念 inline-block是指内联块级元素,这个属性可以让元素以块级元素的方式显示,同时保持元…

    css 2023年6月9日
    00
  • 如何解决前端笔记本屏幕显示缩放比例125%,150%对页面布局的影响

    解决前端笔记本屏幕显示缩放比例125%、150%对页面布局的影响,可以采用如下方法: 方法一:使用Viewport适配 Viewport是移动端常用的适配方案,可以将网页按照设备的物理像素来渲染。使用Viewport适配,可以避免屏幕缩放对页面布局的影响。 在页面头部引入以下代码: <meta name="viewport" con…

    css 2023年6月10日
    00
  • rem布局原理解析

    Rem布局原理解析 在移动端页面开发中,由于设备尺寸的不同,为了适配不同分辨率的设备,我们需要用到不同的布局方法。其中,rem布局是一种比较实用的布局方案。通过本文,我们可以了解到什么是rem布局,以及如何使用rem布局。 什么是rem布局? rem,全称为“root em”,它是相对于根元素的font-size大小来进行设置元素尺寸的单位。rem布局的原理…

    css 2023年6月10日
    00
  • 使用Vue制作图片轮播组件思路详解

    这里我可以给出使用Vue制作图片轮播组件的详细攻略: 思路概述 实现图片轮播组件的主要思路如下: 确定组件的基本结构和样式 定义轮播动画效果和过渡方式 通过Vue组件化思想,定义图片轮播组件 将组件引入主页面并使用 组件结构和样式设计 在组件设计中,我们可以定义一个父容器元素,内部包含图片、左右箭头和指示器。具体结构和样式可以参考以下代码: <temp…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部