Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Выдвижение блока с текстом без искажений (https://javascript.ru/forum/misc/82453-vydvizhenie-bloka-s-tekstom-bez-iskazhenijj.html)

jurvrn 09.05.2021 20:32

Выдвижение блока с текстом без искажений
 
При рендеринге видно как текcт подстраивается под анимацию при выезде блока, немного искажается (возможно что только в Firefox).
https://jsfiddle.net/jurvrn/b7um102r/2/
Можно ли переделать CSS на JavaScript или JQuery чтобы искажения при анимации пропали?

рони 09.05.2021 20:40

Цитата:

Сообщение от jurvrn
немного искажается.

в каком браузере?

jurvrn 10.05.2021 09:45

рони,
Очевидно это заметно в "настольном" firefox. Это можно описать как бледный текст становится темнее по окончании transition

рони 10.05.2021 09:51

jurvrn,
не могу увидеть ... но попробуйте сбросить стили ... добавить в самое начало

<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/reseter.css/1.1.2/reseter.min.css'>

jurvrn 10.05.2021 11:14

рони,
Попробую,
Вы если замедлите, то возможно артефакт будет виднее

jurvrn 10.05.2021 14:49

рони,
не помогло, вот видеоскрин сделал - этот артефакт видно (как буквы темнеют)
https://vimeo.com/547455193
если что на сайте можно глянуть - jurvrn.ru

рони 10.05.2021 15:11

jurvrn,
transition: all 0.3s ease-in-out; замените на transform

jurvrn 10.05.2021 16:22

рони,
All на transform ?
Просто судя по https://html5book.ru/css3-transform/ без transition нельзя

рони 10.05.2021 16:42

jurvrn,
:-?
transition: transform 0.3s ease-in-out;

jurvrn 10.05.2021 22:02

Цитата:

Сообщение от рони (Сообщение 536380)
jurvrn,
:-?
transition: transform 0.3s ease-in-out;

без изменений
спасибо, но я бы хотел переделать на JQuery - можно? просто slideUp/slideDown знаю, а slideLeft/slideRight вроде такого нет

рони 10.05.2021 22:21

Цитата:

Сообщение от jurvrn
slideLeft/slideRight

хоть во все стороны сразу есть
https://api.jqueryui.com/slide-effect/

jurvrn 11.05.2021 10:50

рони,
сделал как понял, так как мануал короткий, и работает не так как надо (
https://jsfiddle.net/jurvrn/oqpktewn/14/
ещё пример сделал https://jsfiddle.net/jurvrn/oqpktewn/23/
и нашел вот это, это уже анимация https://www.tutorialrepublic.com/cod...d-right-effect
Но мне нужен такой эффект как уже у меня есть. То есть на hover закрепить слайд. Ну и чтобы срабатывал toggle когда hover пропадал

рони 11.05.2021 11:59

slideRight jquery
 
jurvrn,
без jquery-ui
<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        #toggle {
            position: absolute;
            width: 100px;
            height: 100px;
            background: #ccc;
            left: calc(100% - 100px);
            overflow: hidden;
        }
    </style>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script>
        $(function() {
            let direction = 0;
            $(document).click(function() {
                direction ^= 1;
                let options = direction ? {
                    width: "-=100px",
                    left: "+=100px"
                } : {
                    width: "+=100px",
                    left: "-=100px"
                }
                $("#toggle").stop().animate(
                    options, {
                        duration: 1200,
                        complete: function() {
                            this.style.left = direction ? "100%" : "";
                        }
                    });
            });
        });
    </script>
</head>
<body>
    <p>Click anywhere to toggle the box.</p>
    <div id="toggle">toggle slideRight</div>
</body>
</html>

jurvrn 11.05.2021 16:20

рони,
кончно понимаю
Цитата:

Сообщение от рони
без jquery-ui

вроде на чистый javascript не похоже...
Попытался заставить блок вылезать справа не получилось у меня.
Просьба убрать блок за границу экрана справа и чтобы он выплывал влево

рони 11.05.2021 17:20

Цитата:

Сообщение от jurvrn
Просьба убрать блок за границу экрана справа и чтобы он выплывал влево

а сейчас разве не так?

рони 11.05.2021 17:25

мысли вслух:
если можно использовать css, то лучше использовать css, чем js и тем более jquery.

jurvrn 12.05.2021 11:37

Цитата:

Сообщение от рони (Сообщение 536454)
а сейчас разве не так?
если можно использовать css, то лучше использовать css, чем js и тем более jquery.

в вашем коде блок изначально показан, а его надо изначально скрыть.
Вы видели искажения, может JS/JQuery отработается по другому
вот ещё вроде хороший код но не могу заставить его работать
https://codepen.io/intersk/pen/YzZwyYj
или
https://codepen.io/intersk/pen/KKWVzQb

рони 12.05.2021 13:13

Цитата:

Сообщение от jurvrn
а его надо изначально скрыть.

:-?
<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        #toggle {
            position: absolute;
            width: 0px;
            height: 100px;
            background: #ccc;
            left: 100%;
            overflow: hidden;
        }
    </style>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script>
        $(function() {
            let direction = 1;
            $(document).click(function() {
                direction ^= 1;
                let options = direction ? {
                    width: "-=100px",
                    left: "+=100px"
                } : {
                    width: "+=100px",
                    left: "-=100px"
                }
                $("#toggle").stop().animate(
                    options, {
                        duration: 1200,
                        complete: function() {
                            this.style.left = direction ? "" : "calc(100% - 100px)";
                        }
                    });
            });
        });
    </script>
