马黑黑 发表于 2023-4-12 07:45

css-doodle入门(三)

css-doodle入门(三)

css-doodle的选择器

我们已经知道,css-doodle 是基于CSS的,因此它和CSS一样,建立了自己的若干选择器。css-doodle 选择器遵循 CSS选择器的语法,选择器名称之后用一对花括号 {} 将选择器的属性集合包裹起来;同时,css-doodle 的选择器都有前缀,特殊选择器用小角冒号 : 、其他用 @ 。目前官网介绍的 css-doodle 共9个。

① :doodle

这个第一讲已经介绍,这里再加强一下。:doodle 是 css-doodle 构建的图形图表效果所依托的父元素,它里面设定的是自己的属性和约束子元素的属性。参考以下代码:

<css-doodle>
        :doodle {
                width: 300px;
                height: 300px;
                border-radius: 50%;
                border: 1px solid cyan;
        }
</css-doodle>

这组代码,选择器 :doodle {} 代码块里的属性表述全部是CSS规范,宽高以及边框的设定,都是基于 css-doodle 主元素的。运行以上代码,我们得到的是一个300x300、1像素边框的圆圈。

请再参考下一组代码:

<css-doodle>
        :doodle {
                @grid: 6 / 300px;
                border-radius: 50%;
                border: 1px solid cyan;
                grid-gap: 1px;
        }
        background: lightsteelblue;
</css-doodle>

这组代码,:doodle 选择器设置了 6x6 的网格(@grid属性),且设置了网格行列间隙(grid-gap),这两个属性设置,用于规范子元素(单元格)。子元素的背景色 background 属性写在 :doodlbe {} 代码块之后,这里使用了淡钢蓝色 lightsteelblue。

