Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   jQuery - высота блока как у соседнего - проблема с обновлением самой высоты (https://javascript.ru/forum/jquery/76303-jquery-vysota-bloka-kak-u-sosednego-problema-s-obnovleniem-samojj-vysoty.html)

dropoff 25.12.2018 12:51

jQuery - высота блока как у соседнего - проблема с обновлением самой высоты
 
Всем привет.

Суть в следующем Есть галерея изображений. У нее есть основная картинка (большая) и с боку мелкие. При клике на мелкую я из data атрибута хватаю путь к большой картинке и заменяю у основной. Суть думаю ясная.

Есть два дива, один вокруг мелких, другой вокруг основного. Мне нужно брать высоту основного и добавлять к тому который вокруг мелких. Суть в том, чтобы при изменении высоты блока с основной - раздвигался или сжимался блок с мелкими.

Но, при подмене картинки мне возвращает прошлая высота, а не текущая. То есть я не могу получить высоту блока сразу после подмены картинки, хотя блок и увеличился по высоте. Только со второго клика.

this.images_blocks = function(a)
{
    // блок с которого берем высоту
    var image_height = a(".info-image-wrap").height();
    // блок, которому нужно выставить высоту
    var images_wrap = a(".info-images-wrap");

    images_wrap.height(image_height);

    // если изменили размер окна браузера
    a(window).on('resize', function(){
        images_wrap.height(image_height);
    });
}


Если кликнуть по определенным элементам(info-images-thumbnails), то высота меняется только со второго клика.

this.info = function(a)
{
    // выставляем высоту по дефолту
    core.scripts.images_blocks(a);

    // в случае, если кликнули на мелкую картинку, то обновляем высоту блока
    a('.info-images-thumbnails').on('click', 'a', function(e)
    {
        core.scripts.images_blocks(a);
    });
}


Сам HTML примерно такой
<div class="info-images">
	<div class="info-images-wrap">
		<ul class="info-images-thumbnails">
			<li><a href="большая_картинка" data-image="средняя_картинка"><img src="мелкая_картинка"></a></li>
			<li><a href="большая_картинка" data-image="средняя_картинка"><img src="мелкая_картинка"></a></li>
			<li><a href="большая_картинка" data-image="средняя_картинка"><img src="мелкая_картинка"></a></li>
			<li><a href="большая_картинка" data-image="средняя_картинка"><img src="мелкая_картинка"></a></li>
		</ul>
	</div>
	<div class="info-image-wrap">
		<a href="#"><img src="средняя_картинка"></a>
	</div>
</div>


То есть, при клике на info-images-thumbnails меняется высота info-image-wrap в зависимости от картинки в ней, а вот высота info-images-wrap меняется не сразу, а со второго клика. Если покликать несколько раз, то высота скачет через раз. То остается прежней высотой, то меняется как нужно.
Я так понимаю, что дело в подмене картинки и тем, что height обновляется не сразу.

Буду благодарен за помощь.

рони 25.12.2018 13:56

dropoff,
this.images_blocks = function(a)
{
    // блок с которого берем высоту
    var image_height = a(".info-image-wrap");
    // блок, которому нужно выставить высоту
    var images_wrap = a(".info-images-wrap");
   // если изменили размер окна браузера
    a(window).on('resize', function(){
        images_wrap.height(image_height.height());
    }).trigger("resize");
}

dropoff 25.12.2018 14:22

Это ничего не меняет.
Ресайз окна можно не учитывать, просто оставил его в коде.

Проблема после клика на info-images-thumbnails > a
Там уже image_height получает новую высоту блока только со второго раза.

рони 25.12.2018 14:42

dropoff,
код не логичен, кликнули thumbnails, загрузили картинку, картинка установила нужные размеры, как - то так.
без макета сложно.

dropoff 25.12.2018 21:56

Вот я набросал https://jsfiddle.net/dropoff/u9zo78sL/2/

Если пощелкать на картинки слева мелкие по несколько раз, то будет видно, что высота не всегда определяется сразу. Она скачет.
Высоту видно над мелкими картинками.

laimas 25.12.2018 23:05

Цитата:

Сообщение от dropoff
высота не всегда определяется сразу

Нужно получать высоту изображения после его загрузки (onload).

рони 26.12.2018 00:47

dropoff,
css
<!DOCTYPE html>

<html>
<head>
        <title>Untitled</title>
        <meta charset="utf-8">
        <style type="text/css">

.info-images{
        display: flex;
        width: 370px;
        border: 1px solid #0000FF;
        margin: 20px;

}
.info-images-wrap {
        background:red;
       flex: 1;
}

.info-image-wrap {
        width: 85%;
        background-color: green;
}

.info-image-wrap img {
        max-width: 100%;
        height:  auto;
        margin: 0;
        margin-bottom: -4px;
}


.info-images-thumbnails {
        text-align: center;
        padding: 0;
        list-style-type: none;
         display: flex;
         flex-direction: column;
         margin-top: 4px;

}

.info-images-thumbnails li {
        width: 90%;
        margin: 0px auto;
        padding: 0;
        max-height: 70px;
}

.info-images-thumbnails li img {
        max-width: 100%;
        height:  auto;
}

        </style>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

        <script>
$(function() {
    $(".info-images").each(function() {
        var el = $(this),
            parentImg = $(".info-image-wrap", el),
            img = $("img", parentImg),
            parentThumbnails = $(".info-images-wrap", el);
        parentThumbnails.on("click", "a", function(e) {
            e.preventDefault();
            img.attr("src", $(this).data("image"))
        }).find("a:first").click()
    })
});
        </script>
</head>

<body>
<div class="info-images">
        <div class="info-images-wrap">
                <ul class="info-images-thumbnails">
                        <li><a href="http://zella.nasatheme.com/wp-content/uploads/2018/11/5696300305_2_6_1.jpg" data-image="http://zella.nasatheme.com/wp-content/uploads/2018/11/5696300305_2_6_1.jpg"><img src="http://zella.nasatheme.com/wp-content/uploads/2018/11/5696300305_2_6_1-350x455.jpg"></a></li>
                        <li><a href="http://zella.nasatheme.com/wp-content/uploads/2018/10/5696300305_2_1_1.jpg" data-image="http://zella.nasatheme.com/wp-content/uploads/2018/10/5696300305_2_1_1-595x774.jpg"><img src="http://zella.nasatheme.com/wp-content/uploads/2018/10/5696300305_2_1_1-350x455.jpg"></a></li>

                        <li><a href="http://zella.nasatheme.com/wp-content/uploads/2018/09/product-detail-5.jpg" data-image="http://zella.nasatheme.com/wp-content/uploads/2018/09/product-detail-5.jpg"><img src="http://zella.nasatheme.com/wp-content/uploads/2018/09/product-detail-5.jpg"></a></li>

                        <li><a href="http://zella.nasatheme.com/wp-content/uploads/2018/10/5696300305_2_2_1.jpg" data-image="http://zella.nasatheme.com/wp-content/uploads/2018/10/5696300305_2_2_1-595x774.jpg"><img src="http://zella.nasatheme.com/wp-content/uploads/2018/10/5696300305_2_2_1-350x455.jpg"></a></li>
                </ul>
        </div>
        <div class="info-image-wrap">
                <a href="#"><img src="http://zella.nasatheme.com/wp-content/uploads/2018/11/5696300305_2_6_1.jpg"></a>
        </div>
</div>

<div class="info-images">
        <div class="info-images-wrap">
                <ul class="info-images-thumbnails">
                        <li><a href="http://zella.nasatheme.com/wp-content/uploads/2018/11/5696300305_2_6_1.jpg" data-image="http://zella.nasatheme.com/wp-content/uploads/2018/11/5696300305_2_6_1.jpg"><img src="http://zella.nasatheme.com/wp-content/uploads/2018/11/5696300305_2_6_1-350x455.jpg"></a></li>
                        <li><a href="http://zella.nasatheme.com/wp-content/uploads/2018/10/5696300305_2_1_1.jpg" data-image="http://zella.nasatheme.com/wp-content/uploads/2018/10/5696300305_2_1_1-595x774.jpg"><img src="http://zella.nasatheme.com/wp-content/uploads/2018/10/5696300305_2_1_1-350x455.jpg"></a></li>

                        <li><a href="http://zella.nasatheme.com/wp-content/uploads/2018/09/product-detail-5.jpg" data-image="http://zella.nasatheme.com/wp-content/uploads/2018/09/product-detail-5.jpg"><img src="http://zella.nasatheme.com/wp-content/uploads/2018/09/product-detail-5.jpg"></a></li>

                        <li><a href="http://zella.nasatheme.com/wp-content/uploads/2018/10/5696300305_2_2_1.jpg" data-image="http://zella.nasatheme.com/wp-content/uploads/2018/10/5696300305_2_2_1-595x774.jpg"><img src="http://zella.nasatheme.com/wp-content/uploads/2018/10/5696300305_2_2_1-350x455.jpg"></a></li>
                </ul>
        </div>
        <div class="info-image-wrap">
                <a href="#"><img src="http://zella.nasatheme.com/wp-content/uploads/2018/11/5696300305_2_6_1.jpg"></a>
        </div>
</div>
</body>
</html>

dropoff 26.12.2018 10:58

Цитата:

Сообщение от laimas (Сообщение 501026)
Нужно получать высоту изображения после его загрузки (onload).

изображение может быть больше блока. там нет четких размеров. нужна высота именно блока.

Цитата:

Сообщение от рони (Сообщение 501029)
...

Спасибо, но, если добавить больше мелких картинок туда, то блок тянется не за высотой основной картинкой, а уже за высотой блока мелких, тут видно https://jsfiddle.net/dropoff/5ftpw41g/1/

Пробовал вчера играться с этим всем, но так ничего путного и не вышло.

рони 26.12.2018 11:09

Цитата:

Сообщение от dropoff
блок тянется не за высотой основной картинкой, а уже за высотой блока мелких,

так вы определитесь, что вам нужно,в случае если колонка мелких картинок, больше, чем большая картинка, по высоте.
Цитата:

Сообщение от dropoff
изображение может быть больше блока. там нет четких размеров. нужна высота именно блока.

кроме onload других нормальных вариантов нет!!!
Цитата:

Сообщение от рони
загрузили картинку, картинка установила нужные размеры


dropoff 26.12.2018 11:19

Цитата:

Сообщение от рони (Сообщение 501036)
так вы определитесь, что вам нужно,в случае если колонка мелких картинок, больше, чем большая картинка, по высоте

Это я ответил на ваше решение, что будет большая высота блока, если картинок там много. Вы же тестировали на 4 картинках.

Я писал, что мне нужно, чтобы блок с мелкими картинками всегда имел высоту блока с основной.
мелкие картинки которые не помещаются в блок идут в overflow:auto; и добавляется прокрутка. Но это уже вторично. Основная проблема в получении высоты блока при изменении основной картинки.


Часовой пояс GMT +3, время: 08:05.