English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Три примера реализации водопада с помощью jQuery

1. Падающий водопадЭто常见的 case, здесь я рассказываю, как реализовать функцию водопада с помощью jQuery!

Введение: мы часто видим функцию водопада на многих веб-сайтах, таких как Taobao, JD и другие...

Для реализации его мы в первую очередь должны учитывать несколько вопросов:1. Получение данных 2. Способ排列 3. Как реализовать排列

На самом деле, в водопаде есть ядра, которые используют абсолютное позиционирование

Мы будем постепенно углубляться в анализ:

Это разметка html, разметка css можно настроить самостоятельно, только нужно чтобы grid-коробка имел абсолютное позиционирование, а его родительский элемент относительное позиционирование! В разделе есть пример кода

Ниже приведен раздел script

Этот способ можно получить индекс изображения по порядку с помощью цикла for, а затем постоянно изменять значение top и left в стилях CSS!

При получении ресурсов изображений иногда высота изображений не одинакова, если они всегда следуют順序у, то последнее изображение будет выровнено неаккуратно, и это будет выглядеть плохо!

Продолжаем читать дальше:

Мы можем использовать другой способ для вставки изображения в самое короткое столбец текущего столбца, чтобы решить эту проблему!

Ниже мы посмотрим на код jquery:

Хорошо, теперь мы уже решили эту проблему водопада двумя способами, но у нас все еще есть проблема, это то, что для создания водопада очень важно количество изображений, не слишком низко ли это, чтобы писать html по одному?

Продолжаем читать дальше:

Ниже я介绍一下 способ использования шаблонов двигателя для получения данных json с сервера, чтобы реализовать эту проблему!

1. Нам нужно только搭建 html-коробку!

2. Коробка собрана, данные нужно получить, это зависит от нее!

3. Это два библиотеки js, которые можно загрузить в Интернете!

4. Ниже приведена конкретная часть js, которую нужно внимательно анализировать!

Включает: вызов шаблонов поисковой системы, привязку функций, преобразование в объекты jQuery!

Эта часть включает в себя: запрос данных к json через ajax

Эта часть включает в себя: функции遍历, для поиска самого короткого столбца!

Вот и это, также является четвертой частью:

Последним шагом является функция прокрутки, эту часть рекомендуется проверить с помощью console.log на заднем плане, так будет легче понять!

Хотя последний способ немного сложен, но после его выполнения мы сможем использовать его много раз и автоматически получить много данных!

Ниже я прилагаю код в его исходном виде, пожалуйста, хорошо проверьте его, не забудьте изменить изображения и пути! 

Первый метод в коде: 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
 <title>Document</title>
 <style type="text/css">
  *{
   margin: 0;
   padding: 0;
  }
  body{
   background-color: #ccc;
  }
  .waterfall{
   width: 790px;
   /*height: 1000px;*/
   /*border: 1px solid red;*/
   margin: 0 auto;
   position: relative;
  }
  .grid{
   position: absolute;
   width: 230px;
   background-color: white;
   padding: 10px;
   border-radius: 15px;
  }
  .grid img{
   width: 230px;
  }
 </style>
