CSS 样式未应用于 Vue 组件中的 HTML

Mih*_*hai 4 javascript css css-selectors vue.js vuejs2

我正在尝试创建一个旋转文本动画Vue.js,我使用这个CodePen作为灵感。

  • 我把所有的HMTL元素都放在适当的位置(即,在提到的CodePen中)。简而言之:

    • 每个单词由几个<span>元素组成,每个元素包含一个字母。
    • 在特定的时间间隔之后,每个<span>持有一个字母的人都会被应用一个.in.out CSS类。这无限期地持续下去。
    • 这是它的样子DOM

      在此处输入图片说明

  • 问题是,无论CSS我使用什么选择器,我都无法定位.inand.out类,除非我通过Developer Toolsin 来实现Chrome

    • 原始输出:

      在此处输入图片说明

    • 添加类后的输出Developer Tools

      在此处输入图片说明

这是我的最低限度的代码Vue Component

<template>
    <div id="app-loading">  
        <div class="words">
            <span v-for="setting in settings" v-html="setting.lettersHTML" :id="setting.id" class="word"></span>    
        </div>
    </div>
</template>


<script>
    export default {
        data() {
            return {
                settings: [
                    { word: 'WordOne', id: 1, lettersArray: null, lettersHTML: null },
                    { word: 'WordTwo', id: 2, lettersArray: null, lettersHTML: null }
                ],
                currentWord: 1
            }
        },

        created() {
            this.splitLetters();
        },

        mounted() {
            setInterval(this.changeWord, 1500);
        },

        methods: {
            splitLetters() {
                this.settings.forEach((setting) => {
                    let letters = [];
                    for (let i = 0; i < setting.word.length; i++) {
                        let letter = `<span class="letter">${ setting.word.charAt(i) }</span>`;
                        letters.push(letter);
                    }
                    setting.lettersArray = letters;
                    setting.lettersHTML = letters.join('');
                });
            },

            changeWord() {
                let current = document.getElementById(this.currentWord).getElementsByTagName('span');
                let next = (this.currentWord == this.settings.length) ? document.getElementById(1).getElementsByTagName('span') : document.getElementById(this.currentWord + 1).getElementsByTagName('span');
                // Animate the letters in the current word.
                for (let i = 0; i < current.length; i++) {
                    this.animateLetterOut(current, i);
                }
                // Animate the letters in the next word.
                for (let i = 0; i < next.length; i++) {
                    this.animateLetterIn(next, i);
                }
                this.currentWord = (this.currentWord == this.settings.length) ? 1 : this.currentWord + 1;
            },

            animateLetterOut(current, index) {
                setTimeout(() => {
                    current[index].className = 'letter out';
                }, index * 300);
            },

            animateLetterIn(next, index) {
                setTimeout(() => {
                    next[index].className = 'letter in';
                }, 340 + (index * 300));
            }
        }
    }
</script>


<style lang="scss" scoped>
    #app-loading {
        font-size: 4rem;
    }

    .words, .word {
        border: 1px solid rosybrown;
    }

    .letter {
        text-decoration: underline; // Not working.
    }

    .letter.in {
        color: red; // Not working.
    }

    .letter.out {
        color: blue; // Not working.
    }
</style>
Run Code Online (Sandbox Code Playgroud)

是什么问题阻止了这些类的应用?

cri*_*ari 13

这对我有用:

<template>   
    <div class="a" v-html="content"></div> 
</template>

<script>   
    export default { 
        data() {
           return {
              content: 'this is a <a class="b">Test</a>',
           }
        },
    } 
</script>

<style scoped>   
.a ::v-deep .b { 
     color: red;
 }
</style>

Run Code Online (Sandbox Code Playgroud)


cee*_*yoz 9

您正在使用v-html,但这不适用于作用域样式

创建的 DOM 内容v-html不受范围样式的影响,但您仍然可以使用深度选择器设置它们的样式。


Meg*_*oje 5

是的,

v-html

不适用于范围样式。

正如 Brock Reece 在他的文章Scoped Styles with v-html中解释的那样,应该这样解决:

<template>   
    <div class="a" v-html="content"></div> 
</template>

<script>   
    export default { 
        data() {
           return {
              content: 'this is a <a class="b">Test</a>',
           }
        },
    } 
</script>

<style scoped>   
.a >>> .b {
color: red;   
}
</style>
Run Code Online (Sandbox Code Playgroud)