【问题标题】:Active border (.showBorder) centered under text as it moves活动边框 (.showBorder) 在文本移动时居中
【发布时间】:2025-12-22 17:40:11
【问题描述】:

// Get references to the two sets of boxes
var numbers = document.querySelectorAll(".clicked");
var letters = document.querySelectorAll(".border");

// Turn each node list into proper arrays:
numbers = Array.prototype.slice.call(numbers);
letters = Array.prototype.slice.call(letters);

// Loop through all the number boxes
numbers.forEach(function(box, index) {

  // Set up the click event handlers for all the number boxes
  box.addEventListener("click", function() {

    // Remove borders from each of the letter boxes
    letters.forEach(function(box) {
      box.classList.remove("showBorder");
    });

    // Apply the border to only the one clicked element
    var info = document.getElementsByClassName('box-tip')[0];
    info.style.left = 10 + (index * 45) + 'px';
    info.style.visibility = 'visible';
    letters[index].classList.add("showBorder");
  });

});

$(document).on("click", '.clicked', function(){
    $('.clicked').removeClass('selected');
    $(this).addClass('selected');
});
.list-box li {display: inline-block;list-style-type: none;padding: 1em;background:red;}
.list-box {margin:15px auto;padding:0;}
.box-sleeve li {display: inline-block;list-style-type: none;padding: 1em;background:red;}
.box-sleeve {margin:15px auto;padding:0;}
.showBorder { border: 3px dashed black; }

.box-tip {
  display:inline;
  margin: auto;
	position: relative;
	visibility: hidden; 
 }

.numberCircle {
  border-radius: 50%;
  font-size: 12px;
  border: 5px solid #000;
  color: #fff;
  background: #000;
}

.numberCircle span {
  text-align: center;
  display: block;
}

li.selected {color:#fff;background-color:#000;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="list-box">
  <li class="clicked">1</li>
  <li class="clicked">2</li>
  <li class="clicked">3</li>
  <li class="clicked">4</li>
  <li class="clicked">5</li>
  <li class="clicked">6</li>
  <li class="clicked">7</li>
  <li class="clicked">8</li>
</ul>
<div class="box-tip">
  <span class="info">Regular length for your collar size</span>
  <span class="numberCircle">?</span>
</div>
<ul class="box-sleeve">
  <li class="border">a</li>
  <li class="border">b</li>
  <li class="border">c</li>
  <li class="border">d</li>
  <li class="border">e</li>
  <li class="border">f</li>
  <li class="border">g</li>
  <li class="border">h</li>
</ul>

随着文本的移动,活动信箱 (.showBorder) 需要位于文本“您​​的衣领尺寸的常规长度”的中心。文本起始位置应与当前一样左对齐。为了与边界框居中,它只需要在点击字母“C”时才开始移动。欢迎所有建议。这是我的代码:

// Get references to the two sets of boxes
var numbers = document.querySelectorAll(".click");
var letters = document.querySelectorAll(".border");

// Turn each node list into proper arrays:
numbers = Array.prototype.slice.call(numbers);
letters = Array.prototype.slice.call(letters);

// Loop through all the number boxes
numbers.forEach(function(box, index) {

  // Set up the click event handlers for all the number boxes
  box.addEventListener("click", function() {

    // Remove borders from each of the letter boxes
    letters.forEach(function(box) {
      box.classList.remove("showBorder");
    });

    // Apply the border to only the one clicked element
    var info = document.getElementsByClassName('box-tip')[0];
    info.style.left = 10 + (index * 45) + 'px';
    info.style.visibility = 'visible';
    letters[index].classList.add("showBorder");
  });

});
.list-box li {display: inline-block;list-style-type: none;padding: 1em;background:red;}
.list-box {margin:50px auto;padding:0;}
.box-sleeve li {display: inline-block;list-style-type: none;padding: 1em;background:red;}
.box-sleeve {margin:50px auto;padding:0;}
.showBorder { border: 3px dashed black; }

.box-tip {
  display:inline;
  margin: auto;
	position: relative;
	visibility: hidden; 
 }

.numberCircle {
  border-radius: 50%;
  font-size: 12px;
  border: 5px solid #000;
  color: #fff;
  background: #000;
}

.numberCircle span {
  text-align: center;
  display: block;
}
<ul class="list-box">
  <li class="click">1</li>
  <li class="click">2</li>
  <li class="click">3</li>
  <li class="click">4</li>
  <li class="click">5</li>
  <li class="click">6</li>
  <li class="click">7</li>
  <li class="click">8</li>
</ul>
<div class="box-tip">
  <span class="info">Regular length for your collar size</span>
  <span class="numberCircle">?</span>
</div>
<ul class="box-sleeve">
  <li class="border">a</li>
  <li class="border">b</li>
  <li class="border">c</li>
  <li class="border">d</li>
  <li class="border">e</li>
  <li class="border">f</li>
  <li class="border">g</li>
  <li class="border">h</li>
</ul>

【问题讨论】:

    标签: javascript jquery arrays user-interface jquery-ui


    【解决方案1】:

    而不是info.style.left = 10 + (index * 45) + 'px';

     if (index > 2) {
      info.style.left = 10 + ((index - 3) * 45) + 'px';
    }
    else {
    info.style.left = 0 + 'px';
    }
    

    这是它的小提琴:https://jsfiddle.net/flish/fm6821d5/ 现已更新,效果更好

    【讨论】:

    • 很好的答案。唯一的缺陷是当我点击回到数字 1 时,文本不会回到起始位置。知道如何实现吗?
    • 是的。我没想到。
    • 啊,我明白了。传奇!
    • 还有一件事 - 如果字段 .marimea 已被预先选择或记住在不同的页面上,并且用户再次登陆此页面并选择了该字段,我怎样才能使边框显示在相关信?
    • 首先 .marimea 只是为了摆脱 .click 类。随意改回来,尽管用动作命名一个类是非常不可取的(当有数百行 javascript 时,名称为 click、blur、submit、keydown 等的类只会让你感到困惑)。对于传递变量,请参阅:quirksmode.org/js/cookies.html 作为 cookie 的快速指南。事实上在这里看到这个问题和答案:*.com/questions/404891/…