(广告时间到了:运行以上代码,请访问 http://mahei.freeee.ml/api/pencilcode/pencilcode-ddl.html)


② :container

如果 :doodle 选择器是爹地,那么,:container 则是妈咪 。为啥?:container 选择器才是真正的容器,是它容纳了所有的单元格。不过呢,虽然妈咪下得了厨房上得了厅堂却不经常出现,主要任务是相夫教子,仅在一些需要的情形才会出来遛一遛,比方说,插播广告前的那一组代码,假如我们希望所有的子元素作为一个整体旋转45度,可以让妈咪来完成,而不必每个孩子都旋转(每个孩子的动作也未必能跟随妈咪的动作整齐划一):

<css-doodle>
        :doodle {
                @grid: 6 / 300px;
                border-radius: 50%;
                border: 1px solid cyan;
                grid-gap: 1px;
        }
        :container {
                transform: rotate(45deg);
        }
        background: lightsteelblue;
</css-doodle>

:container 这位妈咪其实也挺厉害,:doodble 爹地的设置,其实也可以在它这里设置,只不过,在家从父嫁人从夫,它完全继承了 :doodle 的属性,所以不必要重复设置,或者,它没必要上厅堂时,它就没必要露面,一切交由 :doodle 爹地处理好了。

至此,两个父辈级别的选择器介绍完了。请特别注意,作为 css-doodle 选择器,这两个选择器的前缀使用的是冒号,往下的选择器都是用 @ 做前缀,@ 就是 at 也读 at。

③ @nth

@nth 借鉴 CSS 伪类 nth 命名,道理也一致。比如,@nth(6) 就表示是第六个单元格:

<css-doodle>
        :doodle {
                @grid: 4 / 300px;
                grid-gap: 1px;
        }
        background: lightsteelblue;
        @nth(6) { background: purple; }
</css-doodle>

代码中,@nth(6) {...} 写在了 :doodle {} 代码块之外,因为它是用来设置子元素(单元格)的,不能再爸爸的房间 {} 里。@nth(6) 属性里,我们将第六个单元格设置为紫色背景色。

@nth(n) 支持 CSS 的常用表达,例如 @nth(3n+2),n 从 0 开始算,一路按式子计算下去。

④@even 和 ⑤@odd

次序为偶数的单元格,用 @even {} 来设置:

        @even {
                background: #ccc;
        }

次序为奇数的单元格,用 @odd {} 选择器设置:

        @even {
                background: pink;
        }

以上代码都可以加入到前面的代码中测试,放在 <css-doodle> 和 </css-doodle>之内、 :doodle {} 代码块之后。下同。

⑥ @at(row,col)

在第几行、第几列。例如:

        @at(2,4) {
                cursor: pointer;
        }
        @at(2,4) {
                :hover { background: black; }
        }

这些代码表示:第二列第四行的单元格呈现手型图标,鼠标指针划过时背景色变为黑色。

⑦ @random

随机选择单元格:

        @random {
                transform: scale(.8);
        }

这将随机地选取一些单元格,令其缩小 0.8 倍。

@random 属性可以带随机数比率值,缺省(和缺省)值是 0.5,值在 0 和 1 之间(含头尾0和1)必要时可以自己设定:@random(.8) {...};

⑧ @row(n, ...) 和 ⑨ @col(n, ...)

选择网格地几行和第几列,可以单选、多选:

<css-doodle>
        :doodle {
                @grid: 6 / 300px;
                grid-gap: 1px;
        }
        background: lightsteelblue;
        @row(2) { background: blue; }
        @col(1,3,5) { background: green; }
</css-doodle>

这将使得 6x6 的 网格中第二行单元格为蓝色、第一、三、五列为绿色,因为列设置在后,第二行的单元格中,与一、三、五列交叉的单元格背景被列的设置(绿色)所覆盖。

@row() 和 @col 选择器支持偶数、奇数表达,以 @col 为例举个栗子:

        @col(odd) { background: green; }

这将第一、三、五、七 …… 列背景色设置为绿色。

css-doodle 的九个选择器介绍完了,了解之后应一一进一步熟悉、掌握。

雨中悄然 发表于 2023-4-12 08:41

第二遍看完了,反正没完,肯定得常来翻看。{:4_173:}

红影 发表于 2023-4-12 09:40

@at(2,4)这个最奇怪,我以为是第二行第四列,结果是第二列第四行的单元格。
习惯了是行先开始数的,遇到这个有点蒙。{:4_203:}

红影 发表于 2023-4-12 09:43

@random这个最是不可控,去运行代码,运行一次,就变化一次,想做某个特定的效果,肯定不敢选它{:4_173:}

红影 发表于 2023-4-12 09:45

黑黑的介绍妙趣横生,尤其对容器:container 是妈咪的这段,边笑边就看懂了{:4_173:}

马黑黑 发表于 2023-4-12 12:57

红影 发表于 2023-4-12 09:45
黑黑的介绍妙趣横生,尤其对容器:container 是妈咪的这段,边笑边就看懂了

我没有深入到源码,只是根据它的介绍和示例这么理解

马黑黑 发表于 2023-4-12 12:57

红影 发表于 2023-4-12 09:43
@random这个最是不可控,去运行代码,运行一次,就变化一次,想做某个特定的效果,肯定不敢选它

随机选取单元格,这有特殊用途

马黑黑 发表于 2023-4-12 13:00

红影 发表于 2023-4-12 09:40
@at(2,4)这个最奇怪,我以为是第二行第四列,结果是第二列第四行的单元格。
习惯了是行先开始数的,遇到这 ...

原生 grid 某些设置,也是先列后行或先纵向后横向,例如,place-items: center start; 这几句,定义了垂直方向居中、水平方向左对齐,估计 css-doodle 源于此二设定,不过不同版本估计会有不同的定义,先看看。

马黑黑 发表于 2023-4-12 13:01

雨中悄然 发表于 2023-4-12 08:41
第二遍看完了,反正没完,肯定得常来翻看。

慢慢去尝试、消化,反正不多

樵歌 发表于 2023-4-12 14:36

天书天书又见天书{:4_203:}

马黑黑 发表于 2023-4-12 19:05

樵歌 发表于 2023-4-12 14:36
天书天书又见天书

这世上没有天书

雨中悄然 发表于 2023-4-12 19:30

马黑黑 发表于 2023-4-12 13:01
慢慢去尝试、消化,反正不多

看字理解有感觉,挺耐看的。
老师教程写得详细,幽默,通俗形象。
配上代码演示更是好玩。
我跟这些单词脸盲{:4_170:},得多认几遍才行。

马黑黑 发表于 2023-4-12 19:43

雨中悄然 发表于 2023-4-12 19:30
看字理解有感觉,挺耐看的。
老师教程写得详细,幽默,通俗形象。
配上代码演示更是好玩。


对。懂单词在编程中很重要。比方讲,你若知道 shape 是形状的意思,那么,@shape 属性就难不倒你。

雨中悄然 发表于 2023-4-12 19:52

马黑黑 发表于 2023-4-12 19:43
对。懂单词在编程中很重要。比方讲,你若知道 shape 是形状的意思,那么,@shape 属性就难不倒你。

就是这个道理。其实常用单词差不多就那些。
不过呢,没事,时间长着呢,慢慢认。{:4_170:}

红影 发表于 2023-4-12 22:25

马黑黑 发表于 2023-4-12 12:57
我没有深入到源码,只是根据它的介绍和示例这么理解

黑黑的介绍更生动,特别好{:4_199:}

红影 发表于 2023-4-12 22:25

马黑黑 发表于 2023-4-12 12:57
随机选取单元格,这有特殊用途

嗯,这个肯定是特殊时候才用到的功能。

红影 发表于 2023-4-12 22:26

马黑黑 发表于 2023-4-12 13:00
原生 grid 某些设置,也是先列后行或先纵向后横向,例如,place-items: center start; 这几句,定义了垂 ...

嗯嗯,这个需要单独去记忆了。

马黑黑 发表于 2023-4-12 22:53

红影 发表于 2023-4-12 22:26
嗯嗯,这个需要单独去记忆了。

总有一些定义会让人觉得不合理

马黑黑 发表于 2023-4-12 22:54

红影 发表于 2023-4-12 22:25
嗯,这个肯定是特殊时候才用到的功能。

深度开发都会用到

红影 发表于 2023-4-12 22:58

马黑黑 发表于 2023-4-12 22:53
总有一些定义会让人觉得不合理

是啊,和习惯不一样了。
页: [1] 2 3
查看完整版本: css-doodle入门(三)