首页 前端知识 3D旋转立方体爆炸展开动画特效纯CSS3源码

3D旋转立方体爆炸展开动画特效纯CSS3源码

2024-09-01 00:09:48 前端知识 前端哥 689 850 我要收藏

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本资源展示了如何仅用CSS3技术创建一个炫酷的3D旋转立方体动画特效,此特效适用于动态网页设计,提供强烈的视觉冲击。该特效实现涵盖了CSS3 3D变换、立方体结构、3D转换矩阵、 perspective 属性、动画与过渡、HTML和CSS结构设计以及兼容性与性能优化等方面。特效可用于网页加载指示器、交互式按钮等多种场景,强调了对Web交互效果创新的重要性。

1. CSS3 3D变换技术

在网页设计中,CSS3的3D变换技术赋予了我们无穷的可能性,使设计师和开发者能够在二维的平面上展示出三维的空间效果。CSS3的3D变换功能,如 rotateX , rotateY , rotateZ , translateZ 等,这些变换函数允许我们对元素进行深度上的变换,从而模拟出立体效果。

在CSS3中, transform 属性是实现3D变换的关键,而3D变换通常涉及到 perspective 属性来定义观看3D效果的距离,这为3D空间中元素的透视感提供了基础。了解每个变换函数如何独立工作以及它们如何协同作用,对于创建令人信服的3D效果至关重要。

接下来,我们将逐步探讨这些变换函数的工作原理及其组合使用方法,揭示它们在创建复杂的3D动画和视觉效果中的作用。通过实践操作,读者将掌握如何应用这些函数来设计和实现各种3D效果,开启网页设计的新维度。

2. 立方体结构实现

2.1 CSS中的3D立方体结构基础

2.1.1 HTML结构的设计原则

在创建一个3D立方体之前,首先需要建立一个合适的HTML结构。HTML结构应遵循简洁、语义化的原则,便于后续通过CSS进行样式应用和扩展。立方体通常由六个面组成,因此,HTML代码将包括六个 <div> 元素,每个代表立方体的一个面。

<div class="cube">
    <div class="face front"></div>
    <div class="face back"></div>
    <div class="face right"></div>
    <div class="face left"></div>
    <div class="face top"></div>
    <div class="face bottom"></div>
</div>

上述代码中, .cube 是外层容器,用于限定立方体的边界。六个子 <div> 代表立方体的六个面,我们可以根据需要来给它们添加不同的类名,以便于后续通过CSS进行选择和样式定义。

2.1.2 利用CSS样式构建立方体

在HTML结构搭建完成后,我们将通过CSS定义来实现立方体的三维效果。首先,要给每个面定义基本的样式,包括大小、位置、背景颜色等。然后,使用CSS的3D变换属性来将这些平面定位到立方体的六个面上。

.cube {
  position: relative;
  width: 200px;
  transform-style: preserve-3d;
  animation: rotate 5s infinite linear;
}

.face {
  position: absolute;
  width: 200px;
  height: 200px;
  background: rgba(255, 255, 255, 0.8);
  border: 1px solid #ccc;
}

.front  { transform: translateZ(100px); }
.back   { transform: rotateY(180deg) translateZ(100px); }
.right  { transform: rotateY(90deg) translateZ(100px); }
.left   { transform: rotateY(-90deg) translateZ(100px); }
.top    { transform: rotateX(90deg) translateZ(100px); }
.bottom { transform: rotateX(-90deg) translateZ(100px); }

在这段CSS中, .cube 类定义了一个相对定位的容器,并开启了3D变换效果。通过 animation 属性添加了一个简单的无限循环旋转动画。 .face 类定义了立方体面的基本样式。六个面根据其在立方体中的位置使用不同的3D变换属性定位。这使得每个面都呈现在立方体的六个面上。

2.2 立方体各面的定义与展示

2.2.1 为立方体各面添加背景和边框

为了更好地展现立方体结构,我们可以为每个立方体面添加不同的背景颜色或图片,并添加边框以便于区分。这样,当我们在浏览器中查看时,可以明显看到每个面的位置和方向。

