html css and js 设计相册3D旋转图片效果特效展示cid1161+获取源码

html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>3d creative gallery</title>
  6. <link rel="stylesheet" href="style.css">
  7. </head>
  8. <body>
  9. <div class="scene">
  10. <div class="back stage">
  11. <a href="#" class="character">
  12. <img src="1.jpg" alt="">
  13. </a>
  14. <a href="#" class="character">
  15. <img src="2.png" alt="">
  16. </a>
  17. <a href="#" class="character">
  18. <img src="3.png" alt="">
  19. </a>
  20. <a href="#" class="character">
  21. <img src="4.png" alt="">
  22. </a>
  23. <a href="#" class="character">
  24. <img src="5.png" alt="">
  25. </a>
  26. <a href="#" class="character">
  27. <img src="7.jpg" alt="">
  28. </a>
  29. </div>
  30. </div>
  31. <script src="main.js"></script>
  32. </body>
  33. </html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>3d creative gallery</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    
    <div class="scene">
        <div class="back stage">
           
            <a href="#" class="character">
                <img src="1.jpg" alt="">
            </a>
            
             <a href="#" class="character">
                <img src="2.png" alt="">
            </a>
            
            <a href="#" class="character">
                <img src="3.png" alt="">
            </a>
            
             
            <a href="#" class="character">
                <img src="4.png" alt="">
            </a>
            
             <a href="#" class="character">
                <img src="5.png" alt="">
            </a>
            
             <a href="#" class="character">
                <img src="7.jpg" alt="">
            </a>
            
            
            
        </div>
    </div>
    
     <script src="main.js"></script>
    
</body>
</html>

css

  1. body{
  2. background: #07131f;
  3. }
  4. .scene{
  5. width: 100vw;
  6. height: 100vh;
  7. position: relative;
  8. overflow: hidden;
  9. }
  10. .back.stage{
  11. position: absolute;
  12. top: 50%;
  13. left: 50%;
  14. transform: translate(-50%, -50%);
  15. display: flex;
  16. flex-flow: row nowrap;
  17. align-items: center;
  18. width: 45%;
  19. height: 60%;
  20. transition: all 0.5s;
  21. }
  22. .character{
  23. flex: 1 1 auto;
  24. margin: 1px;
  25. transition: filter 0.7s, transform 0.4s, all 0.7s;
  26. cursor: pointer;
  27. }
  28. .character > img{
  29. max-width: 100%;
  30. max-height: 100%;
  31. display: block;
  32. border: 2px solid white;
  33. }
  34. .back.stage.live{
  35. width: 40%;
  36. }
  37. .character.performing{
  38. position: absolute;
  39. top: 50%;
  40. left: 50%;
  41. margin: 0;
  42. z-index: 10000;
  43. transform: translate(-50%, -50%) rotate3d(1,1,0, 360deg);
  44. }
  45. .character.performing > img{
  46. max-width: 80vw;
  47. max-height: 80vh;
  48. }
  49. .character.idle{
  50. filter: blur(4px);
  51. cursor: auto;
  52. }
body{
    background: #07131f;
}

 
.scene{
    width: 100vw;
    height: 100vh;
    position: relative;
    overflow: hidden;
}


.back.stage{
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    display: flex;
    flex-flow: row nowrap;
    align-items: center;
    width: 45%;
    height: 60%;
    transition: all 0.5s;
}


.character{
    flex: 1 1 auto;
    margin: 1px;
    transition: filter 0.7s, transform 0.4s, all 0.7s;
    cursor: pointer;
}


.character > img{
    max-width: 100%;
    max-height: 100%;
    display: block;
    border: 2px solid white;
}

.back.stage.live{
    width: 40%;
}


.character.performing{
    position: absolute;
    top: 50%;
    left: 50%;
    margin: 0;
    z-index: 10000;
    transform: translate(-50%, -50%) rotate3d(1,1,0, 360deg);
}


.character.performing > img{
    max-width: 80vw;
    max-height: 80vh;
}

.character.idle{
    filter: blur(4px);
    cursor: auto;
}

js

  1. console.clear();
  2. const backstage = document.querySelector('.back.stage');
  3. let performer = null;
  4. backstage.addEventListener('click', e => {
  5. const elm = e.target;
  6. const character = elm.closest('.character');
  7. if (!character) return;
  8. if (performer) {
  9. if (performer === character)
  10. sendBack(character);
  11. }
  12. else
  13. sendFront(character);
  14. });
  15. function sendBack(character) {
  16. for (const ch of Array.from(backstage.children)) {
  17. ch.classList.remove('performing');
  18. ch.classList.remove('idle');
  19. }
  20. performer = null;
  21. backstage.classList.remove('live');
  22. }
  23. function sendFront(character) {
  24. for (const ch of Array.from(backstage.children)) {
  25. if (ch === character) {
  26. const r = ch.getBoundingClientRect();
  27. const o = backstage.getBoundingClientRect();
  28. ch.dataset.top = `${(r.top - o.top)/o.height*100}%`;
  29. ch.dataset.left = `${(r.left - o.left)/o.width*100}%`;
  30. // inject `top` & `left`
  31. ch.style.top = ch.dataset.top;
  32. ch.style.left = ch.dataset.left;
  33. ch.offsetWidth; // force re-calc (apply inline styles above)
  34. ch.classList.add('performing'); // apply css class, then
  35. ch.setAttribute('style', ''); // immd. take out inline style
  36. // ** let `.performing` takes over `top` & `left`
  37. }
  38. else {
  39. ch.classList.add('idle');
  40. }
  41. }
  42. performer = character;
  43. backstage.classList.add('live');
  44. }
  45. setTimeout(() => {
  46. sendFront(backstage.children[5]);
  47. }, 500);
console.clear();
const backstage = document.querySelector('.back.stage');
let performer = null;

backstage.addEventListener('click', e => {
  const elm = e.target;
  const character = elm.closest('.character');
  if (!character) return;
  if (performer) {
    if (performer === character)
      sendBack(character);
  }
  else
    sendFront(character);
});


function sendBack(character) {
  for (const ch of Array.from(backstage.children)) {
    ch.classList.remove('performing');
    ch.classList.remove('idle');
  }
  performer = null;
  backstage.classList.remove('live');
}


function sendFront(character) {
  for (const ch of Array.from(backstage.children)) {
    if (ch === character) {
      const r = ch.getBoundingClientRect();
      const o = backstage.getBoundingClientRect();
      ch.dataset.top = `${(r.top - o.top)/o.height*100}%`;
      ch.dataset.left = `${(r.left - o.left)/o.width*100}%`;
      // inject `top` & `left`
      ch.style.top = ch.dataset.top;
      ch.style.left = ch.dataset.left;
      ch.offsetWidth; // force re-calc (apply inline styles above)
      ch.classList.add('performing'); // apply css class, then
      ch.setAttribute('style', ''); // immd. take out inline style
      // ** let `.performing` takes over `top` & `left`
    }
    else {
      ch.classList.add('idle');
    }
  }
  performer = character;
  backstage.classList.add('live');
}


setTimeout(() => {
  sendFront(backstage.children[5]);
}, 500);

在线演示


让链接同时具备两种打开方式
获取源码: hemas
下载数:133人次, 文件大小: 1.9 KB, 上传日期: 2021年-6 月-23日

公众号回复:gcode  获取解压密码

qrcode_for_gh_6ea2c28a1709_258 (1)

3,712 人查阅

类似文章