</head>
<body>
 <div class="waterfall">
  <div class="grid">
   <img src="images/0.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/1.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/2.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/3.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/4.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/5.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/6.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/7.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/8.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/9.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/10.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/11.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/12.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
 </div>
 <script type="text/javascript" src="js/jquery-1.12.3.min.js"></script>
 <script type="text/javascript">
  window.onload = function() {
   // получите все grid
   $grids = $(".grid");
   //
   $grids.each(function() {
    var sum = 0;
    //пройти по высоте всех людей над ним
    for(var i = $(this).index() - 3 ; i >= 0 ; i-=3){
     sum += $grids.eq(i).outerHeight() + 20;
    }
    console.log($(this).index());
    $(this).css({
     "top" : sum
     "left" : ($(this).index() % 3) * 270
    }
   });
   }
 </script>
</body>
</html>
 

Второй способ: 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
 <title>Document</title>
 <style type="text/css">
  *{
   margin: 0;
   padding: 0;
  }
  body{
   background-color: #ccc;
  }
  .waterfall{
   width: 790px;
   margin: 0 auto;
   position: relative;
  }
  .grid{
   position: absolute;
   width: 230px;
   background-color: white;
   padding: 10px;
   border-radius: 15px;
  }
  .grid img{
   width: 230px;
  }
 </style>
</head>
<body>
 <h3>Алгоритм водопада 2, смотрите, какая колонка самая короткая, вставляйте в эту колонку</h3>
 <div class="waterfall">
  <div class="grid">
   <img src="images/0.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/1.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/2.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/3.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/4.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/5.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/6.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/7.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/8.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/9.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/10.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/11.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
  <div class="grid">
   <img src="images/12.png" alt="" />
   <p>Содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое содержимое</p>
  </div>
 </div>
 <script type="text/javascript" src="js/jquery-1.12.3.min.js"></script>
 <script type="text/javascript" src="js/underscore.js"></script>
 <script type="text/javascript">
  window.onload = function() {
   // каждая ячейка не всегда вставляется в колонку с номером %3, смотрите, где самая короткая колонка и вставляйте туда
   // получите все grid
   $grids = $(".grid");  
    // храните текущую общую высоту трёх колонок в массиве
    var colHeight = [0,0,0]; 
    // console.log(colHeight);
    // пройдите по всем маленьким ячейкам
    $grids.each(function() {
     // найдите текущую самую короткую колонку
     var minValue = _.min(colHeight); // минимальное значение в colHeight!
     // посмотрите, где出现在index короткой колонки
     var minIndex = _.indexOf(colHeight,minValue);// индекс наименьшего значения}}
    // console.log(minIndex);
     $(this).css({
      "top" : minValue ,
      "left": minIndex * 270
     });
     colHeight[minIndex] += $(this).outerHeight() + 20;
     // console.log(colHeight[minIndex]);
    }
   }
 </script>
</body>
</html>
 

Третий способ кода: 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
 <title>Document</title>
 <style type="text/css">
  *{
   margin: 0;
   padding: 0;
  }
  body{
   background-color: #ccc;
  }
  .waterfall{
   width: 790px;
   margin: 0 auto;
   position: relative;
  }
  .grid{
   position: absolute;
   width: 230px;
   background-color: white;
   padding: 10px;
   border-radius: 15px;
  }
  .grid img{
   width: 230px;
  }
  .grid .title{
   font-weight: bold;
   font-size: 18px;
   line-height: 32px;
  }
  .grid .neirong{
   line-height: 150%;
   font-size: 14px;
   margin-bottom: 20px;
  }
  .grid .zuozhe{
   float: right;
   color:orange;
   font-size: 12px;
  }
  .loading{
   margin: 0 auto;
   width: 400px;
   line-height: 30px;
   text-align: center;
   font-size: 14px;
   background-color: gold;
   color: white;
  }
 </style>
</head>
<body>
 <div class="waterfall" id="waterfall">
 </div>
 <div class="loading">
  Идет загрузка...
 </div>
 <script type="text/template" id="grid_template">
  <div class="grid">
   <img src="<%=imgurl%>" alt="" />
   <p class="title"><%=title%></p>
   <p class="neirong"><%=content%></p>
   <p class="zuozhe"><%=author%></p>
  </div>
 </script>
 <script type="text/javascript" src="js/jquery-1.12.3.min.js"></script>
 <script type="text/javascript" src="js/underscore.js"></script>
 <script type="text/javascript">
 // определение переменных и объектов
  // получение содержимого шаблона двигателя, преобразование в строку с помощью jQuery
  var templateString = $("#grid_template").html();
  // привязка преобразованного строки к функции compileFunction
  var compileFunction = _.template(templateString); // _.template() возвращает функцию!
  // console.log(typeof(compileFunction)); // function
  // преобразование в объект jQuery для использования методов jQuery позже
  var $waterfall = $("#waterfall");
  var $loading = $(".loading");
  // три колонки водопадного стиля, общая высота каждой колонки
  var colHeight = [0,0,0];
  // Это массив высот трёх столбцов, который не зависит от значений внутри, он показывает порядок индексов
  // console.log(colHeight);
 // Получение данных
  // Сигнализатор
  var page = 1;
  getJSONandRender(page());
  function getJSONandRender(page){
   // Для улучшения пользовательского опыта
   $loading.show();
   // Отправка запроса ajax
   $.get("json/json" + page + ".txt", function(data){ // Вывод строки 
    // Преобразование в объект
    var dataObj = eval("(" + data + ")"); // Парсинг данных ajax в объект!
    // Нет больше данных
    // dataObj.news.length 来自 json с сервера
    if(dataObj.news.length == 0){
     $loading.show().html("Больше нет");
     return; // Здесь заканчивается lock
    }
 // Функция遍历, динамически получающая значение индекса по абсолютному положению!
    _each(dataObj.news, function(dictionary){ // При каждом прохождении выполняется функция!     
     // Это системный内置ный конструктор
     var image = new Image(); // Создание объекта и выделение памяти
     // После инсталляции объекта, конструктор немедленно выполняет любое код, содержащееся в нем
     image.src = dictionary.imgurl;
     // Мы преобразуем image в объект jQuery и привязываем к нему событие
     $(image).load(function(){
      // console.log(dictionary.imgurl + "Загрузка завершена");      
      var domString = compileFunction(dictionary);
      // console.log(typeof(domString));
      var $grid = $(domString);
      $waterfall.append($grid);
      // На основе алгоритма водопада устанавливается left и top
      // Минимальное значение
      minValue = _.min(colHeight);
      // Местоположение минимального значения!
      minIndex = _.indexOf(colHeight, minValue);
      $grid.css({})
       "top": minValue
       "left": minIndex * 270
      });
      //Изменить значение общей высоты столбцов массива
      colHeight[minIndex] += $grid.outerHeight() + 10;
      //Сделать большой контейнер по высоте самого высокого столбца
      $waterfall.css("height", _.max(colHeight));
      //Скрыть текст загрузки
      $loading.hide();
     });
    });
    lock = true;
   });
  }
  var lock = true;
  //Слушать скроллинг
  $.scroll(function(){
   if(!lock) return;
   var rate = $(window).scrollTop() / ($(document).height() - $(window).height());
   if(rate >= 0.7){
    page++;
    getJSONandRender(page());
    lock = false;
   }
  }
 </script>
</body>
</html>

Вот и все, что есть в этой статье, я надеюсь, что это поможет вам в изучении, и希望大家多多支持呐喊教程。

Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору. Контент предоставлен пользователями Интернета, загружен пользователями самостоятельно, сайт не обладает правами собственности, не был отредактирован вручную и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для подачи жалоб и предоставления соответствующих доказательств. При подтверждении факта, сайт немедленно удаляет涉嫌侵权的内容.

Основной учебник
Вам может понравиться