/* 为立方体各面添加背景颜色 */
.front  { background: rgba(255, 0, 0, 0.7); }
.back   { background: rgba(0, 255, 0, 0.7); }
.right  { background: rgba(0, 0, 255, 0.7); }
.left   { background: rgba(255, 255, 0, 0.7); }
.top    { background: rgba(0, 255, 255, 0.7); }
.bottom { background: rgba(255, 0, 255, 0.7); }

/* 添加边框 */
.face {
    border: 2px solid #000;
    /* 添加其他样式属性如阴影、过渡效果等 */
}

通过以上代码,每个立方体面都有了独特的背景色,而且每面都有一条边框,这样不仅使立方体看起来更加生动,还提高了用户对立方体空间位置的感知。

2.2.2 通过伪元素扩展立方体面的数量

虽然我们已经为立方体定义了六个面,但在实际应用中,根据设计需求,可能需要更多的面或者复杂的效果。CSS中的伪元素可以帮助我们扩展立方体面的数量。

.cube::before {
    content: '';
    position: absolute;
    width: 200px;
    height: 200px;
    background: rgba(255, 255, 255, 0.5);
    transform: rotateY(90deg) translateZ(100px);
}

在上述CSS代码中,我们通过 .cube::before 为立方体创建了一个额外的面。使用伪元素时, content 属性是必须的,尽管我们不需要内容,但仍需设置为一个空字符串。此伪元素被定位到立方体的一个侧面,从而扩展了立方体的外观。

通过伪元素,我们还可以实现一些更复杂的视觉效果,比如在立方体的中心添加一个透明的商标logo,或者在其一面添加渐变效果等。伪元素是增强3D效果的有力工具之一。

graph TD;
    A[HTML结构] -->|定义容器和面| B[立方体基本结构];
    B --> C[应用CSS样式];
    C -->|定位各面| D[立方体面的位置变换];
    D --> E[添加背景和边框];
    E --> F[使用伪元素扩展立方体];
    F --> G[立方体最终展示效果];

在上述流程中,我们展示了从HTML结构到最终立方体3D效果实现的步骤。通过细致地构建HTML结构、合理应用CSS样式以及创新使用伪元素,我们能够实现一个充满视觉吸引力的3D立方体。

3. 3D转换矩阵应用

3.1 3D转换矩阵基础

3.1.1 转换矩阵的数学原理

在三维空间中,物体的变换可以通过3D转换矩阵来表示。转换矩阵是一种4x4的矩阵,可以对一个点进行缩放、旋转和位移操作。在三维图形编程中,转换矩阵用数学的方式统一了所有的变换操作。

一个标准的3D转换矩阵如下:

[a c e]
[b d f]
[0 0 1]
  • a b c d 定义了旋转和倾斜的效果。
  • e f 定义了在X和Y轴上的位移。
  • 通常 z 轴的位移和旋转是由其他函数控制,比如 rotateZ translateZ 等。

3.1.2 在CSS中使用3D转换矩阵

在CSS中,可以通过 transform 属性应用3D转换矩阵。矩阵乘法涉及到多个参数,但在CSS中只需要指定 matrix3d() 函数的16个参数即可。

例如,一个简单的缩放和旋转矩阵可以这样应用:

.element {
  transform: matrix3d(
    1, 0, 0, 0,  /* 第一列 */
    0, 1, 0, 0,  /* 第二列 */
    0, 0, 1, 0,  /* 第三列 */
    0, 0, 0, 1   /* 第四列,包含透视 */
  );
}

3.2 应用3D转换矩阵实现动画

3.2.1 利用矩阵实现立方体的旋转

要使立方体在三维空间中旋转,可以使用 rotateX() rotateY() rotateZ() 等属性来分别对X轴、Y轴和Z轴进行旋转操作。例如,要使立方体绕X轴旋转,可以使用以下CSS代码:

.cube {
  transform: rotateX(30deg);
}

通过 @keyframes 可以创建动画,从而实现旋转动画效果:

@keyframes rotate-cube {
  from {
    transform: rotateX(0deg);
  }
  to {
    transform: rotateX(360deg);
  }
}

.cube {
  animation: rotate-cube 10s infinite linear;
}

3.2.2 通过矩阵调整立方体的位置和缩放

除了旋转,我们还可以通过矩阵调整立方体的位置和缩放。使用 translate3d() scale3d() 函数来实现:

