사실 Vue3만을 위한 내용은 아니지만 Vue3기준이기에 다른 버전에선 안먹힐 수 있음.
겁나 간단한 내용들이고 공식문서에도 나오겠지만.. 나름 보기 편하게 정리. 진짜 금붕어 기억력 어뜨카냐
기본 사용법
<!-- XXX.vue -->
<style>
.hello{
display:block;
}
</style>
전역적으로 적용된다.
언어 지정
<style lang="scss"></style>
원하는 언어를 설치한 뒤 lang="원하는 언어" 를 사용해서 scss, sass 등을 style 내에서 사용할 수 있다.
이건 template이나 script도 마찬가지. template에서는 lang을 pug로 설정한다던가 script에서는 ts를 넣으면 typescript로 사용할 수 있다.
범위 지정 scoped
<style scoped></style>
이 코드가 적힌 파일 내의 요소에만 적용되는 스타일을 적을 수 있다. 기본적으로 자식요소에게 넘어가지 않는다.
하지만 아래와 같이 상위요소의 선택자를 가져오는건 가능하다.
<!-- 부모.vue -->
<template>
<div id="hello">
<자식/>
</div>
</template>
<script setup>
import 자식 from "./자식.vue";
</setup>
<!-- 자식.vue -->
<temaplate>
<h1>hello</h1>
</template>
<style scoped>
#hello h1{
color:pink;
}
</style>
그리고 <style>과 함께 사용이 가능하다.
<!-- XXX.vue -->
<style>
*{
margin:0;
padding:0;
}
</style>
<style scoped>
.hello{
margin:20px auto;
}
</style>
scoped 를 사용하면 class나 id를 사용하지 않아도 에러가 뜨지 않는다.
하지만 공식문서에서 말하길, 그렇게 하면 속도가 몇배나 느려지기에 class나 id를 사용하길 권장하고 있다.
샘플코드로 속도테스트 했을 때 차이가 있는지 없는지 확실하게 알 수 없었음.. 아마 샘플코드가 짧아서 그런듯.
아무튼 안전빵으로 열심히 class나 id 설정해두는게 좋다.
<style scoped>에서 하위요소에게 스타일 주기
<style scoped>
.hello:deep(.hi){
display:block;
}
</style>
:deep(자식요소 선택자) 를 사용하면 된다. 이게 곧 .hello .hi {} 로 변하기 때문에 하위 요소에서 .hi 에게 값을 주는 것보다 우선시 됨.
<style scoped>에서 전역스타일 만들기
<style scoped>
:global(.hello){
margin:0;
}
</styl>
<style>과 함께 쓰기엔 애매할 때 :global(선택자) 를 이용해서 특정 요소들에게 전역 스타일을 줄 수 있다.
<style scoped>에서 <slot/> 안에 들어갈 요소에게 스타일 주기
<!-- 부모.vue -->
<template>
<자식>
<div>hello</div>
<p>good bye</p>
</자식>
</template>
<script setup>
import 자식 from "./자식.vue"
</script>
<!-- 자식.vue -->
<template>
<slot/>
</template>
<style scoped>
:slotted(div){
background:pink;
}
:slotted(p){
color:blue;
}
</style>
외부 스타일 파일 불러오기
<!-- 전역 적용 -->
<style src="파일경로"/>
<!-- 범위 지정이 필요한 경우 -->
<style scoped src="파일경로"/>
따로 .css, .scss 등의 파일을 분리했거나 tailwind 같은 css파일로 구성된 라이브러리 등을 사용하는 경우 이런 방식으로 불러올 수 있다.
<style module> 모듈
https://vuejs.org/api/sfc-css-features.html#css-modules
SFC CSS Features | Vue.js
vuejs.org
모듈은 내가 안써봐서... 공식문서 링크 참조. 나중에 CSS 모듈 제대로 찾아보고 쓰고나서 수정할거쉬다.
동적인 값을 사용하는 CSS (v-bind)
개인적으로 이거 진짜 오늘 첨보는 기능인데 너무 쩔음.
<style> 내에서 <script> 내에 선언한 값을 v-bind를 이용하여 사용할 수 있다.
<template>
<div class="hello">Yeah</div>
<button @click="changeBackground">change background</button>
</template>
<script setup>
import {ref, computed} from "vue";
const color = "pink";
const background = ref("hotpink");
const changeBackground = computed(()=>{
background.value = 'blue';
});
</script>
<style>
.hello{
color:v-bind('color');
background:v-bind('background');
}
</style>
위와 같은 식으로 script 내에서 선언한 변수 혹은 동적인 ref/reactive 변수를 style 태그 내로 가져와 v-bind 내에 적어서 해당 값을 쓸 수 있다. 저 코드는 Yeah 라는 단어의 색상은 pink가 되고 배경색은 hotpink 가 된다.
그리고 버튼을 누르면 changeBackground 함수가 실행되고 computed를 통해 hotpink 는 blue로 바뀐다.
그리고 그게 적용이 됨
난 여태 이거 몰라서 여태 아래와 같이 썼는데..
<template>
<div :style="{background:backgroundColor.value}">Yeah</div>
<button @click="changeBgColor">change background color</button>
</template>
<script setup>
import {ref, computed} from "vue";
const backgroundColor = ref('hotpink');
const changeBgColor = computed(()=>{backgroundColor.value = 'blue'});
</script>
....진짜 이거 보니까 더 드는 생각인데, 뷰3랑 script setup은 뷰 만든 사람이 정말 리액트를 발라버릴려고 만든게 아닐까?
리액트 그자슥은 분명 한 파일 내에 있는데 styled component 이거 안에 변수 넣는거 진심 킹받았단말임 하나하나 태그 안에 넣어줘야하 ㅂㄷㅂㄷ
암튼..이게 끝임.
정말 오랜만에 올리는 글인데..아직 임시저장해둔 글 세개정도 있음.
예전에 임시저장했던건 다시보니 약간 헛소리 적어둔거같아서 걍 싹 지우고 새로운 마음으로 새롭게 시작함....
그럼 20000.
'이것저것 코딩공부 > Vue' 카테고리의 다른 글
nuxt3 에서 vue-quill 라이브러리로 quill.js 쓰기 (0) | 2022.07.26 |
---|---|
Material Design Icons (mdi) 를 vue 3, nuxt 3 에서 쓰는 법 (0) | 2022.07.19 |
[Vue3] 이미지 프리뷰 (1개/여러개) 간단하게 만들기 (0) | 2022.06.02 |