</head>
<body>
    <p>Click anywhere to toggle the box.</p>
    <div id="toggle">toggle slideRight</div>
</body>
</html>

jurvrn 12.05.2021 15:32

рони, спасибо, это то что надо! а как-то упростить, ускорить этот скрипт можно? а то смотрю там вычисления... Или не так понял?

И где там настраивается ширина выезжающего блока? Тем более что планируется она по ширине текста, текст разный, а блоков этих будет несколько (типа меню).
Поэтому я не могу всем указать одинаковую ширину...

рони 12.05.2021 15:48

Цитата:

Сообщение от jurvrn
ускорить этот скрипт можно? а

строка 31

рони 12.05.2021 16:14

jurvrn,
<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        body{
            position: relative;
        }

        .toggle {
            position: absolute;
            width: 0px;
            height: 100px;
            background-color: #ccc;
            left: calc(100% - var(--left, 0px));
            overflow: hidden;
            top: 0;
        }
        .toggle.two {
           top: 120px;
           background-color: #008000;
        }
        .toggle > div{
             position: relative;
        }

    </style>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <script>
        $(function() {
            let direction = 1;
            $(document).click(function() {
                direction ^= 1;

                $(".toggle").stop().each((i, el) => {
                let width = el.dataset.width;
                let options = direction ? {
                    width: `-=${width}`,
                    left: `+=${width}`
                } : {
                    width: `+=${width}`,
                    left: `-=${width}`
                };
                $(el).animate(
                    options, {
                        duration: 800,
                        complete: function() {
                            this.style.setProperty("--left", direction ? "0px" : `${width}`);
                            this.style.left = ''
                        }
                    });

                })
            });
        });
    </script>
</head>
<body>
    <p>Click anywhere to toggle the box.</p>
    <div class="toggle" data-width="300px"><div style="width:300px">toggle slideRight</div></div>
    <div class="toggle two" data-width="100px"><div style="width:100px">toggle slideRight test test</div></div>

</body>
</html>

jurvrn 12.05.2021 20:51

Цитата:

Сообщение от рони (Сообщение 536501)
строка 31

Имел ввиду не скорость анимации, а саму работу скрипта.

jurvrn 12.05.2021 20:55

рони,
Скрипт попробую и напишу. Неужели он нагружает страницу больше чем css?

рони 12.05.2021 21:04

Цитата:

Сообщение от jurvrn
Неужели он нагружает страницу больше чем css?