.cube {
  transform: translate3d(100px, 50px, 0) scale3d(1.5, 1.5, 1.5);
}

这样立方体就会在三维空间中移动到新的位置,并且缩放为原来的1.5倍。

在本章中,我们深入了解了3D转换矩阵的基础知识,并通过CSS中的应用学习了如何使用这些矩阵来创建动态的3D效果。在后续的章节中,我们将继续探究如何进一步优化这些效果,以及如何将其应用到实际的项目中去。

4. perspective 属性设置

4.1 perspective 属性的作用与应用

4.1.1 perspective 属性的基本概念

perspective 属性是CSS3中用于设置观察者与z=0平面之间距离的属性。这个属性允许我们为3D变换设置视距(depth),从而影响3D效果的透视程度。简而言之, perspective 定义了一个透视舞台,使得3D元素在视觉上产生远近感,更接近于人类观察真实世界的方式。

当设置 perspective 属性时,可以使用两种方式:

  • 作为元素样式属性直接添加到HTML元素上 ,这时,所有的子元素都会继承这个属性值作为它们的3D透视舞台。
  • 作为视图(viewpoint)属性,在父元素上设置 ,影响所有3D变换的子元素。

perspective 属性的值通常以像素(px)为单位,并且是一个正值,表示距离。值越小,透视效果越强烈,3D效果看起来更加夸张;值越大,透视效果越平缓,3D效果看起来越自然,但过度增加值可能导致3D效果不明显。

4.1.2 在不同元素上设置 perspective

在实际开发中, perspective 属性可以在多个层级上设置,从而创造出不同的视觉效果:

  • 在父元素上设置 :通过给父元素设置 perspective 属性,可以控制所有3D变换子元素的透视舞台。这有助于统一控制场景中的所有元素,使得3D效果保持一致。 css .scene { perspective: 1000px; /* 设置透视舞台 */ }

  • 在子元素上设置 :如果希望不同的子元素有不同的透视效果,可以直接在子元素上设置 perspective 属性。这样做会覆盖从父元素继承的透视舞台。

css .box { perspective: 500px; /* 为该元素单独设置透视舞台 */ }

  • 内联设置 :在元素的内联样式中直接设置 perspective ,这会覆盖所有继承的透视值,甚至包括父元素设置的值。

```html

```

在不同的层级上设置 perspective 属性,可以使得场景的3D效果更加丰富和动态。接下来我们将探讨如何调整这个属性值来优化3D效果。

4.2 调整 perspective 属性优化3D效果

4.2.1 如何选择合适的 perspective

选择合适的 perspective 值对于优化3D效果至关重要。这个值需要根据实际的设计需求和想要达到的视觉效果来决定:

  • 当透视值较小 时,即观察者距离z=0平面较近,3D元素的深度感会增强,视觉上更加夸张。这种设置适合突出单个元素的3D效果,或者创建卡通风格的动画效果。
  • 当透视值较大 时,即观察者距离z=0平面较远,3D元素的深度感减弱,视觉上更加自然。这种设置适合整体场景的3D效果,或者追求更真实效果的场景。

通常,选择一个适中的透视值可以使3D效果既不会过于夸张,也不会太过平淡。通过实验不同的 perspective 值,可以发现最适合当前项目的视觉表现。

4.2.2 结合 perspective transform 的高级技巧

perspective 属性与 transform 属性的结合使用,是创建复杂3D效果的关键。 transform 属性提供了旋转、缩放、倾斜等变换功能,而 perspective 定义了变换的视觉距离。

为了优化3D效果,我们可以在同一个选择器中链式使用多个 transform 函数,并结合 perspective 属性。这样不仅可以控制元素在3D空间的位置和方向,还可以控制观察者视点和深度感知。

.box {
    transform: rotateY(45deg) scale(1.2);
    perspective: 1200px;
}

在上面的例子中, .box 元素首先进行了Y轴旋转和缩放变换,随后应用了透视舞台。这种组合变换使得元素不仅具有3D效果,而且随着视角的移动,还能展现出变化的视觉深度。

调整透视值和变换函数的顺序,可以改变3D动画和效果的表现形式,允许开发者在不改变实际布局的情况下,创造出更多的视觉层次和动态效果。这种方法非常适合构建复杂的交互式3D场景和动画。

