Показать сообщение отдельно
  #6 (permalink)  
Старый 12.12.2019, 14:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

бегущая строка вертикально
Lefseq,
на основе варианта от Malleys,
https://javascript.ru/forum/dom-wind...tml#post514440
<text-display>
    <img src="https://picsum.photos/300/100?1">
    <img src="https://picsum.photos/300/100?2">
    <img src="https://picsum.photos/300/100?3">
    <img src="https://picsum.photos/300/100?4">
    <img src="https://picsum.photos/300/100?5">
    <img src="https://picsum.photos/300/100?6">
    <img src="https://picsum.photos/300/100?7">
    <img src="https://picsum.photos/300/100?8">
    <img src="https://picsum.photos/300/100?9">
</text-display>

<style>

text-display {
    background: linear-gradient(to bottom, #333, black);
    background-color: #111;
    color: white;
    font: 900 1em / 1.5 monospace, system-ui;
    border-radius: 0.2em;
    white-space: nowrap;
    margin: 0.2em 0;
    width: 300px;
    height: 250px;
}

</style>

<script>

class TextDisplay extends HTMLElement {
    constructor() {
        super();

        const shadow = this.attachShadow({ mode: "closed" });
        const document = shadow.ownerDocument;
        const firstElement = document.createElement("div");
        const secondElement = document.createElement("div");
        const slot = document.createElement("slot");
        const observer = new MutationObserver(mutationHandler);

        shadow.innerHTML = `<style>
            :host {
                display: flex;
                overflow: hidden;
                flex-direction: column;
            }
            :host > div {
                min-width: 100%;
                will-change: transform;
                animation: text-display var(--text-display-duration, 15s) linear infinite;
                animation-direction: inherit;
                display: flex;
                flex: 1 0 auto;
                text-align: center;
                flex-direction: column;
            }
            :lang(ar), :lang(he) {
                animation-direction: reverse;
            }
            @keyframes text-display {
                to {
                    transform: translateY(-100%);
                }
            }
        </style>`;

        firstElement.append(slot);
        shadow.append(firstElement, secondElement);
        mutationHandler();

        observer.observe(this, {
            subtree: true,
            characterData: true,
            attributes: true,
            childList: true
        });

        function mutationHandler() {
            secondElement.textContent = "";

            for(const assignedNode of slot.assignedNodes())
                secondElement.append(assignedNode.cloneNode(true));
        }
    }
}

customElements.define("text-display", TextDisplay);

</script>
Ответить с цитированием