【问题标题】:Style pseudo list elements by id after creation创建后按 id 样式化伪列表元素
【发布时间】:2021-10-05 09:20:38
【问题描述】:

我有一个动态生成的垂直时间线,其中包含 <li> 元素和 ::after 伪类。

我的目标是,在创建时间线后,为某些圆形元素设置样式(仅更改圆形本身的颜色)。我不明白为什么事后不能将类添加到每个特定元素。

用@RCC 的回答编辑:以下代码选择了元素,但最终不会改变颜色 - 是否有一种解决方法可以使用 Javascript 设置特定列表元素的 ::after 类的样式?任何建议将不胜感激!

myArr = ['elem1', 'elem3', 'elem8']

 for (var i = 0; i < myArr.length; i++) {

var elem=document.getElementById(myArr[i])
console.log(elem)
elem.className += ".timeline ul li.newstyle::after {background:#3887be}";

}
*,
*::before,
*::after {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  font: normal 16px/1.5 "Helvetica Neue", sans-serif;
  background: #ffffff;
  color: #404040;
  overflow-x: hidden;
  padding-bottom: 50px;
}  


/* INTRO SECTION
–––––––––––––––––––––––––––––––––––––––––––––––––– */

.intro {
  background: #FFFFFF;
  padding: 100px 0;
}

.container {
  width: 90%;
  max-width: 1200px;
  margin: 0 auto;
  text-align: center;
}

h1 {
  font-size: 2.5rem;
}


/* TIMELINE
–––––––––––––––––––––––––––––––––––––––––––––––––– */
.timeline ul li {
  list-style-type: none;
  position: relative;
  width: 6px;
  margin: 0 auto;
  padding-top: 50px;
  background: #404040;
}

.timeline ul li::after {
  content: '';
  position: absolute;
  left: 50%;
  bottom: 0;
  transform: translateX(-50%);
  width: 30px;
  height: 30px;
  border-radius: 50%;
  background: inherit;
}

.timeline ul li div {
  position: relative;
  bottom: 0;
  width: 400px;
  padding: 15px;
  background: #FFFFFF;
}

.timeline ul li div::before {
  content: '';
  position: absolute;
  bottom: 7px;
  width: 0;
  height: 0;
  border-style: solid;
}

.timeline ul li:nth-child(odd) div {
  left: 45px;
}

.timeline ul li:nth-child(odd) div::before {
  left: -15px;
  border-width: 8px 16px 8px 0;
  border-color: transparent transparent transparent transparent;
}

.timeline ul li:nth-child(even) div {
  left: -439px;
}

.timeline ul li:nth-child(even) div::before {
  right: -15px;
  border-width: 8px 0 8px 16px;
    border-color: transparent transparent transparent transparent;
}

/* LEFT JUSTIFY
–––––––––––––––––––––––––––––––––––––––––––––––––– */

.timeline ul li {
    margin-left: 20px;
  }
  
  .timeline ul li div {
    width: calc(100vw - 91px);
  }
  
  .timeline ul li:nth-child(even) div {
    left: 45px;
  }
  
  .timeline ul li:nth-child(even) div::before {
    left: -15px;
    border-width: 8px 16px 8px 0;

  }
<section class="intro">
  <div class="container">
    <h1>Vertical Timeline &darr;</h1>
  </div>
</section>

