当前位置: 首页 > Web前端 > CSS

FunctionalCSS:从尝试改进可重用CSS开始

时间:2023-03-30 16:51:01 CSS

从尝试改进可重用CSS开始做破雪4K视频回想每次更新破雪网站,最让我头疼的就是重写CSS。在不同的阶段,对CSS的不断深入理解,网站内容的调整,UI复用的需要,都会影响到CSS的写法。因此,一不小心,你的代码理解就会充满各种风格和风格。各种功能的CSS,一想到这些就很不爽。因此,我将一些经验分享给大家,如何理解CSS,以及如何更有效地编写CSS。让我们从基于语义的CSS开始首先,让我们从最简单的例子开始。回想一下您的第一个CSS示例,它必须类似于以下内容。所谓CSS表达了页面DOM的样式:Helloworld!

然后,在text-center中,我们指定文本居中对齐的样式:.text-center{text-align:center;}很简单吧?随着写的样式越来越多,我们很快就会开始关注写CSS的一些建议。例如:HTML和CSS的职责应该分开。HTML不应包含任何与特定样式相关的信息(例如居中对齐),这些特定样式应在CSS中处理。因此,我们开始尝试用它所表达的语义来代替该样式所表达的具体样式:Helloworld!

这看起来好多了。无论.greeting指定的具体样式如何,都不会影响HTML中问候消息样式的含义。这样,理论上我们就可以使用一套HTML模板来实现各种UI风格。因此,我们开始基于这种语义方法编写各种接口。比如我们添加一个代表视频作者的信息卡片,它的HTML模板如下:

Mars

boxue.io的创建者。blablabla...

