javascript - 从数组中取回正确的索引值

标签 javascript

我必须以圆形显示数组值,并且它必须永远循环运行。逆时针旋转圆圈时一切正常。但是当我们向相反方向移动圆圈时会出现问题。

我在方向盘上有一个事件元素。因此,当您用户点击任何其他幻灯片然后激活它时,它会计算点击幻灯片和事件幻灯片之间的差异,然后相应地添加和删除滚轮中的项目。

所以基本上它从数组中选取值。如果你顺时针移动圆圈,它会从数组后面选取值,如果你逆时针移动它,它会开始从下一个可用的值中选取值。如果在首页加载中呈现 11 个项目,那么它将开始从 12 个无索引中获取值。

当您单击事件元素上方位置的项目然后再次逆时针旋转它时,就会出现问题。

假设您点击商品编号。 8 然后单击第 7 项。在这种情况下,应该将 2 号项目添加到轮子中。

这里是 fiddle .

var numberOfElement = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30];
var initialRender = numberOfElement.slice(0, 11);
var startPoint = initialRender.length;
var endPoint = numberOfElement.length;

function generateHtml() {
  var html = '';
  initialRender.forEach(function(item, index) {
    var angle = 18 * (index);
    var className = angle === 90 ? 'active' : '';
    html += '<div class="shapes ' + className + '" data-deg="' + angle + '" style="--deg:' + angle + 'deg;"> <span class="set-pos">' + (item) + '</span> <span> ' + angle + ' deg </span></div>';
  })
  document.querySelector('#dynamic-html').innerHTML = html;
}

generateHtml();

$('#dynamic-html').on('click', '.shapes', function() {
  var deg = 90;
  var activeDeg = $('.active').data('deg');
  var needToremoveElement = activeDeg;
  var selectedElement = $(this).data('deg');
  var degrees = deg - selectedElement;
  var diff = Math.abs((activeDeg - selectedElement) / 18);
  $('.shapes').removeClass('active');
  $(this).addClass('active');
  var movementCloseWise = degrees > ($('.circle').data('deg') || 0);
  $('.circle').removeData('deg');
  $('.circle').css({
    'transform': 'rotate(' + degrees + 'deg)'
  }).attr('data-deg', degrees);
  if (movementCloseWise) {
    var itemLength = $('.shapes').length;
    $('.shapes:gt(' + ((itemLength - 1) - diff) + ')').remove()

    var newItems = generateItem(getItemsFromBack(diff), true);
    newItems = $(newItems).get().reverse();
    $('#dynamic-html').prepend(newItems)
    startPoint -= diff;
  } else {
    var newItems = generateItem(getItemFromStart(diff), false)
    $('#dynamic-html').append(newItems)
    $('.shapes:lt(' + (diff) + ')').remove()
    endPoint += diff;
  }

})



function getItemsFromBack(length) {
  var values = [];
  endPoint = endPoint - length;
  if (endPoint < 0) {
    endPoint = numberOfElement.length - Math.abs(endPoint)
    var otherVal = 0;
    if (endPoint + length >= numberOfElement.length) {
      otherVal = (endPoint + length) - numberOfElement.length;
      values = numberOfElement.slice(endPoint, numberOfElement.length)
    }
    if (otherVal > 0) {
      values = values.concat(numberOfElement.slice(0, otherVal))
    }
  } else {
    values = numberOfElement.slice(endPoint, endPoint + length)
  }
  var valuesCount = values.length;
  return values.reverse();
}

function getItemFromStart(length) {
  var values = numberOfElement.slice(startPoint, startPoint + length);
  var valueCount = values.length;
  startPoint += valueCount;
  if (valueCount < length) {
    startPoint = 0;
    return values.concat(getItemFromStart(length - valueCount));
  } else if (startPoint >= numberOfElement.length) {
    startPoint = 0;
  }

  return values;
}

function generateItem(items, isClockWise) {
  var html = "",
    lastItemAngle;
  if (isClockWise) {
    lastItemAngle = $('#dynamic-html .shapes:first').data('deg');
  } else {
    lastItemAngle = $('#dynamic-html .shapes:last').data('deg');
  }

  items.forEach(function(item, index) {
    if (isClockWise) {
      var angles = lastItemAngle - (18 * (index + 1))
    } else {
      var angles = lastItemAngle + (18 * (index + 1))
    }
    html += '<div class="shapes" data-deg="' + (angles) + '" style="--deg:' + angles + 'deg;"> <span class="set-pos">' + (item) + '</span> <span>   ' + angles + ' deg </span></div>';
  });

  return html;
}

最佳答案

我认为您的问题只是您的endPoint 初始化值。在你的代码中,你将它初始化为 var endPoint = numberOfElement.length; 这是错误的(我认为)并且它应该被初始化 0;我改变了它,它起作用了:

