爬行的蜗牛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: golang Linux PHP
查看: 96|回复: 0

html+css酷炫的3D旋转相册(附源码)

[复制链接]

152

主题

48

回帖

1137

积分

管理员

积分
1137
发表于 2024-11-23 16:42:04 | 显示全部楼层 |阅读模式
实现效果

111.gif
源码(html部分)

  1. <!DOCTYPE html>
  2. <html lang="en">

  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.   <title>图像缩放</title>
  7.   <link rel="stylesheet" href="./style.css">

  8. </head>

  9. <body>
  10.   <div class="carousel">

  11.     <div class="control-button left"><input type="radio" name="control-input"></div>
  12.     <div class="control-button right"><input type="radio" name="control-input" checked></div>

  13.     <div class="rotation-direction">

  14.       <ul class="item-wrapper" style="--_num-elements: 11">

  15.         <li class="item"
  16.           style="--_index: 1; --_image-url: url('https://images.unsplash.com/photo-1730722005859-f93a79460bae?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D')">
  17.           <a href="#" target="_blank"></a>
  18.         </li>
  19.         <li class="item"
  20.           style="--_index: 2; --_image-url: url('https://images.unsplash.com/photo-1730815664512-238cea535eff?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D')">
  21.           <a href="#" target="_blank"></a>
  22.         </li>
  23.         <li class="item"
  24.           style="--_index: 3; --_image-url: url('https://images.unsplash.com/photo-1731128976871-9dc558f0c3c4?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D')">
  25.           <a href="#" target="_blank"></a>
  26.         </li>
  27.         <li class="item"
  28.           style="--_index: 4; --_image-url: url('https://images.unsplash.com/photo-1730407401172-aeed1b1ace5b?q=80&w=1935&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D')">
  29.           <a href="#" target="_blank"></a>
  30.         </li>
  31.         <li class="item"
  32.           style="--_index: 5; --_image-url: url('https://images.unsplash.com/photo-1730724583278-151efd042e16?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D')">
  33.           <a href="#" target="_blank"></a>
  34.         </li>
  35.         <li class="item"
  36.           style="--_index: 6; --_image-url: url('https://images.unsplash.com/photo-1731000891359-b430173e8491?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D')">
  37.           <a href="#" target="_blank"></a>
  38.         </li>
  39.         <li class="item"
  40.           style="--_index: 7; --_image-url: url('https://images.unsplash.com/photo-1730435136320-1410fa8bed02?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D')">
  41.           <a href="#" target="_blank"></a>

  42.         </li>
  43.         <li class="item"
  44.           style="--_index: 8; --_image-url: url('https://images.unsplash.com/photo-1730523169782-31cb72f147ff?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D')">
  45.           <a href="#" target="_blank"></a>

  46.         </li>
  47.         <li class="item"
  48.           style="--_index: 9; --_image-url: url('https://images.unsplash.com/photo-1730405704088-3d8f36e32b62?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D')">
  49.           <a href="#" target="_blank"></a>

  50.         </li>
  51.         <li class="item"
  52.           style="--_index: 10; --_image-url: url('https://images.unsplash.com/photo-1717764737741-b22a89548750?q=80&w=1970&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D')">
  53.           <a href="#" target="_blank"></a>

  54.         </li>
  55.         <li class="item"
  56.           style="--_index: 11; --_image-url: url('https://images.unsplash.com/photo-1730386547603-918a97d624d4?q=80&w=1990&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D')">
  57.           <a href="#" target="_blank"></a>
  58.         </li>

  59.         <li class="carousel-ground"></li>

  60.       </ul>

  61.     </div>

  62.   </div>

  63. </body>

  64. </html>
