Javascript | Заставить изображение появиться на одном слайде в разделе «Выберите свое приключение», а затем исчезнуть? - PullRequest
0 голосов
/ 20 июня 2020

Я изучаю JS и создаю проект на основе текстовой игры на выбор.

То, что я хотел бы, есть на определенных «слайдах», чтобы изображения появлялись с текстом описания в верхней половине.

Прямо сейчас это работает так, что слайды заменяются выбором опций, указывающих на новый идентификатор слайда, который имеет новое значение text. Затем это используется для обновления фактического текстового элемента. Моя первоначальная мысль заключалась в том, чтобы иметь пустой <img> div, а затем на некоторых слайдах обновить переменную с помощью test.png и использовать .src, чтобы дать div изображение. Однако это просто означает, что есть уродливый «квадрат без изображения», который появляется все время.

Тогда я подумал, что, возможно, на некоторых слайдах я мог бы присвоить номер переменной image. Это число будет относиться к элементу в массиве или списке или к тому изображению, которое я хочу показать. Затем функция showTextNode будет проверять это число и, если найдет его, добавит дочерний img с правильным изображением. Затем, переходя к следующему слайду, дочерний элемент будет удален.

Мои первые попытки добавить if l oop, проверяя, совпадает ли image с числом, ничего не делают, кроме как все ломают! Прямо сейчас это решение очень не подходит для моей рулевой рубки, поэтому, если кто-нибудь может направить меня к нужной документации или руководству или и т. Д. c ..., чтобы узнать об этом, это было бы здорово!

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="style.css" rel="stylesheet">
    <script defer src="game.js"></script>
    <title>Case Study 1</title>
</head>
<body>
    <div class="container">
        <div class="container-upper">
            <div id="text" class="text">Text</div>
        </div>
        <div class="container-lower">
            <div id="option-buttons" class="btn-grid">
                <button class="btn">Option 1</button>
                <button class="btn">Option 2</button>
                <button class="btn">Option 3</button>
            </div>
        </div>
    </div>
</body>
</html>

JAVASCRIPT

const textElement = document.getElementById('text')
const optionButtonsElement = document.getElementById('option-buttons')

let state = {}

function startGame() {
    state = {};
    showTextNode(1);
}

function showTextNode(textNodeIndex) {
    const textNode = textNodes.find(textNode => textNode.id === textNodeIndex);
    textElement.innerText = textNode.text;
    while(optionButtonsElement.firstChild) {
        optionButtonsElement.removeChild(optionButtonsElement.firstChild);
    }

    textNode.options.forEach(option => {
        if(showOption(option)) {
            const button = document.createElement('button');
            button.innerText = option.text;
            button.classList.add('btn')
            button.addEventListener('click', () => selectOption(option));
            optionButtonsElement.appendChild(button);
        }
    })
}

function showOption(){
    return true;
}

function selectOption(option) {
    const nextTextNodeId = option.nextText;
    state = Object.assign(state, option.setState)
    showTextNode(nextTextNodeId)
}

const textNodes = [
    {
        id: 1,
        text: 'Case Study: BioPharma Expansion',
        options: [
            {
                text: 'Start',
                setState: {},
                nextText: 2
            }
        ]
    },
    {
        id: 2,
        text: 'Your client is BioPharma, a multinational healthcare company headquartered in the Netherlands',
        options: [
            {
                text: "I'd like to know more about BioPharma's revenue",
                setState: {},
                nextText: 3
            },
            {
                text: "I'd like to know more about BioPharma's cost structure",
                setState: {},
                nextText: 3
            }   
        ]
    },
    {
        id: 3,
        text: "BioPharma's revenue has increased year on year by 12% since 2014",
        options: [
            {
                text: "What about costs?",
                setState: {},
                nextText: 4
            }
        ]
    },
    {
        id: 4,
        text: "BioPharma's cost structure is shown below in Figure 1",
        options: [
            {
                text: "Here is some stuff",
            }
        ]
    }
]

startGame();

1 Ответ

0 голосов
/ 20 июня 2020

Один из вариантов, о котором я подумал, - это вставить изображение в качестве фона для div. Поэтому я не совсем уверен, правильно ли я понял, чего вы пытаетесь достичь, но мне кажется, что в зависимости от объекта «textNodes», в котором находится пользователь, вы хотели бы отобразить изображение.

Сохранение ваш код как можно ближе к тому, что вы предоставили, я добавил свойство imageLink к объекту со ссылкой в ​​качестве значения, а в вашей функции showTextNode я добавил тернарный оператор, который ищет это свойство, если оно не определено затем он добавит эту ссылку в качестве фонового изображения в div с id = "image", в противном случае он установит для отображения значение none.

const textElement = document.getElementById('text')
const optionButtonsElement = document.getElementById('option-buttons')

let state = {}

function startGame() {
    state = {};
    showTextNode(1);
}

function showTextNode(textNodeIndex) {
    const textNode = textNodes.find(textNode => textNode.id === textNodeIndex);
    textElement.innerText = textNode.text;
    
    while(optionButtonsElement.firstChild) {
        optionButtonsElement.removeChild(optionButtonsElement.firstChild);
    }
  
    // ternary operator that looks for the imageLink property
            textNode.imageLink ? document.getElementById('image').style.backgroundImage = `url(${textNode.imageLink})` : document.getElementById('image').style.display = "none"

    textNode.options.forEach(option => {

    // if statement removed as it will always returns true since that is the purpose of the function called
            const button = document.createElement('button');
            button.innerText = option.text;
            button.classList.add('btn')
            button.addEventListener('click', () => selectOption(option));
            optionButtonsElement.appendChild(button);
    })
}

// function commented as it's purpose seems redundant
/*
function showOption(){
    return true;
}
*/

function selectOption(option) {
    const nextTextNodeId = option.nextText;
    state = Object.assign(state, option.setState)
    showTextNode(nextTextNodeId)
}

const textNodes = [
    {
        id: 1,
        text: 'Case Study: BioPharma Expansion',
      // image link propert
      // change the link as you see fit
                imageLink: "https://image.flaticon.com/icons/png/128/1828/1828743.png",
        options: [
            {
                text: 'Start',
                setState: {},
                nextText: 2
            }
        ]
    },
    {
        id: 2,
        text: 'Your client is BioPharma, a multinational healthcare company headquartered in the Netherlands',
        options: [
            {
                text: "I'd like to know more about BioPharma's revenue",
                setState: {},
                nextText: 3
            },
            {
                text: "I'd like to know more about BioPharma's cost structure",
                setState: {},
                nextText: 3
            }   
        ]
    },
    {
        id: 3,
        text: "BioPharma's revenue has increased year on year by 12% since 2014",
        options: [
            {
                text: "What about costs?",
                setState: {},
                nextText: 4
            }
        ]
    },
    {
        id: 4,
        text: "BioPharma's cost structure is shown below in Figure 1",
        options: [
            {
                text: "Here is some stuff",
            }
        ]
    }
]

startGame();
<div class="container">
  <div class="container-upper">
    <div id="text" class="text">Text</div>
    
    <!-- Container where the image will be inserted -->
    <div id="image" style="width: 150px; height: 150px; background-repeat: no-repeat"></div>
    
  </div>
  <div class="container-lower">
    <div id="option-buttons" class="btn-grid">
      <button class="btn">Option 1</button>
      <button class="btn">Option 2</button>
      <button class="btn">Option 3</button>
    </div>
  </div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...