【问题标题】:CSS class add/remove no longer working || vanilla JSCSS 类添加/删除不再起作用 ||香草JS
【发布时间】:2021-09-30 18:32:09
【问题描述】:

所以之前我请你帮忙在单击容器 div 时执行一个行为,说 div 会改变高度,再次单击它会使其恢复正常,就像单击同级容器 div 一样。

我还添加了代码,当点击上述div时,里面的img会改变data-src。 这个 img div(不是容器)有一个只是文本的兄弟。它会通过css改变状态,当点击容器div时,有点像容器div本身。

在添加data-src更改的代码时,我失去了这个能力,无法找出原因。 你能帮帮我吗?

这是我的代码:

const allImages = document.querySelectorAll('.containertira .imgclasstosize');
const allContainers = document.querySelectorAll('.containertira');
allContainers.forEach(el => {
    el.addEventListener('click', function(event) {
      const thisImg = el.querySelector('.imgclasstosize');
      const thisTxt = el.querySelector('.centered');
      const sibling = thisImg.nextElementSibling; // Get the next sibiling
      const bigSrc = thisImg.dataset.srcBig;

      const allOtherImages = Array.from(allImages).filter(img => {
        return img !== thisImg;
      });

      const isBig = thisImg.classList.contains('big');
      1

      if (isBig) {
        thisImg.classList.remove('big');
        thisTxt.classList.remove('left');
        // reset to the small image URL
        thisImg.src = thisImg.dataset.smallSrc;
      } else {
        // save the small image URL first:
        if (!thisImg.dataset.smallSrc) {
          thisImg.dataset.smallSrc = thisImg.src;
        }
        // change to the big image URL:
        thisImg.src = bigSrc;
        thisImg.classList.add('big');
        thisTxt.classList.add('left');
        sibling.classList.remove('hide');
      }

      allOtherImages.forEach(img => {
        img.classList.remove('big');
        // reset to the small image URL
        if (img.dataset.smallSrc) {
          img.src = img.dataset.smallSrc;
        }
        img.nextElementSibling.classList[isBig ? 'remove' : 'add']("hide");
      });
    });
  }

);
.imgclasstosize{
    width: 100%;
    object-fit: cover;
    position: relative;
}

img.imgclasstosize {
    height: 80px;
    border: 1px solid gray;
    transition : 1.5s all ease;
}

img.imgclasstosize.big {
    height: 100%;
    transition: 1.5s all ease;
    width: 70vw;
    margin-left: auto;
}

.containertira {
    position: relative;
    text-align: center;
    color: white;
    display: flex;
    justify-content: space-between;
  }
  
  .imgclasstosize {
    transition: all ease 0.5s;
  }
  
  .imgclasstosize.big {
    /* transform: scale(1.1);  */
  }
  
  .centered {
    opacity: 1;
    transition: all ease 0.5s;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    font-family: 'blacker_pro_displayregular';
    padding-top: 10px;
    /* background: linear-gradient(90deg, rgba(33,37,41,1) 0%, rgba(255,255,255,0) 50%); */
    color: white;
    padding-left: 10px;
    padding-bottom: 6.5px;
    font-size: 5vh;
    display:block;
    pointer-events: none;
}

@media screen and (max-width: 960px) {.centered {font-size: 4.6vh;}}
@media screen and (max-width: 500px) {.centered {font-size: 3.5vh;}}
@media screen and (max-width: 375px) {.centered {font-size: 3vh;}}

  .centered.left{
    top: 0%;
    left: 0%;
    transform: translate(0%, 0%);
    color: black;
    padding-left: 10px;
    padding-bottom: 6.5px;
    transition: all ease 0.5s;
    font-size: 7vh;
   }

  
  .imgclasstosize.big+.centered.hide {
    opacity: 0;
  }
