Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Вы подписаны на эту темуIsotope фильтр объединить кнопка, список и флажки (https://javascript.ru/forum/dom-window/81988-vy-podpisany-na-ehtu-temuisotope-filtr-obedinit-knopka-spisok-i-flazhki.html)

lev90 25.02.2021 19:06

Вы подписаны на эту темуIsotope фильтр объединить кнопка, список и флажки
 
Добрый день!

Нашел интересный фильтр для сайта "Isotope Combination Filters with Range Sliders" на основе библиотеки Isotope. В мне в нем не хватает флажков и выпадающего списка. Сам я дилетант в JavaScript.

Пробовал неоднократно самостоятельно добавить необходимые элементы, изучая примеры, но так ничего не получилось.

Помогите пожалуйста, добавить в фильтр флажки и выпадающий список.
// External js: jquery, isotope.pkgd.js, bootstrap.min.js, bootstrap-slider.js
$(document).ready( function() {
 
  var buttonFilters = {};
  var buttonFilter = '*';
 
  var rangeFilters = {
      'height': {'min':150, 'max': 185},
      'weight': {'min':50, 'max': 90}
    };
 
  var $grid = $('.grid').isotope({
    itemSelector: '.item',
    layout: 'masonry',
 
    filter: function() {
      var $this = $(this);
      var height = $this.attr('data-height');
      var weight = $this.attr('data-weight');
      var isInHeightRange = (rangeFilters['height'].min <= height && rangeFilters['height'].max >= height);
      var isInWeightRange = (rangeFilters['weight'].min <= weight && rangeFilters['weight'].max >= weight);
      //console.log(rangeFilters['height']);
      //console.log(rangeFilters['weight']);
      // Debug to check whether an item is within the height weight range
      //console.log('isInHeightRange:' +isInHeightRange + '\nisInWeightRange: ' + isInWeightRange );
      return $this.is( buttonFilter ) && (isInHeightRange && isInWeightRange);
    }
  });
 
  // Initialise Sliders
  // Set min/max range on sliders as well as default values
  var $heightSlider = $('#filter-height').slider({ tooltip_split: true, min: 130,  max: 220, range: true, value: [150, 180] });
  var $weightSlider = $('#filter-weight').slider({ tooltip_split: true, min: 40,  max: 150, range: true, value: [50, 90] });
 
  function updateRangeSlider(slider, slideEvt) {
    console.log('Current slider:' + slider);
    var sldmin = +slideEvt.value[0],
        sldmax = +slideEvt.value[1],
        // Find which filter group this slider is in (in this case it will be either height or weight)
        // This can be changed by modifying the data-filter-group="age" attribute on the slider HTML
        filterGroup = slider.attr('data-filter-group'),
        // Set current selection in variable that can be pass to the label
        currentSelection = sldmin + ' - ' + sldmax;
 
      // Update filter label with new range selection
      slider.siblings('.filter-label').find('.filter-selection').text(currentSelection);
 
      // Set min and max values for current selection to current selection
      // If no values are found set min to 0 and max to 100000
      // Store min/max values in rangeFilters array in the relevant filter group
      // E.g. rangeFilters['height'].min and rangeFilters['height'].max
      console.log('Filtergroup: '+ filterGroup);
      rangeFilters[filterGroup] = {
        min: sldmin || 0,
        max: sldmax || 100000
      };
      // Trigger isotope again to refresh layout
      $grid.isotope();
  }
 
  // Trigger Isotope Filter when slider drag has stopped
  $heightSlider.on('slideStop', function(slideEvt){
    var $this =$(this);
    updateRangeSlider($this, slideEvt);
  });
  $weightSlider.on('slideStop', function(slideEvt){
    var $this =$(this);
    updateRangeSlider($this, slideEvt);
  });
 
  // Look inside element with .filters class for any clicks on elements with .btn
  $('.filters').on( 'click', '.btn', function() {
    var $this = $(this);
    // Get group key from parent btn-group (e.g. data-filter-group="color")
    var $buttonGroup = $this.parents('.btn-group');
    var filterGroup = $buttonGroup.attr('data-filter-group');
    // set filter for group
    buttonFilters[ filterGroup ] = $this.attr('data-filter');
    // Combine filters or set the value to * if buttonFilters
    buttonFilter = concatValues( buttonFilters ) || '*';
    // Log out current filter to check that it's working when clicked
    console.log( buttonFilter )
    // Trigger isotope again to refresh layout
    $grid.isotope();
  });
 
  // change is-checked class on btn-filter to toggle which one is active
  $('.btn-group').each( function( i, buttonGroup ) {
      var $buttonGroup = $( buttonGroup );
      $buttonGroup.on( 'click', '.btn-filter', function() {
          $buttonGroup.find('.is-checked').removeClass('is-checked');
          $(this).addClass('is-checked');
      });
  });
});
 
// Flatten object by concatting values
function concatValues( obj ) {
  var value = '';
  for ( var prop in obj ) {
    value += obj[ prop ];
  }
  return value;
}

Добавить новые блоки:
<div class="row">
 <div class="col-sm-4">
            
   <fieldset>
    <h4>Shapes</h4>
    <div class="checkbox">
      <input type="checkbox" value=".square"/>
      <label>Square</label>
    </div>
    <div class="checkbox">
      <input type="checkbox" value=".circle"/>
      <label>Circle</label>
    </div>
    <div class="checkbox"> 
      <input type="checkbox" value=".triangle"/>
      <label>Triangle</label> 
    </div>
  </fieldset>
  
 </div>
 <div class="col-sm-4">
   <fieldset>
    <h4>Colour</h4> 
    <select>  
      <option value=".select">Select</option>
      <option value=".green">Green</option>
      <option value=".blue">Blue</option>
      <option value=".white">White</option>
    </select>
  </fieldset>
 </div>
</div>

Можно похожее на любом другом плагине или jquery.
Заранее всем спасибо!


Часовой пояс GMT +3, время: 14:10.