炫酷的3DCSS卡片样式

news2024/11/5 14:09:10

先效果图展示:
在这里插入图片描述

再上代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *,
        *::after,
        *::before {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        html {
            font-size: 62.5%;
        }

        body {
            --background-color: hsl(180, 20%, 90%);

            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;

            min-height: 100vh;
            padding: 2rem;

            color: hsla(0, 0%, 0%, .6);
            background: var(--background-color);
            text-align: center;
        }

        h1 {
            font-size: 3.2rem;
            padding-top: 2rem;
        }

        h1+p {
            font-size: 1.8rem;
            padding: 2rem 0 3rem;
        }

        .main {
            display: flex;
            flex-wrap: wrap;
            justify-content: center;
            align-items: center;
        }

        .wrap {
            margin: 2rem;

            transform-style: preserve-3d;
            transform: perspective(100rem);

            cursor: pointer;
        }

        .container {
            --rX: 0;
            --rY: 0;
            --bX: 50%;
            --bY: 80%;

            width: 30rem;
            height: 36rem;
            border: 1px solid var(--background-color);
            border-radius: 1.6rem;
            padding: 4rem;

            display: flex;
            align-items: flex-end;

            position: relative;
            transform: rotateX(calc(var(--rX) * 1deg)) rotateY(calc(var(--rY) * 1deg));

            /*noinspection CssUnknownTarget*/
            background: linear-gradient(hsla(0, 0%, 100%, .1), hsla(0, 0%, 100%, .1)), url('https://images.unsplash.com/photo-1559113513-d5e09c78b9dd?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjF9') var(--bX) var(--bY);
            background-size: 40rem auto;
            box-shadow: 0 0 3rem .5rem hsla(0, 0%, 0%, .2);

            transition: transform .6s 1s;
        }

        .container::before,
        .container::after {
            content: "";

            width: 2rem;
            height: 2rem;
            border: 1px solid #fff;

            position: absolute;
            z-index: 2;

            opacity: .3;
            transition: .3s;
        }

        .container::before {
            top: 2rem;
            right: 2rem;

            border-bottom-width: 0;
            border-left-width: 0;
        }

        .container::after {
            bottom: 2rem;
            left: 2rem;

            border-top-width: 0;
            border-right-width: 0;
        }

        .container--active {
            transition: none;
        }

        .container--2 {
            filter: hue-rotate(80deg) saturate(140%);
        }

        .container--3 {
            filter: hue-rotate(160deg) saturate(140%);
        }

        .container p {
            color: hsla(0, 0%, 100%, .6);
            font-size: 2.2rem;
        }

        .wrap:hover .container::before,
        .wrap:hover .container::after {
            width: calc(100% - 4rem);
            height: calc(100% - 4rem);
        }

        .abs-site-link {
            position: fixed;
            bottom: 20px;
            left: 20px;
            color: hsla(0, 0%, 0%, .6);
            font-size: 1.6rem;
        }
    </style>
</head>
<body>
<h1>卡片列表</h1>
<p>鼠标移入查看不同效果.</p>

<section class="main">

    <div class="wrap wrap--1">
        <div class="container container--1">
            <p>标准</p>
        </div>
    </div>

    <div class="wrap wrap--2">
        <div class="container container--2">
            <p>反方向</p>
        </div>
    </div>

    <div class="wrap wrap--3">
        <div class="container container--3">
            <p>标准</p>
        </div>
    </div>
    
</section>

<a href="https://abubakersaeed.netlify.app/designs/d10-parallax-tilt-effect-cards" class="abs-site-link" rel="nofollow noreferrer" target="_blank">abs/designs/d10-parallax-tilt-effect-cards</a>
</body>
<script>

    function redirectTo(url) {
        window.location.href = url;
    }

    class parallaxTiltEffect {

        constructor({element, tiltEffect}) {

            this.element = element;
            this.container = this.element.querySelector(".container");
            this.size = [300, 360];
            [this.w, this.h] = this.size;

            this.tiltEffect = tiltEffect;

            this.mouseOnComponent = false;

            this.handleMouseMove = this.handleMouseMove.bind(this);
            this.handleMouseEnter = this.handleMouseEnter.bind(this);
            this.handleMouseLeave = this.handleMouseLeave.bind(this);
            this.defaultStates = this.defaultStates.bind(this);
            this.setProperty = this.setProperty.bind(this);
            this.init = this.init.bind(this);

            this.init();
        }

        handleMouseMove(event) {
            const {offsetX, offsetY} = event;

            let X;
            let Y;

            if (this.tiltEffect === "reverse") {
                X = ((offsetX - (this.w/2)) / 3) / 3;
                Y = (-(offsetY - (this.h/2)) / 3) / 3;
            }

            else if (this.tiltEffect === "normal") {
                X = (-(offsetX - (this.w/2)) / 3) / 3;
                Y = ((offsetY - (this.h/2)) / 3) / 3;
            }

            this.setProperty('--rY', X.toFixed(2));
            this.setProperty('--rX', Y.toFixed(2));

            this.setProperty('--bY', (80 - (X/4).toFixed(2)) + '%');
            this.setProperty('--bX', (50 - (Y/4).toFixed(2)) + '%');
        }

        handleMouseEnter() {
            this.mouseOnComponent = true;
            this.container.classList.add("container--active");
        }

        handleMouseLeave() {
            this.mouseOnComponent = false;
            this.defaultStates();
        }

        defaultStates() {
            this.container.classList.remove("container--active");
            this.setProperty('--rY', 0);
            this.setProperty('--rX', 0);
            this.setProperty('--bY', '80%');
            this.setProperty('--bX', '50%');
        }

        setProperty(p, v) {
            return this.container.style.setProperty(p, v);
        }

        init() {
            this.element.addEventListener('mousemove', this.handleMouseMove);
            this.element.addEventListener('mouseenter', this.handleMouseEnter);
            this.element.addEventListener('mouseleave', this.handleMouseLeave);
        }

    }

    const $ = e => document.querySelector(e);

    const wrap1 = new parallaxTiltEffect({
        element: $('.wrap--1'),
        tiltEffect: 'reverse'
    });

   //反转控制
    const wrap2 = new parallaxTiltEffect({
        element: $('.wrap--2'),
        tiltEffect: 'normal'
    });


    const wrap3 = new parallaxTiltEffect({
        element: $('.wrap--3'),
        tiltEffect: 'reverse'
    });
    
</script>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/437597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode】94.二叉树的中序遍历

1.问题 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;root […

Vue3中使用 EventBus 实现兄弟组件传参

前言&#xff1a;EventBus vue3中没有了&#xff0c;EventBus&#xff0c;所以我们要自己写&#xff0c;但是非常简单。 步骤一&#xff1a;创建&#xff08;EventBus 容器&#xff09; 在src目录&#xff0c;创建个bus文件夹&#xff0c;存放 自己建立的 bus.js class Bus…

Springboot 中快速完成文件上传,整合多平台神器

哈喽&#xff0c;大家好~ 又是做好人好事的一天&#xff0c;有个小可爱私下问我有没有好用的springboot文件上传工具&#xff0c;这不巧了嘛&#xff0c;正好我私藏了一个好东西&#xff0c;顺便给小伙伴们也分享一下&#xff0c;demo地址放在文末了。 文件上传在平常不过的一…

1.黑马Springboot基础篇笔记

Springboot基础篇 1.快速上手Springboot 1.基础配置 1.parent 作用&#xff1a;指定jar包版本信息信息&#xff0c;避免依赖版本冲突 2.starter 作用:SpringBoot中常见项目名称&#xff0c;定义了当前项目使用的所有依赖坐标&#xff0c;以达到减少依赖配置的目的使用任意…

扬帆优配|逼近历史最高点!刚刚,A股这一板块沸腾!

今天早盘&#xff0c;A股整体小幅走强&#xff0c;上证指数创阶段性新高&#xff0c;并逼近年内最高点&#xff0c;科创50指数则大涨超2%领涨两市。 盘面上&#xff0c;新能源车、黄金、锂矿、建筑等板块涨幅居前&#xff0c;互联网、传媒娱乐、知识产权、博彩概念等板块跌幅居…

开源项目创始人的营销建议:让开源项目脱颖而出

来自开源创始人的营销建议 面对现实吧&#xff0c;如果你想让你的开源项目变成主业&#xff0c;就得投入一定的精力对它进行营销。 这并不意味着几篇空洞的文章加上夺人眼球的标题&#xff0c;而是要向用户清晰地传达产品的功能&#xff0c;并帮助他们轻松发现产品的优势。 本文…

什么是数智化招采?如何实现数智化招采(系统)?

数智化&#xff0c;是当今信息技术领域的一个热门话题。它的应用范围非常广泛&#xff0c;包括商业、医疗、科学、政府、城市、企业、社会等各个领域。随着现代信息技术的不断发展&#xff0c;数智化已经成为各行各业中的一个重要趋势。 什么是数智化招采 信息化是数据形成的…

ChatGPT实战100例 - (06) 10倍速可视化组织架构与人员协作流程

文章目录 ChatGPT实战100例 - (06) 10倍速可视化组织架构与人员协作流程一、需求与思路二、 组织架构二、 人员协作四、 总结 ChatGPT实战100例 - (06) 10倍速可视化组织架构与人员协作流程 一、需求与思路 管理研发团队的过程中&#xff0c;组织架构与人员协作流程的可视化是…

《商用密码应用与安全性评估》第一章密码基础知识1.7密码功能实现示例

保密性实现 访问控制&#xff1a;防止敌手访问敏感信息 信息隐藏&#xff1a;避免敌手发现敏感信息 信息加密&#xff1a;允许观测&#xff0c;但无法提炼信息 几种分组密码工作模式的区别&#xff1a; 名称全称优点缺点ECB电子密码本模式简单、快速、并行不抗重放CBC密码分组…

计算机:理解操作系统:内存篇(上)

内存篇 1. 什么是内存2. C/C内存模型2.1 代码段和数据段2.2 堆和栈 本节是操作系统系列教程的第三篇文章&#xff0c;属于操作系统第一章即基础篇&#xff0c;在真正开始操作系统相关章节前在这一部分回顾一些重要的主题&#xff0c;算是温故知新吧&#xff0c;以下是目录&…

瑞吉外卖项目——瑞吉外卖

软件开发整体介绍 软件开发流程 需求分析&#xff1a;产品原型、需求规格说明书 设计&#xff1a;产品文档、UI界面设计、概要设计、详细设计、数据库设计 编码&#xff1a;项目代码、单元测试 测试&#xff1a;测试用例、测试报告 上线运维&#xff1a;软件环境安装、配置…

Qt编写推流综合应用示例(文件推流/桌面推流/本地摄像头/网络摄像头/转发推流/视频分发)

一、功能特点 1.1 文件推流 指定网卡和监听端口&#xff0c;接收网络请求推送音视频等各种文件。实时统计显示每个文件对应的访问数量、总访问数量、不同IP地址访问数量。可指定多种模式&#xff0c;0-直接播放、1-下载播放。实时打印显示各种收发请求和应答数据。每个文件对…

Vivado布线和生成bit参数设置

本文主要介绍Vivado布线参数设置&#xff0c;基本设置方式和vivado综合参数设置基本一致&#xff0c;将详细说明如何设置布线参数以优化FPGA设计的性能&#xff0c;以及如何设置Vivado压缩BIT文件。 一、Vivado布线概述 Vivado布线是在FPGA设计中实现物理布局的关键步骤之一。…

C语言-字符串

sizeof和strlen 的区别&#xff1a; 区别1&#xff1a; 1.sizeof计算整个数组大小&#xff0c; 2.strlen 计算有效的数组大小 新建字符数组”hello“ char cdata[128]"hello"; printf("sizeof--cdata的长度&#xff1a;%d\n",sizeof(cdata)); pri…

Hive窗口函数全解

在SQL中有一类函数叫做聚合函数&#xff0c;例如sum()、avg()、max()等等&#xff0c;这类函数可以将多行数据按照规则聚集为一行&#xff0c;一般来讲聚集后的行数是要少于聚集前的行数的。但是有时我们想要既显示聚集前的数据&#xff0c;又要显示聚集后的数据&#xff0c;这…

零基础抽象MYSQL

既然完成了下载安装和密码登录&#xff0c;那么打开你的MYSQL MYSQL中最简单的 创建数据库、查看数据库、选择数据库、删除数据库 先从重要的创建数据库 直接输入create database data_a ; 注意了要打分号 &#xff1b; 如果查看你创建的数据库 show databases &#xff…

使用 Flask 快速构建 基于langchain 和 chatGPT的 PDF摘要总结

简介 这里不对 langchain 和 chatGPT 进行介绍&#xff0c;仅对实现过程进行整理 环境 Python >3.8 Flask2.2.3 Jinja23.1.2 langchain0.0.143 openai0.27.4 实现 总结功能 使用 langchain 和 openai 接口实现总结功能 实现逻辑&#xff1a;通过text_splitter 将pdf 分…

LeetCode 501: 二叉搜索树中的众数 | C++语言版

LeetCode 501. 二叉搜索树中的众数 | C语言版 LeetCode 501. 二叉搜索树中的众数题目描述解题思路思路一&#xff1a;使用迭代代码实现运行结果参考文章&#xff1a; 思路二&#xff1a;减少遍历节点数代码实现运行结果参考文章&#xff1a; LeetCode 501. 二叉搜索树中的众数 …

Edius抠像过程(实践笔记)

最近的工作有点烦&#xff0c;一个月左右的时间全是在帮别人做视频的过程&#xff08;在我所在的行业里&#xff0c;就是打杂&#xff09; 因为自己不专业&#xff0c;所有的操作都是现学现用&#xff0c;前几个视频还好说&#xff0c;随便剪剪&#xff0c;就是看他们本人录的…

水务行业怎么运用智能配电

摘要&#xff1a;在构建智慧水务和“双碳”时代背景下&#xff0c;智能配电系统在水务行业中发挥日益突出的重要作用。本文首先回顾了智能配电系统在水务行业的发展历程&#xff0c;并对其应用现状进行了分析&#xff0c;进而展望了智能配电系统在水务行业的发展趋势。 关键词&…