graph TD
    A[开始] --> B[设置透视舞台]
    B --> C[选择合适的透视值]
    C --> D[结合变换函数]
    D --> E[优化和调整3D效果]
    E --> F[测试和实验]

通过以上步骤,可以灵活运用 perspective 属性,创造出既真实又富有表现力的3D动画和效果。在实践中不断调整和优化,是达到最佳视觉效果的关键。

5. 动画与过渡技巧

动画和过渡是网页3D效果中的重要组成部分,它们让静止的三维元素变得生动和互动。本章将深入探讨CSS动画和过渡的原理、实现方法,以及如何优化这些动画效果,使其既流畅又高效。

5.1 CSS动画的原理与实现

5.1.1 动画属性概述

CSS动画是通过 @keyframes 规则定义动画序列,然后使用 animation 属性将动画应用到元素上。这允许开发者创建从一个样式到另一个样式的平滑过渡效果。CSS动画不仅限于2D效果,也可以用于3D效果中,增加额外的维度和深度。

@keyframes 定义动画序列中的关键帧,为每个帧指定样式。动画效果由浏览器自动生成中间的样式变化,从而创建动画。

  • from :定义动画的起始状态。
  • to :定义动画的结束状态。
  • 百分比值(0%到100%):指定动画序列中的其他关键帧,浏览器会自动计算这些关键帧之间的样式变化。

animation 属性是一个简写属性,包含以下几个子属性:

  • animation-name :指定 @keyframes 定义的动画名称。
  • animation-duration :设置动画持续时间。
  • animation-timing-function :设置动画的速度曲线。
  • animation-delay :设置动画开始前的延迟时间。
  • animation-iteration-count :设置动画重复次数,可以使用 infinite 使动画无限循环。
  • animation-direction :定义动画是否反向运行或交替反向。
  • animation-fill-mode :指定动画开始前和结束后如何应用样式。
  • animation-play-state :控制动画是否运行或暂停。

5.1.2 创建简单的3D动画

要创建一个简单的3D旋转动画,首先需要定义立方体的HTML和CSS基础结构,然后通过 @keyframes 定义旋转动画序列,并使用 animation 属性将其应用到立方体上。

@keyframes rotate {
  from {
    transform: rotate3d(0, 0, 0, 0deg);
  }
  to {
    transform: rotate3d(1, 1, 1, 360deg);
  }
}

.cube {
  animation: rotate 10s infinite linear;
}

上述CSS代码定义了一个名为 rotate 的动画,使立方体绕x、y、z轴旋转360度,持续时间为10秒,并且是无限循环的线性运动。

5.2 CSS过渡的细节与应用

5.2.1 过渡属性在3D效果中的作用

CSS过渡提供了一种在两个状态之间平滑过渡的视觉效果,适用于2D和3D变换。过渡可以应用于几乎所有可变的CSS属性,例如颜色、大小、位置等。当CSS属性发生变化时,浏览器会自动应用过渡效果。

过渡由两个主要属性控制:

  • transition-property :指定哪个CSS属性应用过渡效果。
  • transition-duration :设置过渡效果持续的时间。

其他两个子属性 transition-timing-function transition-delay 可以用来调整过渡的执行方式和延迟。

5.2.2 实现流畅3D过渡效果的技巧

为了实现一个流畅的3D过渡效果,需要精确控制过渡属性。例如,让一个元素在与3D变换(如 transform: translate3d )结合时,平滑地移动到新位置。

.box {
  transition-property: transform;
  transition-duration: 0.5s;
}

.box:hover {
  transform: translate3d(20px, 20px, 20px);
}

上面的代码中,当鼠标悬停在 .box 元素上时,它会通过3D变换平移到一个新的位置,过渡持续时间为0.5秒。为了获得更好的效果,通常还会使用 transition-timing-function transform-origin ,后者用于设置变换的原点。

.box {
  transition-property: transform;
  transition-duration: 0.5s;
  transition-timing-function: ease-in-out;
  transform-origin: top left;
}

通过调整这些属性,可以控制过渡的起始和结束速度,使得过渡看起来更自然、更有吸引力。

