Я пытаюсь сделать цвет фона целевой страницы оранжевым, но проблема в том, что то, что у меня сейчас есть, делает все страницы оранжевыми.
Я попытался добавить 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>



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вместо
* {
background: orange;
}
делать
html {
background: orange;
}
или
body {
background: orange;
}
Вы также можете динамически привязать класс, чтобы он применялся только к маршруту целевой страницы.
Итак, в 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>
Еще одна идея — добавить «обертку» + стиль min:100vh внутрь вашего #app (#app покроет весь body/html ***set: body { margin: 0;}.
Связанный пример: https://www.pluralsight.com/guides/change-page-background-color-each-route
Изменение стилей тела в vue router
В целом используйте:
body{
background: orange;
}
Нет (* ==> выбирает все элементы):
Спасибо за ответ. Когда я попытался реализовать решение «Hello World», я получил следующие ошибки: «Неожиданный неназванный метод «создал» имена функций 18:3, ошибка. Сокращение ожидаемого метода "Есть идеи, как их решить? Я сделал поиск в Google, но не дал многого.
Сначала создайте простой console.info("hello lifecycle") в своем коде. Вы используете vue 3 или 2?... пример vue-3: learnvue.co/2020/03/how-to-use-lifecycle-hooks-in-vue3 . [2] Это красная ошибка (приложение не отображается) или ошибка ES-lint?
null является недопустимым значением для backgroundColor. Как ни странно, это действительно работает (поскольку это недействительно, браузер по умолчанию использует остальные правила или значение по умолчанию, которое равно transparent). Но вы вызываете тихую ошибку, передавая недопустимое значение CSS. Теоретически правильный способ сделать это — очистить объект стиля от текущего правила backgroundColor.
@tao Хороший улов. Я думаю, что было бы лучше установить значение белого или, может быть, начального.
Ценить это!! Это работает, и я научился использовать хуки жизненного цикла. Спасибо вам обоим. Однако в своем скрипте я изменил «created: function()» на « created() ». Теперь он работает без ошибок.
@mike, у вас, вероятно, была еще одна незначительная ошибка, которую вы исправили, не осознавая, когда вы переключились (может быть, пропущена запятая или точка с запятой !?). created: function () { ... } является точным эквивалентом created() { ... } в VueConstructor. Лично я предпочитаю второй синтаксис, поскольку он короче, но, поскольку оба они дают одинаковый результат, я редко выступаю за какой-либо из них. Оба синтаксиса допустимы для любых hook, computed или method (включая функции установки/получения в computed).
@EzraSiton, установить любое значение (white, transparent или initial) в destroyed было бы технически неправильно. Предполагая, что body имеет background-color из red, примененное некоторым CSS, ваш компонент устанавливает его в orange в mounted, а затем в transparent в destroyed. body теперь имеет другой цвет фона, чем раньше. Ваш компонент должен только отменить применение любого правила, которое он применил. Самым простым способом было бы добавить класс в body, стилизованный внутри компонента, и удалить этот класс в destroyed. В противном случае вы не сможете восстановить исходное состояние CSS тела во всех случаях.
@tao хорошая идея удалить/добавить класс - согласен (очень чисто).
С новым API композиции код выглядит так:
setup() {
var color = "#343E3D";
onMounted(() => {
console.info("mounted!");
document.body.style.backgroundColor = color;
});
onUnmounted(() => {
console.info("unmounted!");
document.body.style.backgroundColor = null;
});
return {};
},
Эти два хука жизненного цикла будут менять фон, когда ваш компонент загружается/выгружается. У меня была аналогичная проблема с одной страницей, которая нуждалась в другом фоне, чем остальная часть веб-сайта.
Я пробовал несколько разных вещей до «*». Я попробовал body и html, и оба сделали всю мою страницу белой.