范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

如何写一份不错的CSS代码?

  背景介绍:当我们在从事大项目或团队开发工作时,我们经常会发现我们写的代码,凌乱、难以阅读并且难以扩展。尤其是当一段时候后我们回头再看自己的代码,必须回想起当初自己写的时候的思路才能看懂。
  因此,人们尝试在代码风格上保持统一,然而,最大的困难是:修改一个较小的问题,都可能创建更多丑陋的 hack,也可能 CSS 的小改变会影响 JavaScript 的功能。但是这些问题能在我们的项目开始的时候精心规划,就能很大程度上避免这些问题。今天就来讨论一下如何写一份不错的CSS代码  一个好的css代码是什么样的呢保持样式表可维护 保持代码可读性 保持样式表的可扩展性
  要保持良好的CSS代码,首先需要订立一致的CSS团队规范,这就必须从CSS架构讲起。 CSS架构
  目前CSS主要有以下五种设计架构 1. OOCSS
  面向对象的CSS, 结构和主题分离 - 减少对 HTML 结构的依赖 主题和主题分离 - 增加样式的复用性
  在OOCSS的基础上,出现了另一种设计模式 2. BEM
  也可以被当成一种命名规范,本质上使页面结构清晰
  块(Block)、元素(Element__)、修饰符(Modifier--)
  有以下几个规则 Block元素应该以元素本身的属性为主 Element则以元素位置和形状为主 Modifier则修饰当前的状态和主题 Element一定是在Block之中,而不能独立于Block之外 Modifier则更多的表示当前组件的形状和状态
  可以明显发现 结构清晰 定位迅速 功能明确
  在面对组件化的场景时,Block 代表逻辑上和功能上独立的页面组件。Element封装了行为(JavaScript)、模板、样式(CSS)和其他实现技术。
  举个例子 
  • en
  • ru