过渡和动画的性能优化同样重要,对于确保3D效果在各种设备上的流畅执行至关重要。要进行优化,需要减少不必要的计算,避免在动画中使用性能密集型的CSS属性,以及利用浏览器的硬件加速特性。

通过精确的代码编写和细致的调整,开发者可以创建出既美观又高性能的3D动画效果,极大增强用户界面的吸引力和参与度。

6. 兼容性与性能优化

在制作3D动画时,我们需要考虑不同浏览器的兼容性问题以及如何优化性能,以确保动画流畅运行。本章将针对这些关键问题提供解决方案。

6.1 浏览器兼容性问题及解决方案

6.1.1 常见的兼容性问题

随着Web标准的发展,现代浏览器对CSS3 3D变换的支持已经相当良好,但是仍然存在一些兼容性问题。这些可能包括但不限于:

  • 旧版浏览器不支持3D变换 ,如早期版本的Internet Explorer。
  • 硬件加速支持不一致 ,一些浏览器在特定硬件上可能无法有效利用GPU进行渲染。
  • 默认的渲染引擎差异 ,不同浏览器可能默认开启或关闭硬件加速,导致渲染效果不一致。
  • 过渡和动画性能问题 ,尤其是在移动设备或低端硬件上,可能会导致卡顿或丢帧。

6.1.2 针对不同浏览器的兼容性技巧

为了处理这些兼容性问题,我们可以采取一些策略:

  • 使用Autoprefixer :这是一个可以自动添加CSS前缀的工具,帮助我们确保不同浏览器对CSS3属性的支持。
  • 检测浏览器特性 :使用JavaScript来检测浏览器是否支持某个CSS特性,如果不支持,可以提供回退方案或使用polyfills。
  • 使用CSS条件注释 :在旧版浏览器中使用条件注释来提供特定的样式或脚本。
  • 创建低级回退方案 :为旧版浏览器创建简单的2D版本的动画或效果,确保基本功能可用。

下面是一个示例代码,演示如何使用JavaScript来检测WebGL(3D图形的一个重要技术)支持并根据结果执行相应操作:

if (window.WebGLRenderingContext) {
    var canvas = document.querySelector('canvas');
    var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
    if (gl) {
        // WebGl is supported, initialize your 3D environment here.
    } else {
        // WebGl not supported, switch to a 2D fallback or alert the user.
    }
} else {
    // WebGL is not supported, provide a fallback.
}

6.2 性能优化的实践策略

6.2.1 检测和优化3D动画性能

性能优化的关键在于减少浏览器的渲染负担,具体可以采取以下措施:

  • 减少DOM操作 :过多的DOM操作会导致性能下降,尝试合并更新或使用DocumentFragment等技术。
  • 优化图像资源 :使用合适的图像格式,压缩图片,减少图片文件大小。
  • 利用CSS硬件加速 :合理使用 transform opacity 属性来触发GPU加速。
  • 减少重绘和回流 :避免频繁改变布局和样式。

6.2.2 使用GPU加速和其他技巧提升性能

下面是几个使用GPU加速和其他技巧来提升性能的具体方法:

  • 合理使用 will-change 属性 :提前告知浏览器某个元素将要进行动画变换,从而让浏览器进行优化。
  • 最小化3D变换的复杂度 :避免不必要的3D变换层级和复杂度,比如减少嵌套变换。
  • 节制使用动画 :不是所有元素都需要动画效果,只在必要时使用,并尽可能减少动画的范围。

在现代Web开发中,性能监控工具如Chrome开发者工具中的性能分析器可以帮助我们直观地看到哪些操作影响了性能,以及优化前后性能的差异。以下是一个简化的性能分析和优化工作流程:

  1. 记录动画前的性能 :使用性能分析工具记录当前动画的性能数据。
  2. 分析数据 :查找瓶颈,比如过长的绘制时间或者重绘、回流次数过多。
  3. 优化 :根据分析结果进行优化,可能包括代码优化、资源优化等。
  4. 比较优化后的性能 :重复性能测试,对比优化前后的性能数据,验证优化效果。

性能优化是一个持续的过程,随着Web技术的发展和硬件性能的提升,我们不断调整策略以适应新的挑战。

7. 3D动画的实际应用案例

