cf-pages / Telegraph-Image

Image Hosting solution, Flickr/imgur alternative, make it easy for users to share their images. Using Cloudflare Pages and Telegraph.
https://im.gurl.eu.org
Creative Commons Zero v1.0 Universal
3.36k stars 6.13k forks source link

管理界面是不是的预览可以设置成瀑布流吗 #119

Open panther125 opened 6 months ago

panther125 commented 6 months ago

本人基于list接口设置了瀑布流图片预览,后续希望作者在这个页面实现管理功能 904d5777a3c0e0a96b9cd

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
<style>
  body{
    background: linear-gradient(90deg, #ffd7e4 0%, #c8f1ff 100%);
  }
  ::-webkit-scrollbar {
    width: 8px;
    height: 8px;
}

 ::-webkit-scrollbar-corner {
    background-color: transparent;
}

 ::-webkit-scrollbar-thumb {
    background-color: #49b1f5;
    background-image: -webkit-linear-gradient(45deg, hsla(0, 0%, 100%, .4) 25%, transparent 0, transparent 50%, hsla(0, 0%, 100%, .4) 0, hsla(0, 0%, 100%, .4) 75%, transparent 0, transparent);
    border-radius: 2em;
}

 ::-webkit-scrollbar-track {
    background-color: rgba(73, 177, 245, .2);
    border-radius: 2em;
}
  .box {
      position: relative;
  }
  img {
      width: 200px;
      height: auto;
      padding: 5px;
      margin-left: 1.25%;
      border-radius: 20px;
  }
  #bigimg {
    display: none;
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.5);
}
#bigimg img {
    position: absolute;
    width: 90%;
    height: 100%;
    top: 50%;
    left: 50%;
    object-fit: contain;
    transform: translate(-50%, -50%);
}
</style>
</head>
<body>
  <div class="box">
  </div>
  <!-- 放大遮罩层 -->
    <div id="bigimg" onclick="closeBigImg();"></div>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script>
  var imgList
  $.ajax({
    url: "https://image.gincode.icu/api/manage/list",
    async: false,
    dataType: "json",
    success: function(data) {
      imgList = data; // 将请求的数据赋值给全局变量
    }
});
  var targetElement = document.querySelector('.box');
    let str ='';
    for (let i = 0; i < imgList.length; i++){
      if(imgList[i].name.indexOf(".mp4")>0)continue;
      str += '<img onclick="showBigImg(this)" data-original='+"/file/"+imgList[i].name+' src='+"/file/"+imgList[i].name +'>';
    }
    targetElement.innerHTML = str
</script>
</body>
<script>
  window.onload = $(function () {
      // 获取图片的宽度(200px)
      let imgWidth = $('img').outerWidth(); // 200
      //console.log(imgWidth)
      waterfallHandler();

      // 瀑布流处理
      function waterfallHandler() {
          // 获取图片的列数
          let column = parseInt($(window).width() / imgWidth);
          //console.log(column)
          // 高度数组
          let heightArr = [];
          for(let i=0; i<column; i++) {
              heightArr[i] = 0;
          }
          $.each($('img'), function (index, item) {
              // 当前元素的高度
              let itemHeight = $(item).outerHeight();
              // 高度数组最小的高度
              let minHeight = Math.min(...heightArr);
              // 高度数组最小的高度的索引
              let minIndex = heightArr.indexOf(minHeight);
              $(item).css({
                  position: 'absolute',
                  top: minHeight + 'px',
                  left: minIndex * imgWidth + 'px'
              });

              heightArr[minIndex] += itemHeight;
          });
      }

      // 窗口大小改变
      $(window).resize(function () {
          waterfallHandler();
      });
  });
  function showBigImg(img) {
    var bigImg = document.getElementById('bigimg');
    var imgUrl = img.getAttribute('data-original');
    bigImg.innerHTML = '<img src="' + imgUrl + '">';
    bigImg.style.display = 'block';
    // 获取屏幕的宽度和高度
    //var screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
    //var screenHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
    //bigImg.style.maxWidth = screenWidth * 0.9 + 'px';
    //bigImg.style.maxHeight = screenHeight * 0.9 + 'px';
}

function closeBigImg() {
    var bigImg = document.getElementById('bigimg');
    bigImg.style.display = 'none';
    bigImg.innerHTML = '';
}
</script>
</html>
SokWith commented 6 months ago

有分页功能吗?图片多了打开太慢了。

panther125 commented 3 months ago

有分页功能吗?图片多了打开太慢了。

可以在list接口改一下

    const value = await env.img_url.list();
    const url = new URL(request.url);
    const start = parseInt(url.searchParams.get("start")) || 0;
    const count = parseInt(url.searchParams.get("count")) || 10;
    const offset = start * count;
    const paginatedKeys = value.keys.slice(offset, offset + count);
    const res = paginatedKeys.map(key => ({
        name: key.name,
        TimeStamp: key.metadata?.TimeStamp,
        ListType: key.metadata?.ListType,
        rating_label: key.metadata?.rating_label,
    }));
    //console.log(res)
    const response = {
        count: value.keys.length, // Total number of items
        datalist: res, // Paginated data list
    };
    const info = JSON.stringify(response);
    return new Response(info);