复制代码
源码(css部分 创建一个style.css文件)
  1.   :root {
  2.       --transition-duration: 250ms;
  3.       --transition-ease: ease-out;
  4.       --bg-color-rgb: 0, 0, 0;
  5.       --shadow-color-rgb: 128, 128, 128;
  6.       --item-width: 11.5rem;
  7.       --item-height: 17.5rem;
  8.       --hover-effect: 1.075;
  9.       --reflection-blur: 0.25rem;
  10.       --empty-color-rgb: 255, 255, 255;
  11.       --glow-color-rgb: 255, 255, 255;
  12.       --glow-size: 5rem;
  13.       --diameter: 50rem;
  14.       --perspective: 1000px;
  15.       --perspective-origin: 50% 20%;
  16.       --control-button-width: 1.25rem;
  17.       --control-button-height: 4rem;
  18.       --control-color-rgb: 255, 255, 255;
  19.       --animation-duration: 25s;
  20.       --animation-play-state: running;
  21.       --direction-animation-play-state: paused;
  22.     }

  23.     *,
  24.     *::before,
  25.     *::after {
  26.       margin: 0;
  27.       padding: 0;
  28.       border: 0;
  29.       box-sizing: border-box;
  30.     }

  31.     *:focus {
  32.       outline: none;
  33.     }

  34.     a {
  35.       -webkit-tap-highlight-color: transparent;
  36.       user-select: none;
  37.     }

  38.     body {
  39.       display: flex;
  40.       align-items: center;
  41.       justify-content: center;
  42.       height: 100vh;
  43.       background-color: rgb(var(--bg-color-rgb));
  44.       overflow: hidden;
  45.     }

  46.     .carousel {
  47.       --_diameter: var(--diameter);
  48.       --_radius: calc(var(--_diameter) / 2);
  49.       --_item-width: var(--item-width);
  50.       --_item-height: var(--item-height);
  51.       perspective: var(--perspective);
  52.       perspective-origin: var(--perspective-origin);
  53.       width: var(--_diameter);
  54.       height: var(--_diameter);
  55.     }

  56.     @media only screen and (max-width: 48rem) {
  57.       .carousel {
  58.         --_scale: 0.75;
  59.         --_diameter: calc(var(--diameter) * var(--_scale));
  60.         --_item-width: calc(var(--item-width) * var(--_scale));
  61.         --_item-height: calc(var(--item-height) * var(--_scale));
  62.       }
  63.     }

  64.     @media only screen and (max-width: 32rem) {
  65.       .carousel {
  66.         --_scale: 0.6;
  67.         --_diameter: calc(var(--diameter) * var(--_scale));
  68.         --_item-width: calc(var(--item-width) * var(--_scale));
  69.         --_item-height: calc(var(--item-height) * var(--_scale));
  70.       }
  71.     }

  72.     @media only screen and (max-width: 16rem) {
  73.       .carousel {
  74.         --_scale: 0.25;
  75.         --_diameter: calc(var(--diameter) * var(--_scale));
  76.         --_item-width: calc(var(--item-width) * var(--_scale));
  77.         --_item-height: calc(var(--item-height) * var(--_scale));
  78.       }
  79.     }

  80.     .control-button {
  81.       --_width: var(--control-button-width);
  82.       --_height: var(--control-button-height);
  83.       z-index: 1;
  84.       width: var(--_width);
  85.       height: var(--_height);
  86.       background-color: rgb(var(--control-color-rgb));
  87.       opacity: 0.2;
  88.       transition: opacity var(--transition-duration) var(--transition-ease);
  89.       position: absolute;

  90.       &:hover {
  91.         opacity: 0.4;
  92.       }

  93.       &:has(input:checked) {
  94.         opacity: 0.8;
  95.       }

  96.       & input {
  97.         appearance: none;
  98.         opacity: 0;
  99.         width: 100%;
  100.         height: 100%;
  101.         cursor: pointer;
  102.       }

  103.       &.left {
  104.         clip-path: polygon(0% 50%, 100% 0%, 100% 100%);
  105.         top: calc(var(--_radius) - var(--_height) / 2);
  106.         left: 0;
  107.       }

  108.       &.right {
  109.         clip-path: polygon(0% 0%, 100% 50%, 0% 100%);
  110.         top: calc(var(--_radius) - var(--_height) / 2);
  111.         right: 0;
  112.       }
  113.     }

  114.     .carousel:has(.control-button.left input:checked) {
  115.       --direction-animation-play-state: running;
  116.     }

  117.     .carousel:has(.control-button.right input:checked) {
  118.       --direction-animation-play-state: paused;
  119.     }

  120.     .rotation-direction {
  121.       --_direction-animation-play-state: var(--direction-animation-play-state);
  122.       --_z: calc(var(--_radius) * -1);
  123.       transform: translateZ(var(--_z));
  124.       transform-style: preserve-3d;
  125.       animation: rotation-reverse calc(var(--animation-duration) / 2) reverse linear infinite var(--_direction-animation-play-state);
  126.       transition: all var(--transition-duration) var(--transition-ease);
  127.     }

  128.     @keyframes rotation-reverse {
  129.       from { transform: translateZ(var(--_z)) rotateY(0deg); }
  130.       to { transform: translateZ(var(--_z)) rotateY(360deg); }
  131.     }

  132.     @keyframes rotation-normal {
  133.       from { transform: rotateY(0deg); }
  134.       to { transform: rotateY(360deg); }
  135.     }

  136.     .item-wrapper {
  137.       transform-style: inherit;
  138.       width: inherit;
  139.       height: inherit;
  140.       list-style-type: none;
  141.       position: relative;
  142.       animation: rotation-normal var(--animation-duration) normal linear infinite var(--animation-play-state);
  143.       transition: all var(--transition-duration) var(--transition-ease);
  144.     }

  145.     .rotation-direction:has(.item:hover) {
  146.       --animation-play-state: paused;
  147.       --_direction-animation-play-state: paused;
  148.     }

  149.     .item {
  150.       --_width: var(--_item-width);
  151.       --_height: var(--_item-height);
  152.       --_rotation: calc(360 / var(--_num-elements) * var(--_index) * 1deg);
  153.       left: calc(var(--_radius) - var(--_item-width) / 2);
  154.       top: calc(var(--_radius) - var(--_item-height) / 2);
  155.       transform: rotateY(var(--_rotation)) translateZ(var(--_radius));
  156.       transform-style: inherit;
  157.       width: var(--_width);
  158.       height: var(--_height);
  159.       transition: all var(--transition-duration) var(--transition-ease);
  160.       box-shadow: 0 0 var(--glow-size) transparent;
  161.       position: absolute;

  162.       &:hover {
  163.         box-shadow: 0 0 var(--glow-size) rgb(var(--glow-color-rgb));
  164.         transform: rotateY(var(--_rotation)) translateZ(calc(var(--_radius) * var(--hover-effect)));
  165.       }

  166.       & a {
  167.         display: block;
  168.         width: inherit;
  169.         height: inherit;
  170.         text-indent: -9999px;
  171.         background-color: rgba(var(--empty-color-rgb), 0.5);
  172.         background-image: var(--_image-url);
  173.         background-repeat: no-repeat;
  174.         background-position: center;
  175.         background-size: cover;
  176.         transition: filter var(--transition-duration) var(--transition-ease);
  177.         filter: grayscale(100%);

  178.         &:hover {
  179.           filter: grayscale(0%);
  180.         }
  181.       }

  182.       &::before {
  183.         content: '';
  184.         width: inherit;
  185.         height: inherit;
  186.         background-color: rgba(var(--empty-color-rgb), 0.5);
  187.         background-image:
  188.           linear-gradient(to top, rgba(var(--bg-color-rgb), 0.25) 0%, rgba(var(--bg-color-rgb), 1.0) 75%),
  189.           var(--_image-url);
  190.         background-repeat: no-repeat;
  191.         background-position: center;
  192.         background-size: cover;
  193.         pointer-events: none;
  194.         filter: blur(var(--reflection-blur)) grayscale(100%);
  195.         transition: filter var(--transition-duration) var(--transition-ease);
  196.         transform-style: inherit;
  197.         transform-origin: center bottom;
  198.         transform: rotateX(90deg) rotateZ(180deg) rotateY(180deg);
  199.         position: absolute;

  200.         &:hover {
  201.           filter: blur(var(--reflection-blur)) grayscale(0%);
  202.         }
  203.       }
  204.     }

  205.     .ground {
  206.       --_width: var(--_diameter);
  207.       --_height: var(--_diameter);
  208.       --_rotation: 90deg;
  209.       left: calc(var(--_radius) - var(--_width) / 2);
  210.       top: calc(var(--_radius) - var(--_height) / 2);
  211.       transform: rotateX(var(--_rotation)) translateZ(calc(var(--_item-height) / -2));
  212.       width: var(--_width);
  213.       height: var(--_height);
  214.       border-radius: 50%;
  215.       background: radial-gradient(rgba(var(--shadow-color-rgb), 0.75) 15%, rgba(var(--bg-color-rgb), 0) 60%);
  216.       opacity: 0.5;
  217.       transition: opacity var(--transition-duration) var(--transition-ease);
  218.       position: absolute;

  219.       &.item-wrapper:has(.item:hover) {
  220.         opacity: 0.75;
  221.       }
  222.     }
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表