3D动画技术不仅仅局限于技术层面的展示,更重要的是它如何被应用到现实世界中,为用户创造独特的体验。本章将通过实际案例探讨3D动画在不同场景下的应用,以便读者可以更好地理解其实际价值和运用。

7.1 3D动画在网站上的应用

3D动画为网页设计提供了新的维度。它可以用于多种场景,如产品展示、用户体验增强等,让网站不仅仅是信息传递的渠道,还可以成为互动和娱乐的平台。

7.1.1 展示产品或服务

通过3D动画,产品可以以一种生动的形式展现在用户面前,比如,一个3D动画可以展示产品的功能和特点,使用户更容易理解和记住。这种形式尤其适合电子商务网站或任何需要展示实物商品的场景。

<!-- 示例代码:3D产品展示 -->
<div class="3d-product-container">
  <div class="product" style="transform: rotateX(0deg) rotateY(0deg);"> <!-- 产品模型 -->
    <!-- 这里可以通过CSS3D变换来旋转产品模型 -->
  </div>
</div>

7.1.2 提升用户交互体验

3D动画可以增加用户界面的互动性,提高用户参与度。例如,在用户进行某些操作时,如点击按钮或提交表单,可以添加动画效果来反馈这些操作,使用户获得即时的视觉满足。

/* 示例CSS:按钮点击反馈动画 */
button:active {
  animation: buttonClick 0.3s ease;
}
@keyframes buttonClick {
  0% { transform: scale(1); }
  50% { transform: scale(0.9); }
  100% { transform: scale(1); }
}

7.2 3D动画在广告和营销中的应用

广告和营销活动常常需要吸引用户的注意力,并传达品牌信息。3D动画因其强烈的视觉冲击力和独特的表现形式,成为营销人员的理想选择。

7.2.1 创造有吸引力的广告内容

3D动画可以制作成引人注目的广告视频或者横幅广告。例如,一个3D动画广告可以展示产品在虚拟世界中的使用场景,让潜在客户对产品有一个直观的认识。

// 示例JavaScript:控制3D动画广告播放
let ad3D = new THREE宣传片();
ad3D.init();
ad3D.play();

7.2.2 在营销活动中使用3D动画

在诸如产品发布会、线上研讨会或社交媒体活动等营销场合,3D动画可以作为亮点吸引参与者,并通过互动体验加强品牌印象。

<!-- 示例代码:3D动画互动体验 -->
<div id="3d-interaction" class="interaction"></div>
<script>
// 使用WebGL技术实现3D互动动画
let scene = new THREE.Scene();
let camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
let renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.getElementById('3d-interaction').appendChild(renderer.domElement);

// 创建3D对象并添加到场景中
let geometry = new THREE.BoxGeometry();
let material = new THREE.MeshBasicMaterial({color: 0x00ff00});
let cube = new THREE.Mesh(geometry, material);
scene.add(cube);

// 渲染循环
function animate() {
  requestAnimationFrame(animate);
  cube.rotation.x += 0.01;
  cube.rotation.y += 0.01;
  renderer.render(scene, camera);
}
animate();
</script>

通过这些实际案例,我们可以看到3D动画不仅能够吸引用户的眼球,而且能够有效地传达信息和增强用户体验。这为网页设计师和开发者提供了更多的创意空间,使他们能够设计出更加丰富多彩的网页内容。在第七章的后续内容中,我们将探讨更多的应用案例,以及如何结合前端技术和工具将这些案例变为现实。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本资源展示了如何仅用CSS3技术创建一个炫酷的3D旋转立方体动画特效,此特效适用于动态网页设计,提供强烈的视觉冲击。该特效实现涵盖了CSS3 3D变换、立方体结构、3D转换矩阵、 perspective 属性、动画与过渡、HTML和CSS结构设计以及兼容性与性能优化等方面。特效可用于网页加载指示器、交互式按钮等多种场景,强调了对Web交互效果创新的重要性。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

转载请注明出处或者链接地址:https://www.qianduange.cn//article/17316.html
标签
评论
发布的文章

JWT(JSON WEB TOKEN)详解

2024-09-10 23:09:36

NPM 常用命令(十二)

2024-09-10 23:09:24

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!