马黑黑 发表于 2023-5-16 21:24

css-doodle入门(八)

本帖最后由 马黑黑 于 2023-5-16 22:00 编辑 <br /><br /><style>
.papa > p { margin: 10px 0; }
.mama { margin-left: 40px; position: relative; }
.hCode, .hLineNum { padding: 10px; width: calc(100% - 40px); font: normal 16px/20px Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; background: #f9f9f9; box-sizing: border-box; overflow-x: auto; tab-size: 3; position: absolute; }
.hCode { left: 40px; margin-left: -40px; padding-left: 45px; }
.hLineNum { width: 40px; background: #ccc; border-right: 1px solid #ccc; text-align: right; pointer-events: none; }
.stage { display: grid; place-items: center; }
.hidden { display: none; }
</style>

<div class="papa">
        <p><strong>@use 属性及其应用</strong></p>
        <p>有时候我们需要设置多组 css-doodle 方案,以便在交互时使用。这时,我们可以把 css-doodle 的预设样式以 CSS变量 的形式写在 &lt;style&gt;...&lt;/style&gt; 标签中。一般地,我们需要借助伪类 :root {} 来封装 css-doodle 样式代码,:root 实际上匹配文档的根目录(html),是 html {} 选择器的替身,拥有极高的优先权。不过,css-doodle 的层叠样式代码也可以写在 body 或某一个父元素之下(如有)。以下 css-doodle 层叠样式代码写在 :root 伪类之下:</p>
        <div class="mama">
                <pre class="hCode">&lt;style&gt;
:root {
        --style1: (
                :doodle { @grid: 5 / 500px; gap: 1px; }
                background: gray;
        );
        --style2:(
                :doodle { @grid: 6 / 500px; gap: 1px; }
                @odd { background: tan; }
                @even { background: pink; }
        );
}
&lt;/style&gt;

&lt;css-doodle id="doo"&gt;
        @use: var(--style1);
&lt;/css-doodle&gt;

&lt;script&gt;
        let styles = ['style1','style2'], idx = 0;
        doo.onclick = () => {
                idx += idx === 0 ? 1 : -1;
                doo.use = `var(--${styles})`;
        }
&lt;/script&gt;</pre>
                <pre class="hLineNum"></pre>
        </div>
        <p><button class="btnok" type="button" value="运行代码">运行代码</button></p>
        <div class="stage"></div>
        <p>我们在 :root 伪类里设置了两组基于 css-doodle 的样式表,以 CSS变量 --style1 和 --style2 的方式存储标准的 css-doodle 代码,留待后面的 &lt;css-doodle&gt;...&lt;/css-doodle&gt; 标签使用。上述代码中,css-doodle 通过 @use 属性调用了两个样式中的一个,然后再通过 JS 的 css-doodle 窗体单击事件在两个样式中来回切换,大家可以运行代码后点击看看。</p>
        <p>css-doodle 支持多个 @use 属性共存。当同一个 css-doodle 存在多个 @use 属性,@use 所引用的样式可以用逗号隔开:</p>
        <div class="mama">
                <pre class="hCode">&lt;css-doodle&gt;
        @use: var(--style1), var(--style2);
&lt;/css-doole&gt;</pre>
                <pre class="hLineNum"></pre>
        </div>
        <p class="hidden"><button class="btnok" type="button" value="运行代码">运行代码</button></p>
        <div class="stage hidden"></div>
        <p>也可以分行写 @use 属性,行尾用分号 ; 结束:</p>
        <div class="mama">
                <pre class="hCode">&lt;css-doodle&gt;
        @use: var(--style1);
        @use: var(--style2);
&lt;/css-doole&gt;</pre>
                <pre class="hLineNum"></pre>
        </div>
        <p class="hidden"><button class="btnok" type="button" value="运行代码">运行代码</button></p>
        <div class="stage hidden"></div>
        <p>需要注意的是,如果两个样式中有相同的属性,则后面的属性会覆盖前面的属性。</p>
</div>

<script>

let script = document.createElement('script');
script.src = '/css-doodle.min.js';
document.head.appendChild(script);

let btns = document.querySelectorAll('.btnok'),
        stages = document.querySelectorAll('.stage'),
        hCodes = document.querySelectorAll('.hCode'),
        hLineNums = document.querySelectorAll('.hLineNum'),
        mamas = document.querySelectorAll('.mama');

hCodes.forEach((item,key) => {
        let lines = hCodes.innerText.trim().split('\n').length;
        let str = '';
        for(let i = 0; i < lines; i ++) {
                str += i + 1 + '\n';
        }
        hLineNums.innerText = str;
        mamas.style.cssText += `height: ${hCodes.offsetHeight + 20}px`;
        if(!btns) return;
        btns.onclick = () => {
                let val = btns.value;
                val === '运行代码' ? codeRun(hCodes.innerText, stages) : codeRun('',stages);
                btns.value = btns.innerText = val === '运行代码' ? '关闭运行' : '运行代码';
        };
});

let codeRun = (str,ele) => {
        let reg = /(<script(.*?)>)(.|\n)*?(<\/script>)/g;
        let js_str, html_str;
        if(str.match(reg) !== null) {
                js_str = str.match(reg);
                html_str = str.replace(js_str, '').trim();
                js_str = js_str.replace(/<[\/]{0,1}script[^>]*>/g,'').trim();
        } else {
                js_str = '';
                html_str = str.trim();
        }
        ele.innerHTML = html_str;
        let myfunc = new Function(js_str);
        myfunc();
};

</script>

起个网名好难 发表于 2023-5-16 21:40

css-doodle学习难度不小

马黑黑 发表于 2023-5-16 21:43

起个网名好难 发表于 2023-5-16 21:40
css-doodle学习难度不小

这个@use还好吧?目的其实也仅是能把样式写在 style 标签里

亦是金 发表于 2023-5-16 21:48

似懂非懂,跟着教程慢慢学!

马黑黑 发表于 2023-5-16 21:49

亦是金 发表于 2023-5-16 21:48
似懂非懂,跟着教程慢慢学!

晚上好

起个网名好难 发表于 2023-5-16 22:06

马黑黑 发表于 2023-5-16 21:43
这个@use还好吧?目的其实也仅是能把样式写在 style 标签里

不是指具体的而是整体来说,相当于把css混在html 标签里,难度较单一的css或 html 不是同一等级。

醉美水芙蓉 发表于 2023-5-16 22:07

马黑黑 发表于 2023-5-16 22:07

起个网名好难 发表于 2023-5-16 22:06
不是指具体的而是整体来说,相当于把css混在html 标签里,难度较单一的css或 html 不是同一等级。

倘若CSS和html基础好,这一切都不在话下吧。你在看其他的框架,都把HTML弄的面目全非了,所以很多人还是很怀念jQuery,希望它不倒下

马黑黑 发表于 2023-5-16 22:08

醉美水芙蓉 发表于 2023-5-16 22:07
黑黑老师做贴辛苦了!给老师点赞!

晚上好

红影 发表于 2023-5-16 22:10

在这个例子里,当把两个属性都写上去,显示的是style2的样子吧。

马黑黑 发表于 2023-5-16 22:13

红影 发表于 2023-5-16 22:10
在这个例子里,当把两个属性都写上去,显示的是style2的样子吧。

放在后面的,会覆盖前面的。例如:

<css-doodle>
        @use: var(--style2), var(--style1);
</css-doole>

则,如果 --style1 和 --style2 有相同的属性设置,--style1 的设置会覆盖 --style2 的设置。

起个网名好难 发表于 2023-5-16 22:15

马黑黑 发表于 2023-5-16 22:07
倘若CSS和html基础好,这一切都不在话下吧。你在看其他的框架,都把HTML弄的面目全非了,所以很多人还是 ...

好吧,习惯了css、html、 script 三段 ,这混在一起算是“搞脑子”吧。

马黑黑 发表于 2023-5-16 22:26

起个网名好难 发表于 2023-5-16 22:15
好吧,习惯了css、html、 script 三段 ,这混在一起算是“搞脑子”吧。

不过挺管用

起个网名好难 发表于 2023-5-16 22:37

马黑黑 发表于 2023-5-16 22:26
不过挺管用

好用的“非标件”

马黑黑 发表于 2023-5-16 22:38

起个网名好难 发表于 2023-5-16 22:37
好用的“非标件”

现在很火的非标件应用场景很宽广,很多开发都通它们

起个网名好难 发表于 2023-5-16 22:45

马黑黑 发表于 2023-5-16 22:38
现在很火的非标件应用场景很宽广,很多开发都通它们

这个是要承认,但对初学者就是“奢侈品”

南无月 发表于 2023-5-16 22:47

新课程带来新属性

马黑黑 发表于 2023-5-16 22:50

起个网名好难 发表于 2023-5-16 22:45
这个是要承认,但对初学者就是“奢侈品”

初学者先打好基础很重要。当然,需要快速做一样东西,从一个框架做起也未尝不可

马黑黑 发表于 2023-5-16 22:50

南无月 发表于 2023-5-16 22:47
新课程带来新属性

这个不是很难

起个网名好难 发表于 2023-5-16 22:55

马黑黑 发表于 2023-5-16 22:50
初学者先打好基础很重要。当然,需要快速做一样东西,从一个框架做起也未尝不可

基础不包括“非标件”
页: [1] 2 3 4
查看完整版本: css-doodle入门(八)