Трудно изменить цвет фона в Vue js

Я пытаюсь сделать цвет фона целевой страницы оранжевым, но проблема в том, что то, что у меня сейчас есть, делает все страницы оранжевыми.

Я попытался добавить scoped на целевую страницу, чтобы она стилизовала только эту страницу, но когда я это делаю, вся страница больше не оранжевая.

Конечная цель — повлиять только на целевую страницу.

Я уже пробовал HTML и Body вместо ' * ', в этом случае они тоже не работают.

landingpage.vue:

<template>
    <div class = "container">
        <div class=landing>
            <h1>Hello.</h1>
            <router-link to = "/work">
                <button id = "work" type = "button">See my work</button>
            </router-link>
            <router-link to = "/home">
                <button id = "home" type = "button">Go home</button>
            </router-link>
        </div>
    </div>
</template>

<script>
export default {
  name: 'Landing',
};
</script>

<style scoped>
* {
    background: orange;
}

h1 {
    margin-top: 100px;
    text-align: center;
    font-size: 80px;
    color: green;
}
#work {
    color: green;
    border: none;
    font-size: 25px;
    text-decoration: none;
    margin: 0;
    position: absolute;
    top: 50%;
    left: 50%;
    -ms-transform: translate(-50%, -50%);
    transform: translate(-50%, -50%);
}
#work:hover {
    color: white;
}
#home{
    color: green;
    border: none;
    font-size: 15px;
    text-decoration: none;
    margin: 0;
    position: absolute;
    top: 70%;
    left: 50%;
    -ms-transform: translate(-50%, -50%);
    transform: translate(-50%, -50%);
}
#home:hover {
    color: white;
}
</style>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
7
0
4 482
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вместо

* {
    background: orange;
}

делать

html {
    background: orange;
}

или

body {
    background: orange;
}

Я пробовал несколько разных вещей до «*». Я попробовал body и html, и оба сделали всю мою страницу белой.

user14875201 23.12.2020 05:35

Вы также можете динамически привязать класс, чтобы он применялся только к маршруту целевой страницы.

Итак, в App.vue или любом другом компоненте верхнего уровня, который действует как оболочка приложения, вы можете сделать что-то вроде этого:

/* ==== in App.vue (or Landing Page parent Component) ==== */
<template>
  <div :class = {orangeBackground: $route.path.includes('/landingPagePath')}>
     // other stuff could be here - like the router view or whatever
     <router-view> </router-view>
  </div>   
</template>
<script>
</script>
<style>
.orangeBackground {
    background: orange;
}
</style>

Основная идея заключается в том, что весь DOM содержится в родительском компоненте, но мы применяем класс .orangeBackground только в том случае, если браузер находится на маршруте целевой страницы.

Ответ принят как подходящий

HTML и body находятся вне приложения (+ Vue Router = SPA => body/html не перерисовывается при переходе от page-1 к page-2).

"проблема первая" - СПА

В компоненте с одним файлом — body, html стили применяются только при обновлении страницы (например, перейдите от page-1 к page-2 и нажмите F5):

<!-- page_2 -->
<style>
   body{
    background: orange; /* not apply if you go from page-1 to page-2 */
   }
</style>

"проблема вторая" - "выходит за рамки"

scoped == CSS будет применяться только к элементам current component. body не является частью current scoped component.

Привет мир решение

Самая основная нединамическая идея «hello world» для решения этой проблемы заключается в использовании Lifecycle-Hooks- On created изменить фон тела с помощью простого JS. На destroyed удалите фон.

<script>
export default {
  name: "orange-page",
  created: function () {
    document.body.style.backgroundColor = "orange";
  },
  destroyed: function () {
    document.body.style.backgroundColor = null;
  },
};
</script>

"мин: 100vh приложение"

Еще одна идея — добавить «обертку» + стиль min:100vh внутрь вашего #app (#app покроет весь body/html ***set: body { margin: 0;}.

Связанный пример: https://www.pluralsight.com/guides/change-page-background-color-each-route

Еще идеи:

Изменение стилей тела в vue router

css

В целом используйте:

body{
   background: orange;
}

Нет (* ==> выбирает все элементы):

Спасибо за ответ. Когда я попытался реализовать решение «Hello World», я получил следующие ошибки: «Неожиданный неназванный метод «создал» имена функций 18:3, ошибка. Сокращение ожидаемого метода "Есть идеи, как их решить? Я сделал поиск в Google, но не дал многого.

user14875201 23.12.2020 05:40

Сначала создайте простой console.info("hello lifecycle") в своем коде. Вы используете vue 3 или 2?... пример vue-3: learnvue.co/2020/03/how-to-use-lifecycle-hooks-in-vue3 . [2] Это красная ошибка (приложение не отображается) или ошибка ES-lint?

Ezra Siton 23.12.2020 06:12
v3.vuejs.org/guide/instance.html#lifecycle-hooks
Ezra Siton 23.12.2020 06:24
null является недопустимым значением для backgroundColor. Как ни странно, это действительно работает (поскольку это недействительно, браузер по умолчанию использует остальные правила или значение по умолчанию, которое равно transparent). Но вы вызываете тихую ошибку, передавая недопустимое значение CSS. Теоретически правильный способ сделать это — очистить объект стиля от текущего правила backgroundColor.
tao 23.12.2020 19:52

@tao Хороший улов. Я думаю, что было бы лучше установить значение белого или, может быть, начального.

Ezra Siton 23.12.2020 20:36

Ценить это!! Это работает, и я научился использовать хуки жизненного цикла. Спасибо вам обоим. Однако в своем скрипте я изменил «created: function()» на « created() ». Теперь он работает без ошибок.

user14875201 23.12.2020 21:04

@mike, у вас, вероятно, была еще одна незначительная ошибка, которую вы исправили, не осознавая, когда вы переключились (может быть, пропущена запятая или точка с запятой !?). created: function () { ... } является точным эквивалентом created() { ... } в VueConstructor. Лично я предпочитаю второй синтаксис, поскольку он короче, но, поскольку оба они дают одинаковый результат, я редко выступаю за какой-либо из них. Оба синтаксиса допустимы для любых hook, computed или method (включая функции установки/получения в computed).

tao 24.12.2020 00:26

@EzraSiton, установить любое значение (white, transparent или initial) в destroyed было бы технически неправильно. Предполагая, что body имеет background-color из red, примененное некоторым CSS, ваш компонент устанавливает его в orange в mounted, а затем в transparent в destroyed. body теперь имеет другой цвет фона, чем раньше. Ваш компонент должен только отменить применение любого правила, которое он применил. Самым простым способом было бы добавить класс в body, стилизованный внутри компонента, и удалить этот класс в destroyed. В противном случае вы не сможете восстановить исходное состояние CSS тела во всех случаях.

tao 24.12.2020 00:43

@tao хорошая идея удалить/добавить класс - согласен (очень чисто).

Ezra Siton 24.12.2020 08:57

С новым API композиции код выглядит так:

setup() {
  var color = "#343E3D";
  onMounted(() => {
    console.info("mounted!");
    document.body.style.backgroundColor = color;
  });
  onUnmounted(() => {
    console.info("unmounted!");
    document.body.style.backgroundColor = null;
  });
  return {};
},

Эти два хука жизненного цикла будут менять фон, когда ваш компонент загружается/выгружается. У меня была аналогичная проблема с одной страницей, которая нуждалась в другом фоне, чем остальная часть веб-сайта.

Другие вопросы по теме