<section class="timeline">
  <ul>
    <li id='elem1'>
      <div>
        <time>1934</time> At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium
      </div>
    </li>
    <li id='elem2'>
      <div>
        <time>1937</time> Proin quam velit, efficitur vel neque vitae, rhoncus commodo mi. Suspendisse finibus mauris et bibendum molestie. Aenean ex augue, varius et pulvinar in, pretium non nisi.
      </div>
    </li>
    <li id='elem3'>
      <div>
        <time>1940</time> Proin iaculis, nibh eget efficitur varius, libero tellus porta dolor, at pulvinar tortor ex eget ligula. Integer eu dapibus arcu, sit amet sollicitudin eros.
      </div>
    </li>
    <li id='elem4'>
      <div>
        <time>1943</time> In mattis elit vitae odio posuere, nec maximus massa varius. Suspendisse varius volutpat mattis. Vestibulum id magna est.
      </div>
    </li>
    <li id='elem5'>
      <div>
        <time>1946</time> In mattis elit vitae odio posuere, nec maximus massa varius. Suspendisse varius volutpat mattis. Vestibulum id magna est.
      </div>
    </li>
    <li id='elem6'>
      <div>
        <time>1956</time> In mattis elit vitae odio posuere, nec maximus massa varius. Suspendisse varius volutpat mattis. Vestibulum id magna est.
      </div>
    </li>
    <li id='elem7'>
      <div>
        <time>1957</time> In mattis elit vitae odio posuere, nec maximus massa varius. Suspendisse varius volutpat mattis. Vestibulum id magna est.
      </div>
    </li>
    <li id='elem8'>
      <div>
        <time>1967</time> Aenean condimentum odio a bibendum rhoncus. Ut mauris felis, volutpat eget porta faucibus, euismod quis ante.
      </div>
    </li>
  </ul>
</section>

