2

我有 3 个表格,我输入 type="radio" 来选择一个计划。我期望完成的是从这 3 个表单中单击任何计划的标签,使当前单击的标签目标无线电处于活动状态,并将“范围滑块”的位置移动到选择的必要计划。我最大的问题是我不明白,如何将类添加到我会单击的当前项目并将其从所有其他项目中删除?请问有人可以提供线索吗?

这是代码片段。

var selectPlanLabel = document.querySelectorAll('.select-plan__radio');
for (var i = 0; i < selectPlanLabel.length; i++) {
    selectPlanLabel[i].addEventListener('click', changeRadio.bind(null, i));
}

function changeRadio(selected, e) {
    var planLabelActive = document.querySelectorAll('.select-plan__label--active');
    for (var i = 0; i < planLabelActive.length; i++) {
        planLabelActive[i].classList.remove('select-plan__label--active');
    }
    e.target.classList.add('select-plan__label--active');
}
.container {
    max-width: 350px;
    margin: 0 auto;
    padding: 0 15px;
}

.visually-hidden {
    clip: rect(0 0 0 0); 
    clip-path: inset(50%);
    height: 1px;
    overflow: hidden;
    position: absolute;
    white-space: nowrap; 
    width: 1px;
}

.select-plan {
    text-align: center;
    margin-top: 80px;
}

.spacer {
    width: 100%;
}

.spacer-gap--16 {
    padding-bottom: 16px;
}

.spacer-gap--30 {
    padding-bottom: 30px;
}

.select-plan__container {
    display: flex;
    justify-content: space-between;
    position: relative;
}
.select-plan__radio, .select-plan__label {
    display: block;
    cursor: pointer;
}
.select-plan__label {
    z-index: 10;
    flex-grow: 1;
}
.select-plan__radio {
    flex-shrink: 1;
}

.dimensional-container {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
}

.select-plan__range-slider {
    width: 100%;
    position: absolute;
    top: 30%;
    height: 8px;
    border-radius: 20px;
    background: #fff;
    box-shadow: inset 0px 0.820721px 3.28288px rgba(37, 71, 122, 0.25);
    z-index: 1;
}

.select-plan__range-slider::after {
    content: '';
    position: absolute;
    width: 20px;
    height: 20px;
    display: block;
    left: 0;
    top: calc(30% - 10px);
    border-radius: 50%;
    background: #4376A6;
    box-shadow: -0.820721px 0.820721px 1.64144px rgba(0, 0, 0, 0.25);
    z-index: 1;
}
<div class="container">
        <form class="select-plan" action="">
            <div class="select-plan__container">
                <div class="select-plan__range-slider"></div>
                <div class="dimensional-container">
                    <div class="spacer spacer-gap--30"></div>
                    <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="one-month" id="select-month">
                    <label class="select-plan__label" for="select-month">1 month</label>
                </div>
                <div class="dimensional-container">
                    <div class="spacer spacer-gap--30"></div>
                    <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="three-months" id="select-three-month" checked>
                    <label class="select-plan__label select-plan__label--active" for="select-three-month">3 month</label>
                </div>
                <div class="dimensional-container">
                    <div class="spacer spacer-gap--30"></div>
                    <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="twelve-months" id="select-twelve-month">
                    <label class="select-plan__label" for="select-twelve-month">12 month</label>
                </div>
            </div>
            <div class="spacer spacer-gap--16"></div>
            <button class="select-plan__submit" type="submit">Try now</button>
        </form>
        <form class="select-plan" action="">
            <div class="select-plan__container">
                <div class="select-plan__range-slider"></div>
                <div class="dimensional-container">
                    <div class="spacer spacer-gap--30"></div>
                    <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="one-month" id="select-month">
                    <label class="select-plan__label" for="select-month">1 month</label>
                </div>
                <div class="dimensional-container">
                    <div class="spacer spacer-gap--30"></div>
                    <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="three-months" id="select-three-month" checked>
                    <label class="select-plan__label select-plan__label--active" for="select-three-month">3 month</label>
                </div>
                <div class="dimensional-container">
                    <div class="spacer spacer-gap--30"></div>
                    <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="twelve-months" id="select-twelve-month">
                    <label class="select-plan__label" for="select-twelve-month">12 month</label>
                </div>
            </div>
            <div class="spacer spacer-gap--16"></div>
            <button class="select-plan__submit" type="submit">Try now</button>
        </form>
        <form class="select-plan" action="">
            <div class="select-plan__container">
                <div class="select-plan__range-slider"></div>
                <div class="dimensional-container">
                    <div class="spacer spacer-gap--30"></div>
                    <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="one-month" id="select-month">
                    <label class="select-plan__label" for="select-month">1 month</label>
                </div>
                <div class="dimensional-container">
                    <div class="spacer spacer-gap--30"></div>
                    <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="three-months" id="select-three-month" checked>
                    <label class="select-plan__label select-plan__label--active" for="select-three-month">3 month</label>
                </div>
                <div class="dimensional-container">
                    <div class="spacer spacer-gap--30"></div>
                    <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="twelve-months" id="select-twelve-month">
                    <label class="select-plan__label" for="select-twelve-month">12 month</label>
                </div>
            </div>
            <div class="spacer spacer-gap--16"></div>
            <button class="select-plan__submit" type="submit">Try now</button>
        </form>
    </div>