var numberOfElement = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30];
    	var initialRender = numberOfElement.slice(0,11);
    	var startPoint = initialRender.length;
    	var endPoint = 0; /* here is the change */
    	function generateHtml(){
    		var html ='';
    		initialRender.forEach(function(item,index){
    			var angle = 18 * (index);
    			var className = angle === 90? 'active':'';
    			html+='<div class="shapes '+className+'" data-deg="'+angle+'" style="--deg:'+angle+'deg;"> <span class="set-pos">'+(item)+'</span> <span>	'+angle+' deg </span></div>';
    		})
    		document.querySelector('#dynamic-html').innerHTML= html;
    	}

		generateHtml();
		
    	$('#dynamic-html').on('click','.shapes',function(){
    		var deg = 90;
    		var activeDeg = $('.active').data('deg');
    		var needToremoveElement = activeDeg;
    		var selectedElement = $(this).data('deg');
    		var degrees = deg - selectedElement;
    		var diff = Math.abs((activeDeg - selectedElement) / 18);
    		$('.shapes').removeClass('active');
    		$(this).addClass('active');
    		var movementCloseWise = degrees > ($('.circle').data('deg') || 0);
    		$('.circle').removeData('deg');
    		$('.circle').css({'transform' : 'rotate('+ degrees +'deg)'}).attr('data-deg',degrees);
    		if(movementCloseWise){
    			var itemLength = $('.shapes').length;
    			$('.shapes:gt('+((itemLength-1)-diff)+')').remove()

    			var newItems = generateItem(getItemsFromBack(diff), true);
    			newItems =  $(newItems).get().reverse();
    			$('#dynamic-html').prepend(newItems)
    			startPoint -= diff;
    		}else{
    			var newItems = generateItem(getItemFromStart(diff), false)
    			$('#dynamic-html').append(newItems)
    			$('.shapes:lt('+(diff)+')').remove()
    			endPoint += diff;
    		}
    			
    	})


    	
		function getItemsFromBack(length) {
		   var values = [];
		  endPoint = endPoint - length;
		  if (endPoint < 0) {
		    endPoint = numberOfElement.length - Math.abs(endPoint)
		    var otherVal = 0;
		    if (endPoint + length >= numberOfElement.length) {
		      otherVal = (endPoint + length) - numberOfElement.length;
		      values = numberOfElement.slice(endPoint, numberOfElement.length)
		    }
		    if (otherVal > 0) {
		      values = values.concat(numberOfElement.slice(0, otherVal))
		    }
		  } else {
		    values = numberOfElement.slice(endPoint, endPoint + length)
		  }
		  var valuesCount = values.length;
		  return values.reverse();
		}

    	function getItemFromStart(length) {
		    var values = numberOfElement.slice(startPoint, startPoint + length);
		    var valueCount = values.length;
    		startPoint += valueCount;
		    if (valueCount < length) {
		        startPoint = 0;
		        return values.concat( getItemFromStart(length - valueCount) );
		    } else if (startPoint >= numberOfElement.length) {
		        startPoint = 0;
		    }

		    	return values;
			}

		function generateItem (items, isClockWise){
			var html = "", lastItemAngle;	
			if(isClockWise){
				lastItemAngle = $('#dynamic-html .shapes:first').data('deg');	
			}
			else{
			    lastItemAngle = $('#dynamic-html .shapes:last').data('deg');		
			}
			
			items.forEach(function(item,index){
				if(isClockWise){
					var angles = lastItemAngle - (18 * (index +1))
				}
				else{
					var angles = lastItemAngle + (18 * (index +1))	
				}
    			html+='<div class="shapes" data-deg="'+(angles)+'" style="--deg:'+angles+'deg;"> <span class="set-pos">'+(item)+'</span> <span>	'+angles+' deg </span></div>';
    		});

    		return html;
		}
.main{
    	display: flex;
    	justify-content: center;
    	align-items: center;
    	height: 500px;
    }
    .pos{
		height:150px;
		width:150px;
		position: relative;
    }
	.circle{
		background: red;
		height:150px;
		width:150px;
		border-radius: 50%;
		transition: transform 0.3s ease-in-out;
	}
	.shapes{
		position: absolute;
		top:calc(50% - 75px);
		left:calc(50% - 10px);
		width: 20px;
	    height: 150px;
	    transform: rotate(var(--deg)) translate(0, 160px); 
	    background: green;
	    text-align: center;
	}

	.fake-overlay{
    position: absolute;
    width: 203%;
    height: 320%;
    background: #fff;
    top: -160px;
    right: -148%;
    display: none
    
	}
	.active{
		background: red
	}
	.set-pos{
		position: absolute;
		bottom: 0
	}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="main">
  		<div class="pos">
	  		<div class="circle">
	  			<div id="dynamic-html"></div>
	  		</div>
	  		<div class="fake-overlay"></div>
  		</div>
  	</div>

这里是 Jsfiddle

关于javascript - 从数组中取回正确的索引值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50565083/

相关文章:

javascript - 动态添加选项(tokenize.js)

javascript - 在 NodeJS 中使用 MySQL 的 Passportjs

javascript - 为什么可以使用数组表示法访问对象?当属性名称是变量时,为什么需要数组表示法?

javascript - 将不重叠的段分组并保持良好的顺序

javascript - 使用 Handlebars.js 模板

javascript - jQuery - 循环遍历 div 从一个链接中提取 url,然后将其添加到另一个链接

javascript - Bootstrap 导航栏中的模式

javascript - 创建 Cycle.js 可重用模块

javascript - 使用 JS/jQuery 过滤 PDO 和 MySQL 查询

javascript - 为什么带有 onclick 的按钮内的 img 不触发脚本?