【问题讨论】:

    标签: javascript css css-selectors html-lists pseudo-element


    【解决方案1】:

    试试这个:

    var myArr = ['elem1', 'elem3', 'elem8'];
    
    for (var i = 0; i < myArr.length; i++) { // "i" is the index!
      var elem = document.getElementById( myArr[i] ); // "myArr[i]" to get the item
      elem.className += " newstyle";
    }
    

    另外,请在变量声明之前放置var

    并在 CSS 上添加新类:

    .timeline ul li.newstyle::after {background:#3887be}
    

    检查: https://jsfiddle.net/rcheruti/qeb1yzu0/6/

    【讨论】:

    • 谢谢!但是我更新了答案,因为我忘记了 for 循环中的变量名 - 实际错误是 elem.addClass is not a function
    • 是的,我也更新了,使用 o "elem.className += ' newClassToAdd' " 对你有用吗?
    • 感谢您的回答 - 我已经尝试过了 - 现在没有错误,但伪元素不会改变颜色!
    • 您添加了新的 CSS 样式?另请注意,elem.className += " newstyle"; 在 de 字符串之前有一个空格
    • 是的,这行得通!
    【解决方案2】:

    这边

    添加到你的CSS

    .timeline ul li.newStyle::after { /* TIMELINE + newStyle –––– */
      background  :#3887be;   
      }
    

    改变你的 JS :

    const myArr = ['elem1', 'elem3', 'elem8']
    
    myArr.forEach( el =>
      document.getElementById(el).classList.add('newStyle')
      )
    *,
    *::before,
    *::after {
      margin     : 0;
      padding    : 0;
      box-sizing : border-box;
      }
    body {
      font           : normal 16px/1.5 "Helvetica Neue", sans-serif;
      background     : #ffffff;
      color          : #404040;
      overflow-x     : hidden;
      padding-bottom : 50px;
      }
    /* INTRO SECTION –––––––––––––––––––––––––––––––––––––––––––––––––– */
    .intro {
      background : #FFFFFF;
      padding    : 100px 0;
      }
    .container {
      width     : 90%;
      max-width : 1200px;
      margin    : 0 auto;
      text-align : center;
      }
    h1 {
      font-size : 2.5rem;
      }
    /* TIMELINE–––––––––––––––––––––––––––––––––––––––––––––––––– */
    .timeline ul li {
      list-style-type : none;
      position        : relative;
      width           : 6px;
      margin          : 0 auto;
      padding-top     : 50px;
      background      : #404040;
      }
    .timeline ul li::after {
      content       : '';
      position      : absolute;
      left          : 50%;
      bottom        : 0;
      transform     : translateX(-50%);
      width         : 30px;
      height        : 30px;
      border-radius : 50%;
      background    : inherit;
      }
    .timeline ul li.newStyle::after { /* TIMELINE + newStyle –––– */
      background  :#3887be;   
      }
    .timeline ul li div {
      position   : relative;
      bottom     : 0;
      width      : 400px;
      padding    : 15px;
      background : #FFFFFF;
      }
    .timeline ul li div::before {
      content      : '';
      position     : absolute;
      bottom       : 7px;
      width        : 0;
      height       : 0;
      border-style : solid;
      }
    .timeline ul li:nth-child(odd) div {
      left : 45px;
      }
    .timeline ul li:nth-child(odd) div::before {
      left         : -15px;
      border-width : 8px 16px 8px 0;
      border-color : transparent transparent transparent transparent;
      }
    .timeline ul li:nth-child(even) div {
      left : -439px;
      }
    .timeline ul li:nth-child(even) div::before {
      right        : -15px;
      border-width : 8px 0 8px 16px;
      border-color : transparent transparent transparent transparent;
      }
    /* LEFT JUSTIFY–––––––––––––––––––––––––––––––––––––––––––––––––– */
    .timeline ul li {
      margin-left  : 20px;
      }
    .timeline ul li div {
      width        : calc(100vw - 91px);
      }
    .timeline ul li:nth-child(even) div {
      left         : 45px;
      }
    .timeline ul li:nth-child(even) div::before {
      left         : -15px;
      border-width : 8px 16px 8px 0;
      }
      <section class="intro">
        <div class="container">
          <h1>Vertical Timeline &darr;</h1>
        </div>
      </section>
      
      <section class="timeline">
        <ul>
          <li id='elem1'>
            <div>
              <time>1934</time> At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium
            </div>
          </li>
          <li id='elem2'>
            <div>
              <time>1937</time> Proin quam velit, efficitur vel neque vitae, rhoncus commodo mi. Suspendisse finibus mauris et bibendum molestie. Aenean ex augue, varius et pulvinar in, pretium non nisi.
            </div>
          </li>
          <li id='elem3'>
            <div>
              <time>1940</time> Proin iaculis, nibh eget efficitur varius, libero tellus porta dolor, at pulvinar tortor ex eget ligula. Integer eu dapibus arcu, sit amet sollicitudin eros.
            </div>
          </li>
          <li id='elem4'>
            <div>
              <time>1943</time> In mattis elit vitae odio posuere, nec maximus massa varius. Suspendisse varius volutpat mattis. Vestibulum id magna est.
            </div>
          </li>
          <li id='elem5'>
            <div>
              <time>1946</time> In mattis elit vitae odio posuere, nec maximus massa varius. Suspendisse varius volutpat mattis. Vestibulum id magna est.
            </div>
          </li>
          <li id='elem6'>
            <div>
              <time>1956</time> In mattis elit vitae odio posuere, nec maximus massa varius. Suspendisse varius volutpat mattis. Vestibulum id magna est.
            </div>
          </li>
          <li id='elem7'>
            <div>
              <time>1957</time> In mattis elit vitae odio posuere, nec maximus massa varius. Suspendisse varius volutpat mattis. Vestibulum id magna est.
            </div>
          </li>
          <li id='elem8'>
            <div>
              <time>1967</time> Aenean condimentum odio a bibendum rhoncus. Ut mauris felis, volutpat eget porta faucibus, euismod quis ante.
            </div>
          </li>
        </ul>
      </section>

    【讨论】:

      【解决方案3】:

      我想你忘记在数组中查找字符串值了。

      试试elem=document.getElementById(myArr[i])

      【讨论】:

      • 是的,感谢您的关注!但是存在addClass函数不存在的错误。更新问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 2017-11-14
      • 2018-01-01
      • 1970-01-01
      • 2019-10-20
      • 2021-02-15
      • 2020-09-07
      相关资源
      最近更新 更多