4

1 回答 1

1

您可以通过将滑块指示器移动到每个收音机而不是基于滑块栏来使用 CSS 来做到这一点。

改变

.select-plan__range-slider::after

input.select-plan__radio[type="radio"]:checked+label::before

您需要微调间距。

.container {
    max-width: 350px;
    margin: 0 auto;
    padding: 0 15px;
}

.visually-hidden {
    clip: rect(0 0 0 0); 
    clip-path: inset(50%);
    height: 1px;
    overflow: hidden;
    position: absolute;
    white-space: nowrap; 
    width: 1px;
}

.select-plan {
    text-align: center;
    margin-top: 80px;
}

.spacer {
    width: 100%;
}

.spacer-gap--16 {
    padding-bottom: 16px;
}


.select-plan__container {
    display: flex;
    justify-content: space-between;
    position: relative;
}
.select-plan__radio, .select-plan__label {
    display: block;
    cursor: pointer;
}
.select-plan__label {
    z-index: 10;
    flex-grow: 1;
    display: block;
    height: 48px;
    display: flex;
    flex-direction: column-reverse;
}
.select-plan__radio {
    flex-shrink: 1;
}

.dimensional-container {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
}

.select-plan__range-slider {
    width: 100%;
    position: absolute;
    top: 30%;
    height: 8px;
    border-radius: 20px;
    background: #fff;
    box-shadow: inset 0px 0.820721px 3.28288px rgba(37, 71, 122, 0.25);
    z-index: 1;
}

.select-plan__radio[type="radio"]:checked+label::before {
    content: '';
    position: absolute;
    width: 20px;
    height: 20px;
    display: block;
    top: calc(30% - 10px);
    border-radius: 50%;
    background: #4376A6;
    box-shadow: -0.820721px 0.820721px 1.64144px rgba(0, 0, 0, 0.25);
    z-index: 1;
}

.select-plan__radio[value="one-month"]:checked+label::before {
left: 0%;
background: lightgray;
}
.select-plan__radio[value="three-months"]:checked+label::before {
left: 46.5%;
background: pink;
}
.select-plan__radio[value="twelve-months"]:checked+label::before {
left: 95%;
background: tomato;
}
<div class="container">
  <form class="select-plan" action="">
      <div class="select-plan__container">
          <div class="select-plan__range-slider"></div>
          <div class="dimensional-container">
              <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="one-month" id="select-month">
              <label class="select-plan__label" for="select-month">1 month</label>
          </div>
          <div class="dimensional-container">
              <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="three-months" id="select-three-month" checked>
              <label class="select-plan__label select-plan__label--active" for="select-three-month">3 month</label>
          </div>
          <div class="dimensional-container">
              <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="twelve-months" id="select-twelve-month">
              <label class="select-plan__label" for="select-twelve-month">12 month</label>
          </div>
      </div>
      <div class="spacer spacer-gap--16"></div>
      <button class="select-plan__submit" type="submit">Try now</button>
  </form>
  <form class="select-plan" action="">
      <div class="select-plan__container">
          <div class="select-plan__range-slider"></div>
          <div class="dimensional-container">
              <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="one-month" id="select-month2">
              <label class="select-plan__label" for="select-month2">1 month</label>
          </div>
          <div class="dimensional-container">
              <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="three-months" id="select-three-month2" checked>
              <label class="select-plan__label select-plan__label--active" for="select-three-month2">3 month</label>
          </div>
          <div class="dimensional-container">
              <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="twelve-months" id="select-twelve-month2">
              <label class="select-plan__label" for="select-twelve-month2">12 month</label>
          </div>
      </div>
      <div class="spacer spacer-gap--16"></div>
      <button class="select-plan__submit" type="submit">Try now</button>
  </form>
  <form class="select-plan" action="">
      <div class="select-plan__container">
          <div class="select-plan__range-slider"></div>
          <div class="dimensional-container">
              <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="one-month" id="select-month3">
              <label class="select-plan__label" for="select-month3">1 month</label>
          </div>
          <div class="dimensional-container">
              <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="three-months" id="select-three-month3" checked>
              <label class="select-plan__label select-plan__label--active" for="select-three-month3">3 month</label>
          </div>
          <div class="dimensional-container">
              <input class="select-plan__radio visually-hidden" type="radio" name="select-month" value="twelve-months" id="select-twelve-month3">
              <label class="select-plan__label" for="select-twelve-month3">12 month</label>
          </div>
      </div>
      <div class="spacer spacer-gap--16"></div>
      <button class="select-plan__submit" type="submit">Try now</button>
  </form>
</div>

于 2021-05-10T11:26:51.727 回答