图片预览也加上懒加载可以提高点速度

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
    background: linear-gradient(90deg, #ffd7e4 0%, #c8f1ff 100%);
  }
        .box {
            position: relative;
        }

        img {
            width: 200px;
            height: auto;
            padding: 5px;
            margin-left: 1.25%;
            border-radius: 20px;
        }

        #bigimg {
            display: none;
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background-color: rgba(0, 0, 0, 0.5);
        }

        #bigimg img {
            position: absolute;
            width: 90%;
            height: 100%;
            top: 50%;
            left: 50%;
            object-fit: contain;
            transform: translate(-50%, -50%);
        }
        wc-waterfall > * {
          border-radius: 6px;
          background-color: #80808020;
          font-size: 2em;
          text-align: center;
        }

        wc-waterfall > *:hover {
          background-color: #80808040;
        }
    </style>
</head>

<body>
     <wc-waterfall id="fl" cols="5" gap="10">
    </wc-waterfall>
    <div id="bigimg" onclick="closeBigImg();"></div>
</body>
<script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/onepage-scroll/1.3.1/jquery.onepage-scroll.min.js" type="application/javascript"></script>
<script src="https://wallpaper.gincode.icu/js/index.iife.js"></script>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script>
var jigsaw = {
    count: 0,            // 已加载的总数
    halfHtml: '',
    pageno: 0,  // 最后一个加载的html
    pageSize: 10,
    loadBig: false,      // 是否已加载最大的那个
    ajaxing: false        //是否正在ajax加载
};
//加载图床图片
function ajaxPanWal() {
    if (jigsaw.ajaxing === true) return false;
    $("#loadmore").html('努力加载中……');
    $("#loadmore").show();
    jigsaw.ajaxing = true;
    if(jigsaw.pageno === 0){
        jigsaw.pageSize = 20;
        jigsaw.pageno++;
    }else{
        jigsaw.pageSize = 10
    }
    var jsonData
    $.ajax({
            url: "https://image.gincode.icu/api/manage/list",
            async: false,
            data: "start=" + jigsaw.pageno + "&count=" + jigsaw.pageSize,
            dataType: "json",
            success: function (data) {
                jsonData = data; // 将请求的数据赋值给全局变量
            }
        });
    jigsaw.pageno++;
    //console.log(jsonData);
    var imgList = jsonData.datalist;
    //console.log(imgList);
       const fl = document.getElementById("fl")
    for (var i = 0; i < imgList.length; i++) {
        if (imgList[i].name.indexOf(".mp4") > 0) continue;
        const div = document.createElement('div')
        div.innerHTML = '<img onclick="showBigImg(this)" data-src="https://image.gincode.icu/file/' + imgList[i].name + '" src="https://image.gincode.icu/file/' + imgList[i].name + '" class="lazyload">'
        fl.appendChild(div)
    }
    resizeHeight();
    jigsaw.ajaxing = false;
    waterfallHandler();
    if (jsonData.datalist.length === 0) {
        $("#loadmore").html('所有的壁纸都已经加载完啦!');
    } else {
        $("#loadmore").hide();
    }
    return true;
}

$(function () {
    // 监听滚动消息
    $(window).scroll(function () {
        let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
        if (scrollTop + $(window).height() + 57 >= $(document).height() && scrollTop > 20) {
            ajaxPanWal();   // 初始加载壁纸
            resizeHeight();
        }
    });
});

function showBigImg(img) {
    var bigImg = document.getElementById('bigimg');
    var imgUrl = img.getAttribute('data-src');
    bigImg.innerHTML = '<img src="' + imgUrl + '">';
    bigImg.style.display = 'block';
}
function closeBigImg() {
    var bigImg = document.getElementById('bigimg');
    bigImg.style.display = 'none';
    bigImg.innerHTML = '';
}

function waterfallHandler() {
    // 获取图片的宽度(200px)
    let imgWidth = $('img').outerWidth(); // 200
    // 获取图片的列数
    let column = parseInt($(window).width() / imgWidth);
    const fl = document.getElementById("fl")
    fl.setAttribute('cols', column);
}
 // 大小改变
window.onresize = function () {
    resizeHeight();
};
// 重新调整高度
function resizeHeight() {
    var newHeight = $("#walBox").width() * (0.618 / 2);  
            $(".jigsaw .item").css('height', newHeight);
            $(".jigsaw .Hhalf").css('height', newHeight / 2);
    return true;
}
// 初始化
window.onload = function () {
    ajaxPanWal();   // 初始加载壁纸
    resizeHeight();
}; 
</script>
</html>