да. но это не существенно в данном случае,в пост #21 сделаны изменения

jurvrn 13.05.2021 01:20

рони,
Пока до компьютера не добрался, чтобы попробовать скрипт. Вы его еще больше усложнили )
Пусть нагружает больше , мне сейчас важнее убрать артефакт искажения. Посмотрю как скрипт отработает на моем браузере.
В вашем способе нужно задавать ширину изначально точно. Мне бы хотелось чтобы ширина высчиталась динамично, в зависимости от контента. Может в таком случае нужно margin'ами оперировать?

рони 13.05.2021 10:41

Цитата:

Сообщение от jurvrn
мне сейчас важнее убрать артефакт искажения.

это к специалистам по css.
Цитата:

Сообщение от jurvrn
Мне бы хотелось чтобы ширина высчиталась динамично,

могу только гадать о вашем html.

jurvrn 13.05.2021 13:54

Цитата:

Сообщение от рони (Сообщение 536531)
это к специалистам по css.

могу только гадать о вашем html.

вот. https://codepen.io/intersk/pen/gOmPJxW

.main-block {
        z-index: 1;
        position: fixed;
        width: 36px;
        height: 175px;
        top: 0;
        bottom: 0;
        margin: auto 0;
    }
    
    .each-block {
		position: relative;
        z-index: 2;
        display: flex;
        margin-bottom: 10px;
    }
    
    .iconka-block, .textLine-Out {
		height: 36px;
        border: black 2px solid;
        border-radius: 5px 0 0 5px;
		
    }
 
    .textLine-Out {
        z-index: 3;
        position: static;
		display: flex;
		background-color: rgb(213, 231, 248);
            -webkit-transition: transform 0.3s ease-in-out;
            -moz-transition: transform 0.3s ease-in-out;
            -o-transition: transform 0.3s ease-in-out;
            transition: transform 0.3s ease-in-out;
            -webkit-transform: translateX(0%);
            -moz-transform: translateX(0%);
            -ms-transform: translateX(0%);
            -o-transform: translateX(0%);
            transform: translateX(0%);
    }
	.textLine-Iner {
		margin: auto;
		font-size: 16px;
		white-space: nowrap;
        padding: 0 10px;
	}
    
    .iconka-block {
        position: absolute;
		display: flex;
        z-index: 4;
        background-color: rgb(226,226,226);
        width: 36px;
        right: 0;
        cursor: pointer;
        border-right: none;
    }
    
    .iconka-block:hover + .textLine-Out {
        -webkit-transform: translateX(calc(-100% + 4px));
        -moz-transform: translateX(calc(-100% + 4px));
        -ms-transform: translateX(calc(-100% + 4px));
        -o-transform: translateX(calc(-100% + 4px));
        transform: translateX(calc(-100% + 4px));
    }
    
    .iconka-block .icon_all {
        font-size: 22px;
        text-align: center;
		margin: auto;
    }



<div class="main-block">
    
        <div class="each-block">
            <div class="iconka-block"><i class="fa fa-envelope-o icon_all icon_mail" aria-hidden="true"></i></div>
            <div class="textLine-Out"><div class="textLine-Iner">Напишите нам</div></div>
        </div>
        
        <div class="each-block">
            <div class="iconka-block"><i class="fa fa-podcast icon_all icon_111_enter" aria-hidden="true"></i></div>
            <div class="textLine-Out"><div class="textLine-Iner">fa2-podcast 2icon</div></div>
        </div>
        
            <div class="each-block">
            <div class="iconka-block"><i class="fa fa-bookmark-o icon_all icon_111_enter" aria-hidden="true"></i></div>
            <div class="textLine-Out"><div class="textLine-Iner">33icon_fa-bookmark-o</div></div>
        </div>
        
        <div class="each-block">
            <div class="iconka-block"><i class="fa fa-user-circle icon_all icon_enter" aria-hidden="true"></i></div>
            <div class="textLine-Out"><div class="textLine-Iner">Вход на сайт</div></div>
        </div>
        
    </div>

рони 13.05.2021 14:12