<div class="containertira">
  <img id="primeiraimagem" class="imgclasstosize" src="//images.impresa.pt/expresso/2021-07-23-1---Minho.png-0c586cc8" data-src-big="//images.impresa.pt/expresso/2021-07-23-960px_minho.png-3938db2f">
  <div class="centered">Minho</div>
</div>

<br>

<div class="containertira">
  <img id="primeiraimagem" class="imgclasstosize" src="//images.impresa.pt/expresso/2021-07-23-1---Minho.png-0c586cc8" data-src-big="//images.impresa.pt/expresso/2021-07-23-960px_minho.png-3938db2f">
  <div class="centered">Minho</div>
</div>

大家好。

【问题讨论】:

  • 我把你的JS变成了栈sn-p。你能把 HTML 和 CSS 添加到它上面以便执行吗?
  • 更新了!感谢您的意见

标签: javascript html arrays dom events


【解决方案1】:

我似乎无法重现您的错误。尝试复制您的代码并将其粘贴到单独的 HTML 文件中,一切正常。

如果您执行这个 sn-p 并查看控制台,您将看到类和属性正在根据您的代码进行相应的更改。

也许您的代码在某个库之前执行,导致它无法执行某些内容?

const allImages = document.querySelectorAll('.containertira .imgclasstosize');
const allContainers = document.querySelectorAll('.containertira');
allContainers.forEach(el => {
    el.addEventListener('click', function(event) {
      const thisImg = el.querySelector('.imgclasstosize');
      const thisTxt = el.querySelector('.centered');
      const sibling = thisImg.nextElementSibling; // Get the next sibiling
      const bigSrc = thisImg.dataset.srcBig;

      const allOtherImages = Array.from(allImages).filter(img => {
        return img !== thisImg;
      });

      const isBig = thisImg.classList.contains('big');
      1

      if (isBig) {
        thisImg.classList.remove('big');
        thisTxt.classList.remove('left');
        // reset to the small image URL
        thisImg.src = thisImg.dataset.smallSrc;
      } else {
        // save the small image URL first:
        if (!thisImg.dataset.smallSrc) {
          thisImg.dataset.smallSrc = thisImg.src;
        }
        // change to the big image URL:
        thisImg.src = bigSrc;
        thisImg.classList.add('big');
        thisTxt.classList.add('left');
        sibling.classList.remove('hide');
      }

      allOtherImages.forEach(img => {
        img.classList.remove('big');
        // reset to the small image URL
        if (img.dataset.smallSrc) {
          img.src = img.dataset.smallSrc;
        }
        img.nextElementSibling.classList[isBig ? 'remove' : 'add']("hide");
      });
    });
  }

);
.containertira {border:1px black solid;}
<div class="containertira">
  <img id="primeiraimagem" class="imgclasstosize" src="img/Tiras/1 - Minho.png" data-src-big="img/INFO joao/joao 2/joao 2/960 px/960px_minho.png">
  <div class="centered">Minho</div>
</div>

<div class="containertira">
  <img id="primeiraimagem" class="imgclasstosize" src="img/Tiras/1 - Minho.png" data-src-big="img/INFO joao/joao 2/joao 2/960 px/960px_minho.png">
  <div class="centered">Minho2</div>
</div>

<div class="containertira">
  <img id="primeiraimagem" class="imgclasstosize" src="img/Tiras/1 - Minho.png" data-src-big="img/INFO joao/joao 2/joao 2/960 px/960px_minho.png">
  <div class="centered">Minho3</div>
</div>

<div class="containertira">
  <img id="primeiraimagem" class="imgclasstosize" src="img/Tiras/1 - Minho.png" data-src-big="img/INFO joao/joao 2/joao 2/960 px/960px_minho.png">
  <div class="centered">Minho4</div>
</div>

【讨论】:

  • 我更新了我的代码,让它在片段上运行。正如您所看到的,当我单击一个容器然后再次单击它时,“居中”上的文本变为黑色并向左移动,当我再次单击同一个容器时,它恢复正常。这应该与我单击一个容器然后单击另一个容器时的行为相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多