block-name__element-name--modifier-name--modifier-value   在React当中,也采用了这样的命名方式   BEMnaming工具 [1] ,提供BEM命名的检测   然而在面对大型的项目时CSS的凌乱也很难让开发者愿意在茫茫多的代码中寻找可复用的代码 3. SMACSS   (What’s Smacss)[https://smacss.com/]   设计的主要规范有三点: Categorizing CSS Rules(为css分类) Naming Rules(命名规范) Minimizing the Depth of Applicability(最小化适配深度)   为了实现清晰的CSS结构,将CSS分为 Base - 全局样式,如global-reset、normalize.css Layout - 页面布局,如grid Module - 组件布局 State - 元素状态,如visible、hidden Theme or Skin - 更多是具体主题的配置样式 JavaScript 勾子 (JavaScript hooks)   其中尤其建议JavaScript解除和样式的耦合   命名规范上出现了一些差异 .layout-header .is-hidden .theme-nav   最小化适配深度,减少html和css的耦合度,避免html的变动增加对css的影响 .sidebar ul h3 {} .side {}4. ITCSS   对CSS进行了更加详细的分层   如果从功能的角度上看呢,是将Base分成了Settings、Tools、Generic和Base,而Objects、Components和Trumps则分别对应Layout、Module、(State、Theme),而这样设计的好处在于可以将代码的复用性进一步提升 5. ACSS   一个样式属性一个类,其中的典型代表就是 TailwindCSS [2] ,缺点则是破坏了语义化.block{ display: block; } .hidden { display: none; } .p-2 { padding: 0.75rem; } .flex { display: flex; } .text-base { font-size: 1rem; } .bg-green-200 { background-color: #123456 } I am Ok   而上述的架构思想,更多则是需要团队成员的一致性认同,才能实现在代码风格上的统一。   除了这些开发自律性上的代码规范外,还有什么其他的方式来提升CSS质量呢? CSS预处理器   在预处理器中,同样提供了众多的方法来简化与控制CSS代码,以stylus为例 1. 变量font-size = 14px body font font-size Arial, sans-serif pad(types = padding, n = 5px) if padding in types padding n if margin in types margin n body pad() body pad(margin) body pad(padding margin, 10px) // Yields: body { padding: 5px; } body { margin: 5px; } body { padding: 10px; margin: 10px; }2. 函数 add(a, b = a) a + b add(10, 5) // => 15 get(hash, key) return pair[1] if pair[0] == key for pair in hash hash = (one 1) (two 2) (three 3) get(hash, two) // => 2 get(hash, three) // => 3 get(hash, something) // => null3. 内建函数// 提取颜色分量 red(#c00) // => 204 red(#000, 255) // => #f004. 插值// 属性插值 vendor(prop, args) -webkit-{prop} args -moz-{prop} args {prop} args border-radius() vendor("border-radius", arguments) box-shadow() vendor("box-shadow", arguments) button border-radius 1px 2px / 3px 4px // Yields: button { -webkit-border-radius: 1px 2px / 3px 4px; -moz-border-radius: 1px 2px / 3px 4px; border-radius: 1px 2px / 3px 4px; } // 选择器插值 table for row in 1 2 3 4 5 tr:nth-child({row}) height: 10px * row // Yields: table tr:nth-child(1) { height: 10px; } table tr:nth-child(2) { height: 20px; } table tr:nth-child(3) { height: 30px; } table tr:nth-child(4) { height: 40px; } table tr:nth-child(5) { height: 50px; } mySelectors = "#foo,#bar,.baz" {mySelectors} background: #000 Yields: #foo, #bar, .baz { background: #000; } // 对象插值 foo = { width: 10px, height: 20px, "&:hover": { padding: 0 } } .bar {foo} Yields: // => .bar { // width: 10px; // height: 20px; // } // .bar:hover { // padding: 0; // }5. @EXTEND form input[type=text] padding: 5px border: 1px solid #eee color: #ddd textarea @extends form input[type=text] padding: 10px //Yielding: form input[type=text], textarea { padding: 5px; border: 1px solid #eee; color: #ddd; } textarea { padding: 10px; }对于维护一份高质量的CSS代码,注释和间隔必不可少   以下是一种比较建议的注释和间隔方式,可以自行取用。 /*------------------------------------* #A-SECTION *------------------------------------*/ .selector { } /*------------------------------------* #ANOTHER-SECTION *------------------------------------*/ /** * Comment */ .another-selector { }   除了缩进,我们还可以通过在规则集之间自由而明智地使用空格来提供大量信息。我们用: 密切相关的规则集之间的一 (1) 条空行。 松散相关的规则集之间的两 (2) 条空行。 全新部分之间的五 (5) 行空行。 // good case /*------------------------------------* #FOO *------------------------------------*/ .foo { } .foo__bar { } .foo--baz { } // bad case .foo { } .foo__bar { } .foo--baz { }   同理,在html结构中,也可以使用同样的规则。   除了以上这些,还有众多的规范和优化可以继续探索,如选择器性能,CSS嵌套,有兴趣的读者可以继续探索   你会认为 CSS规范是一个有点宏大和不必要的概念:为什么这么简单、这么直接的东西需要像架构一样被设计成非常复杂的东西?!   正是因为CSS 的简单性、松散性和不守规矩的性质意味着在任何合理规模上管理(阅读、驯服)它的最佳方式是通过严格和特定的架构。坚实的架构可以帮助我们控制我们的特殊性,强制执行命名约定,管理我们的源代码顺序,创建一个健全的开发环境,并且通常使我们的 CSS 项目管理更加一致和舒适。   总的来说,可以依照一下几个规则订立团队/个人代码规范,保证代码的一致性 建议的几个原则单一职责原则: 每个 CSS 实现都必须有一个单一的责任。Correct: .button { font-family: Arial, sans-serif; border: 1px solid black; background: #fff; } .header__button { margin: 30px; position: relative; } Incorrect: .header__button { font-family: Arial, sans-serif; position: relative; border: 1px solid black; margin: 30px; }开闭原则: 元素应该通过修饰符扩展,而不是直接在原有基础上修改。Original: .button { font-family: Arial, sans-serif; text-align: center; font-size: 11px; line-height: 20px; } Extend .button { font-family: Arial, sans-serif; text-align: center; font-size: 11px; line-height: 20px; } .button_size_s { font-size: 13px; line-height: 24px; }DRY原则:将有意义的重复规范化和抽象化巧用mixin和extend @mixin my-web-font() { font-family: "My Web Font", sans-serif; font-weight: bold; } .btn { display: inline-block; padding: 1em 2em; @include my-web-font(); } .foo { color: red; } .bar { @extend .foo; }组合优于继承和关注点分离// 将写js的方式同样适用在css上
...
...
参考文献   BEM简介 [3]   OOCSS介绍 [4]   探索 SMACSS:可扩展的模块化 CSS 框架 [5]   编写高效的 CSS 选择器 [6]   CSS的单一原则 [7]   思考CSS架构 [8] 参考资料   [1]BEMnaming工具: https://github.com/bem/bem-sdk#naming   [2]TailwindCSS: https://www.tailwindcss.cn/   [3]BEM简介: https://en.bem.info/methodology/quick-start/   [4]OOCSS介绍: http://oocss.org/   [5]探索 SMACSS:可扩展的模块化 CSS 框架: https://zhuanlan.zhihu.com/p/44851489   [6]编写高效的 CSS 选择器: https://csswizardry.com/2011/09/writing-efficient-css-selectors/   [7]CSS的单一原则: https://csswizardry.com/2012/04/the-single-responsibility-principle-applied-to-css/   [8]思考CSS架构: https://zhuanlan.zhihu.com/p/32952130

Python获取屏幕截图的几种方法Python获取电脑截图有多种方式,具体如下PIL中的ImageGrab模块windowsAPIPyQtpyautogui使用Selenium截图PIL中的ImageGrab模块i有什么可以提取视频音频的软件或方法?很荣幸回答你的问题,这个很简单呀,1你可以边播放边使用录音软件录下来。2你可以把视频导入PR这个剪辑软件,然后视频音频解除,删除视频只导出音频就可以了呀。3可以使用音频软件处理。希为什么中画幅相机画质更好,反而全画幅相机却一直是主流器材?中画幅画质好,这是一个不争的事实。但是中画幅也有一个明显的缺点,那就是体积过于庞大,重量也不轻,移动起来不是很方便。因为画幅大,镜头口径挺大,所以配套的镜头成本也较高,价格昂贵。之当下综合实力最强的四款手机,你在用吗?刚进入2022年,安卓手机厂商就接连发布新机了,一款又一款的骁龙8Gen1手机入市,也不乏有性价比高的骁龙870新机出现。国产手机都有一个共同特点,都将精力放在了提升散热升级快充和机械硬盘已死?固态硬盘全民化即将到来大家好,我是波导终结者。平时一直都有做一些视频剪辑的工作,出于省事(其实是懒),一直都是直接把源下载到仓库盘,然后在上面直接剪辑输出,很长一段时间用得还挺好的。前不久有一批源来,我华为服务真不错,荣耀10还免费检测维修用了3年的荣耀10,上次拿来开机,有点卡,经常重启。以前用过一次华为寄修服务,来回快递免费,用的还是原厂配件,或原厂维修,想着修一下给小孩学习用,然后又使用华为寄修服务,到了指定点Mate40Pro终于现货供应,价格有所松动,比Mate50系列更值得时间来到2022年之后,各家手机厂商都开始迅速发力,都陆续发布自己的相关年度旗舰,像小米的12系列,iQOO的iQOO9系列,可以说都是这些手机厂商整个上半年主打产品,换句话不管是2022年装机攻略一文通含显卡涨价分析电脑替代方案避雷参考装机难,天下苦30系显卡高价久矣!2017是内存翻3倍,2019年后开始显卡节节攀高,到了2021年3月离谱之大离谱到了顶峰,直到2021下半年也没有恢复到原价的希望。这篇文章,对华为Mate40Pro最新售价确认,开年已跌至新低,花粉可以入手了国内多家手机厂商在发布搭载骁龙8Gen1处理器新旗舰的时候,都在强调自家的手机采用了什么新型的散热技术,甚至讲解散热技术的时间比讲解骁龙8Gen1处理器要长得多,之所以会出现这种情新风系统中的地送风vs顶送风,到底哪种更好?居住环境的提高,促使了人们对生活品质要求越来越高,舒适家居产品不断的走入人们的日常生活中。经过疫情的不断重创,产品如何满足消费者对智能健康舒适的需求尤为迫切。新风系统作为绿色家电中x264码率控制问题在做视频编码时,当我们给定编码器一个目标码率的时候,编码器内部是怎么达到码率要求的那?概况关于码率控制有两个目的,第一兼容传输,播放条件。第二获取更高的视频质量。码率控制分为两
大赢家说破了4个人生真相,说好的喜剧我却再也笑不出来如果生活不尽人意,那我们就在努力一点环境影响,原本准备上映的院线电影有的已经在网络平台上线,比如已经上线的囧妈和今天要说的这个由大鹏和柳岩领衔主演的大赢家。稍微不同的是大赢家在豆瓣哪些极简的人生建议永远都不要做的事1跟知己上床。2和情人结婚。3把同事当成朋友。4到朋友公司打工。5在上司面前知无不言。6轻信上司的许诺。7喜怒哀乐都挂在脸上。8在人堆里大声讲手机。9习惯于给自己找价格实惠不代表不好用!数码大V主力耳机仅999元?近日,OPPO旗下的旗舰真无线降噪耳机OPPOEncoX发布了全新的蓝调配色,让这款产品再次引起耳机圈的关注。相信最近想入手真无线降噪耳机的小伙伴对它都是比较感兴趣的,今天我们就先OPPOEnco新品无线耳机口碑出炉,数码大V也忍不住点赞随着618年中大促的火热进行时,不少商家都推出了各种促销购物活动,吸引到了广大消费者的关注。而电子产品作为比较热门的品类,更是得到了众多消费者的青睐,从智能手机到电视电脑,再到无线重新颠覆你对移动电源的认知,Omni20移动电源新体验前言21世纪可以说是一个智能化科技爆发的新时代,越来越多的智能电子产品不断地出现在大众的视野成为了人们日常生活中不可缺少的一部份。现在我们的生活已经离不开这些电子产品,在享受各种智智能手机卡片数码相机和单反的差别到底在哪里?现在,智能手机的拍照功能越来越强大了,目前很多手机的像素动辄就四五千万到五六千万,而小米还推出了上亿像素的智能手机。而且智能手机的摄像能力也在大幅度提升,现在很多手机都有了4K摄像状态管理(1)概述1Flink中的状态A。算子状态(OperatiorState)B。键控状态(KeyedState)状态后端(StateBackends)用作状态管理流式处理(A。可以是无状态(基sparkSQL电商用户画像(六)之用户画像开发(订单宽表)7。3用户画像开发订单表宽表订单宽表模型createdatabaseifnotexistsgdmcreatetableifnotexistsgdm。itcastgdmorder(o从FF91售罄,到特斯拉净利润超10亿美元,新能源市场有多热?近几年,随着特斯拉小鹏蔚来理想等新能源汽车的快速发展,新能源汽车行业逐渐成为了网络上的热词。而随着市场经济的快速发展以及政策的引导,越来越多的企业加入到了新能源汽车大战中。比如,前旗舰新品发布扎堆?荣耀小米等产品正在来的路上最近有不少小伙伴私聊我希望换一部综合性能不错的手机。相比较下,目前市面上的产品合适的还比较少,要不然就是合适的价格偏高,要不然就是价格合适却性能不够。当然了,如果不着急换机的朋友可Flink操练(三十一)之自定义键控状态(一)之ValueState1介绍ValueStateT保存单个的值,值的类型为T。get操作ValueState。value()set操作ValueState。update(valueT)2求当key出现了