меню справа на css
 
jurvrn,
оставьте всё как есть, артефакт, если у кого-то и проявится, незаметен.
js тут ничего не исправит, и будет только лишним.
<!DOCTYPE html>

<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
.main-block {
        z-index: 1;
        position: fixed;
        width: 36px;
        height: 175px;
        top: 0;
        bottom: 0;
        margin: auto 0;
        left: calc(100% - 36px);
    }

    .each-block {
        position: relative;
        z-index: 2;
        display: flex;
        margin-bottom: 10px;

    }

    .iconka-block, .textLine-Out {
        height: 36px;
        border: black 2px solid;
        border-radius: 5px 0 0 5px;

    }

    .textLine-Out {
        z-index: 3;
        position: static;
        display: flex;
        background-color: rgb(213, 231, 248);
            -webkit-transition: transform 0.3s ease-in-out;
            -moz-transition: transform 0.3s ease-in-out;
            -o-transition: transform 0.3s ease-in-out;
            transition: transform 0.3s ease-in-out;
            -webkit-transform: translateX(0%);
            -moz-transform: translateX(0%);
            -ms-transform: translateX(0%);
            -o-transform: translateX(0%);
            transform: translateX(0%);
    }
    .textLine-Iner {
        margin: auto;
        font-size: 16px;
        white-space: nowrap;
        padding: 0 10px;
    }

    .iconka-block {
        position: absolute;
        display: flex;
        z-index: 4;
        background-color: rgb(226,226,226);
        width: 36px;
        right: 0;
        cursor: pointer;
        border-right: none;
    }

    .iconka-block:hover + .textLine-Out, .textLine-Out:hover {
        -webkit-transform: translateX(calc(-100% + 4px));
        -moz-transform: translateX(calc(-100% + 4px));
        -ms-transform: translateX(calc(-100% + 4px));
        -o-transform: translateX(calc(-100% + 4px));
        transform: translateX(calc(-100% + 4px));
    }

    .iconka-block .icon_all {
        font-size: 22px;
        text-align: center;
        margin: auto;
    }
    </style>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

    <script>
$(function() {

});
    </script>
</head>

<body>
<div class="main-block">

        <div class="each-block">
            <div class="iconka-block"><i class="fa fa-envelope-o icon_all icon_mail" aria-hidden="true"></i></div>
            <div class="textLine-Out"><div class="textLine-Iner">Напишите нам</div></div>
        </div>

        <div class="each-block">
            <div class="iconka-block"><i class="fa fa-podcast icon_all icon_111_enter" aria-hidden="true"></i></div>
            <div class="textLine-Out"><div class="textLine-Iner">fa2-podcast 2icon</div></div>
        </div>

        <div class="each-block">
            <div class="iconka-block"><i class="fa fa-bookmark-o icon_all icon_111_enter" aria-hidden="true"></i></div>
            <div class="textLine-Out"><div class="textLine-Iner">33icon_fa-bookmark-o</div></div>
        </div>

        <div class="each-block">
            <div class="iconka-block"><i class="fa fa-user-circle icon_all icon_enter" aria-hidden="true"></i></div>
            <div class="textLine-Out"><div class="textLine-Iner">Вход на сайт</div></div>
        </div>

    </div>


</body>
</html>

jurvrn 13.05.2021 15:16

рони,
в вашем посте №21 нет такого артефакта, потому то выдвижение реализуется как-то под другому. Вот к этому и стремлюсь.
Вот в этих кодах можно что-то исправить чтобы было как мне нужно?
У самого не получается заставить их работать
https://codepen.io/intersk/pen/YzZwyYj
https://codepen.io/intersk/pen/KKWVzQb

рони 13.05.2021 16:27

jurvrn,
https://codepen.io/intersk/pen/YzZwyYj отсутствует jquery-ui
https://codepen.io/intersk/pen/KKWVzQb отсутствует #

рони 13.05.2021 17:47

меню справа на jquery
 
jurvrn,

