<div> 间接更改大小时不会触发转换

<div> transition not triggering when size is changed indirectly

我的站点中有一个部分显示了四个不同的促销缩略图。

有一个信息 div 显示了有关促销的更多信息。

Thumbs 有一个 onclick,它调用 javascript 中的函数更新信息 div 中当前显示的文本。

我在 CSS 中声明我希望对信息 div 进行 0.3 转换,它已应用但不会因 [=36= 中的文本更改而触发].当然,有些宣传片的内容比其他宣传片多。

我的想法是,我希望信息 div 在查看促销活动时过渡高度,而不是高度的平缓变化。

该网站已上线并正常运行。这是带有促销大拇指的直接 link 页面。

LINK >>>>>>> http://thezone.bg/promo <<<<<<<< LINK

我不想把它说得太复杂,我的目标是简单地解决问题。

在此先感谢您花时间和精力解决这个问题。

<p class="roboto_big">Промоции</p>
<div class="image"><img src="uploads/images/NT-Test/promos.png" alt="" width="100%"></div>
<br>
<p class="roboto">Предлагаме многобройни промоции за всички наши клиенти. Възползвайте се от интернет и телевизия, които не са само услуги а начин на живот, на 110% с отстъпки и бонусите предлагани от Зоната.</p>
<hr class="horizontal">
<table style="border-spacing: 60px 0px;">
  <tbody>
    <tr>
      <td style="text-align: center;">
        <p class="roboto_medium">Колкото повече, толкова повече!</p>
        <img class='promo_thumb' onclick="more()" src="uploads/images/NT-Test/Router_Equalizer.png" alt="Промоция, 'Колкото повече толкова повече' ">        
      </td>
      <td style="text-align: center;">
        <p class="roboto_medium">Доведи <br> приятел</p>
        <img class='promo_thumb' onclick="month()" src="uploads/images/NT-Test/free-month2.png" alt="Промоция 'Доведи приятел'">
      </td>
      <td style="text-align: center;">
        <p class="roboto_medium">Лоялен <br> клиент</p>
        <img class='promo_thumb' onclick="client()" src="uploads/images/NT-Test/loyal-client.png" alt="Промоция 'Лоялен клиент'">
      </td>
      <td style="text-align: center;">
        <p class="roboto_medium">Диема <br> Екстра</p>
        <img class='promo_thumb' onclick="DiemaXtra()" src="uploads/images/NT-Test/diema-extra-the-zone.png" alt="Промоция 'Диема Екстра'">
      </td>
    </tr>
  </tbody>
</table>
<div id="promo_info" class="promo">
  <span id="promo_title" class="roboto_big_white" style="color: white;">Колкото повече, толкова повече!</span><hr class="horizontal" style="opacity: 0;">
  <p id="promo_content" class="roboto_white">Тази оферта е за всеки клиент подписал договор за услуга над 30Мб/с за целия срок на договора. Предоставяме ви 300 Мегабитов безжичен рутер за ползване през времето за което сте наш абонат. Настройката на рутера е безплатна и се извършва с характеристики, пожелани от Вас. Рутерът работи с новия 802.11n стандарт, поддържащ няколко антени на едно устройство което подобрява обсега на рутера, скоростта с която може да се прехвъря информация и броя на абонати свързани към домашната мрежа. Също така, ако включите телевизионен пакет Comfort TV/Mania TV получавате безплатно второ цифрово устройство !</p>
</div>

CSS --------------------------

div.promo {
  width: 90%;
  height: auto;
  background-color: #ba050a;
  background-image: url(http://thezone.bg/uploads/images/NT-Test/red_pane.png);
  background-repeat: no-repeat;
  margin: 0px auto;
  margin-top: 50px;
  padding: 10px;
  border: 2px solid #ba050a;
  border-radius: 5px 5px 0px 0px;
  box-shadow: 0px 0px 7px black;
  -webkit-transition: all 0.3s ease-in-out;
  -moz-transition: all 0.3s ease-in-out;
  -ms-transition: all 0.3s ease-in-out;
  -o-transition: all 0.3s ease-in-out;
}

.promo_thumb {
  cursor: pointer;
  position: relative;
  width: 100%;
}

要详细说明 gilly 的评论,transition 效果需要一个 "from" 数字和一个 "to" 数字。您不能根据出现的文本总量来转换高度。 (这实际上还需要考虑调整大小操作,也许还有其他一些情况)

我得到这样的东西的最好方法就是这个。没有伪代码,抱歉:

  1. 保存div的当前clientHeight。
  2. 将该高度作为样式手动应用到 div。
  3. 应用文本更改
  4. 保存 div 的 scrollHeight(总高度,忽略您的样式更改)。
  5. setImmediatesetTimeout 调用中,将 div 的高度设置为第 3 步的高度。

如果用户调整浏览器大小并且高度需要在所有内容自动调整时更改,您可能需要调用类似的东西。

您不能将 css 转换与 height: auto 一起使用。所以,解决办法就是手动设置高度。

此函数将测量过渡前容器和内容的高度,然后测量过渡后内容的高度以获得差异,并将该差异添加到容器高度。从而触发转换。

function showPromotion(titleHTML, contentHTML) {
    var height = parseInt(getComputedStyle(info).height, 10);
    var start = content.scrollHeight;
    title.innerHTML = titleHTML;
    content.innerHTML = contentHTML;
    var diff = content.scrollHeight - start;
    info.style.height = (height + diff) + "px";
}