同样,在这个模板中,creator-info是一种根据语义命名的样式。接下来就是这个样式的实现:.creator-info{background-color:white;边框:1px实心rgba(0,0,0,0.1);边界半径:4px;框阴影:02px4pxrgba(0,0,0,0.1);溢出:隐藏;>img{显示:块;宽度:100%;高度:自动;}>div{填充:1rem;>h2{字体大小:1.25rem;颜色:rgba(0,0,0,0.8);}>p{字体大小:1rem;:RGBA(0,0,0,0.75);行高:1.5;看起来是这样的:在这里,我们关注的不是这些样式的具体内容,而是这个CSS的结构,如果我们把具体的样式都去掉,你会发现这个样式严重依赖于HTML中DOM的层次结构:.creator-info>img>div>h2>p因此,尽管在HTML中在中,我们依靠基于语义的样式来剥离CSS,但这种方法很容易在CSS中暴露过多与HTML相关的细节。因此,这种做法实际上并没有完全达到剥离CSS和HTML职责的目的。我们需要更好的实践。将样式与DOM结构分离为了避免样式依赖于DOM结构的问题,我们的想法是:让样式的命名方式兼具格式和语义的功能。然后,在DOM中,对不同位置的元素使用相应的样式。这里,我们借鉴BEM的命名方式,对于我们要使用的样式名称,统一使用这种命名格式:subject-subject-dependentcontent__contentattribute:Marsboxue.io的创建者。Blablabla...

这一次,我们为DOM中每个需要样式的元素绑定一个具有特定命名规则的样式。这样,在样式表中,所有的样式都可以是一个扁平的结构:.creator-info{background-color:white;边框:1px实心rgba(0,0,0,0.1);边界半径:4px;框阴影:02px4pxrgba(0,0,0,0.1);溢出:隐藏;}.creator-info__image{显示:块;宽度:100%;height:auto;}.creator-info__content{padding:1rem;}.creator-info__name{font-size:1.25rem;颜色:rgba(0,0,0,0.8);}.creator-info__description{字体大小:1rem;颜色:rgba(0,0,0,0.75);line-height:1.5;}还记得我在修改完博学网站的样式后着实兴奋了一阵子,因为这种方法似乎彻底解决了HTML模板和CSS相互依赖的问题。处理重复的界面布局但是没过多久我又发现了新的问题。当我在首页为每个视频系列编写UI组件时,从结构上讲,它与之前的作者信息卡几乎相同。所以我几乎不假思索地写了这个HTML模板:me/YourFirstMLProject@2x-911fdc56906f05fc0757e5577084c840.jpg"alt="">从头开始机器学习让我们从头开始创建一个真实世界的机器学习演示。

它还包括封面图片、标题和介绍。只是我们将样式名称的主题从创作者更改为系列。然而,当我要为这些新样式设置值时,我就有点纠结了。如何设置这些series-***的样式?您可能有两个选择。第一种,也是最直接的方法,就是根据creator-***复制series-***。这个肯定可以,但是估计没有多少人会认同这种做法,因为它违背了Don'tRepeatYourself的原则;第二种,如果使用SCSS,可以实现继承某种样式的用法:.series-info{@extend.creator-info;}.series-info__image{@extend.creator-info__image;}.series-info__content{@extend.creator-info__content;}.series-info__name{@extend.creator-info__name;}.series-info__description{@extend.creator-info__description;}但这样做有其自身的问题,@extend应该只在两者之间使用彼此相关的样式,不仅仅是为了避免重复编写相同的样式。而且,如果我们以后想要视频信息卡怎么办?这些选择器是否真的需要使用相同的样式?显然,目前这个方案还不够理想。去除过于详细的语义事实上,样式之所以难以重用,是因为选择器表达的语义过于详细。语义越细化,重用就越难。因此,我们只需要绑定这个类似界面布局UI的选择器,给它起一个名字来代替creator或者series之类的名字:.media-card{background-color:white;border:1pxsolidrgba(0,0,0,0.1);边界半径:4px;框阴影:02px4pxrgba(0,0,0,0.1);溢出:隐藏;}.media-card__image{显示:块;宽度:100%;高度:自动;}.media-card__content{填充:1rem;}.media-card__name{字体大小:1.25rem;颜色:rgba(0,0,0,0.8);}.media-card__description{字体大小:1rem;颜色:rgba(0,0,0,0.75);line-height:1.5;}这样作者信息和视频系列信息都可以用同一种风格来表达:从头开始机器学习让我们创建一个真实世界的机器我从头开始学习演示。

甚至,只要UI布局与media-card描述的系统相同,就可以直接复用这套样式。但这就是故事的结局吗??显然不是,现在,你可能又在想:如果我们需要修改作者卡片的样式,但仍然保留视频系列卡片的样式怎么办?如果像以前一样,他们的样式是独立的,修改相应的样式即可。现在他们共享样式,我不仅要创建新样式,还要修改它们以及相应的HTML。这真的好吗?事实上,根本就没有绝对的职责分离。要回答这个问题,还得回到本节开头提出的目的:HTML和CSS职责分离。面对这个话题,我们直觉上认为只有把它完全剥离才能达到目的。但实际情况是,两者根本就不能完全分开。我们只能根据自己项目的实际情况选择适合自己的方法。对于那些有详细语义的样式(.creator-info和.series-info),此时HTML是独立的,它并不关心这些DOM会是什么样子。它只暴露了一个接口,让我们可以在里面自定义样式。因此,这种选择下的CSS并不是独立的,它依赖于样式所绑定的HTML,需要以HTML为参考来定义样式的内容。对于那些具有中性语义的样式(.media-card),此时CSS是独立的,它并不关心它会用在什么元素上。此时,HTML并不是独立的,它需要知道样式表提供了哪些内容,并根据这些内容,来安排DOM。其实这两种方法,并没有绝对的哪个更好的问题。只是你要弄清楚哪种方法更适合你的项目。下一步是什么?看到这里,如果你和我之前有过类似的困惑,那么现在,你应该迫不及待地调整自己的CSS了。别着急,下一节我们会继续讨论如何通过合理的命名来最大化样式的复用性。