<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        .main-block {
            z-index: 1;
            position: fixed;
            width: 36px;
            height: 175px;
            top: 0;
            bottom: 0;
            margin: auto 0;
            left: calc(100% - 36px);
        }
        .each-block {
            position: relative;
            z-index: 2;
            display: flex;
            margin-bottom: 10px;
        }
        .iconka-block,
        .textLine-Out {
            height: 36px;
            border: black 2px solid;
            border-radius: 5px 0 0 5px;
        }
        .textLine-Out {
            z-index: 3;
            position: static;
            display: flex;
            background-color: rgb(213, 231, 248);
        }
        .textLine-Iner {
            margin: auto;
            font-size: 16px;
            white-space: nowrap;
        }
        .iconka-block {
            position: absolute;
            display: flex;
            z-index: 4;
            background-color: rgb(226, 226, 226);
            width: 36px;
            right: 0;
            cursor: pointer;
            border-right: none;
        }
        .textLine-Out {
            transform: translateX(calc(-100% + 36px));
        }
        .textLine-Iner {
            width: 0px;
            padding: 0 10px;
        }
        .iconka-block .icon_all {
            font-size: 22px;
            text-align: center;
            margin: auto;
        }
    </style>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script>
        $(function() {
            $(".each-block").each((i, el) => {
                let textLine = el.querySelector(".textLine-Iner");
                let width = el.scrollWidth + 10;
                $(el).mouseenter(function() {
                    let options = {
                        width: `${width}px`,
                    };
                    $(textLine).stop().animate(
                        options, {
                            duration: 600
                        })
                })
                $(el).mouseleave(function() {
                    let options = {
                        width: `0px`
                    };
                    $(textLine).stop().animate(
                        options, {
                            duration: 300
                        });
                })
            })
        });
    </script>
</head>
<body>
    <div class="main-block">
        <div class="each-block">
            <div class="iconka-block"><i class="fa fa-envelope-o icon_all icon_mail" aria-hidden="true"></i></div>
            <div class="textLine-Out">
                <div class="textLine-Iner">Напишите нам</div>
            </div>
        </div>
        <div class="each-block">
            <div class="iconka-block"><i class="fa fa-podcast icon_all icon_111_enter" aria-hidden="true"></i></div>
            <div class="textLine-Out">
                <div class="textLine-Iner">fa2-podcast 2icon</div>
            </div>
        </div>
        <div class="each-block">
            <div class="iconka-block"><i class="fa fa-bookmark-o icon_all icon_111_enter" aria-hidden="true"></i></div>
            <div class="textLine-Out">
                <div class="textLine-Iner">33icon_fa-bookmark-o</div>
            </div>
        </div>
        <div class="each-block">
            <div class="iconka-block"><i class="fa fa-user-circle icon_all icon_enter" aria-hidden="true"></i></div>
            <div class="textLine-Out">
                <div class="textLine-Iner">Вход на сайт</div>
            </div>
        </div>
    </div>
</body>
</html>

jurvrn 13.05.2021 18:23

Цитата:

Сообщение от рони (Сообщение 536544)
jurvrn,
https://codepen.io/intersk/pen/YzZwyYj отсутствует jquery-ui
https://codepen.io/intersk/pen/KKWVzQb отсутствует #

спасибо за подсказку.
Но в первом скрипте заработало со всеми только этими 2 файлами. А почему нужны оба?
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>

во втором скрипте что-то тоже не получается когда нужно использовать несколько блоков (не писать же под каждый свой скрипт)


я просто убрал из класса стилей transform: translateX(0%); и искажение прекратилось при сохранении работы кода...
эта тема решена

рони 13.05.2021 18:29

Цитата:

Сообщение от jurvrn
А почему нужны оба?

jquery-ui содержит эффекты и модули, которые являются дополнением к основной jquery
Цитата:

jQuery UI — это библиотека на основе jQuery, реализующая более 20 гибких плагинов, предоставляющая продуманную систему оформления и средства для создания собственных плагинов с нуля, или на основе уже существующих.
http://jquery.page2page.ru/index.php5/JQuery_UI


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