怎么给按钮添加CSS样式?

html-css028

怎么给按钮添加CSS样式?,第1张

给按钮添加css样式的方法:

添加方法:

1、.btn {BORDER-RIGHT: #7b9ebd 1px solid右边线

2、PADDING-RIGHT: 2px内边距 右

3、BORDER-TOP: #7b9ebd 1px solid上边线

4、PADDING-LEFT: 2px内边距 左

5、FONT-SIZE: 12px文字大小

6、BORDER-LEFT: #7b9ebd 1px solid左边线

7、CURSOR: hand鼠标移上去时,变成手形。

8、COLOR: black颜色黑 (表示文字颜色)

9、PADDING-TOP: 2px内边距 上

10、BORDER-BOTTOM: #7b9ebd 1px solid }底边线

扩展资料

CSS样式部分

大小 {font-size: 12px},x-large(特大) xx-small(极小) 一般中文用不到,只要用数值就可以,单位:PX、PD

样式 {font-style: oblique}(偏斜体) italic(斜体) normal(正常)

行高 {line-height: normal}(正常) 单位:PX、PD、EM

粗细 {font-weight: bold}(粗体) lighter(细体) normal(正常)

变体 {font-variant: small-caps}(小型大写字母) normal(正常)

大小写 {text-transform: capitalize}(首字母大写) uppercase(大写) lowercase(小写) none(无)

修饰 {text-decoration: underline}(下划线) overline(上划线) line-through(删除线) blink(闪烁)

常用字体: (font-family)

"Courier New", Courier, monospace, "Times New Roman", Times, serif, Arial, Helvetica, sans-serif, Verdana

背景属性: (background)

色彩 {background-color: #FFFFFF}

图片 {background-image: url()}

重复 {background-repeat: no-repeat}

滚动 {background-attachment: fixed}(固定) scroll(滚动)

位置 {background-position: left}(水平) top(垂直)

字间距 {letter-spacing: normal} 数值 /*这个属性有用,多实践下*/

对齐 {text-align: justify}(两端对齐) left(左对齐) right(右对齐) center(居中)

饿了么的Element组件库,我打算的是一个一个的尽量分析吧,因为只是分析,架构上可能会不太一样。官方的架构方法可以看 这篇文章 。

首先,我 不会使用lerna ,来管理多个独立的项目。只会类似于平时开发常用组件一样,把一个组件放在一个文件夹里面,这个组件需要的 scss, images 啊什么的,都放在一起。

其次,应该 不会使用postcss-salad,我会翻译成相同功能的scss 吧。分析的主要目的还是学习,所以怎么方便怎么来,只是看它实现的思路,不用太过于在意细节。

Button组件的分析,可以了解一些新的东西

1. 对于SCSS中mixin的使用,以及工具方法mix()

2. 对于loading字体图标的动画,animation, 无限次上下翻转

3. line-height设置没有单位的数值,会怎样计算行高

4. 对slot的使用,怎么利用$slots.default等

5. pointer-events的作用

6. 接口的设计思想,为什么字体图标和loading要分开写

首先声明一些常用的css属性值,归纳下有以下几类:

colors:

设定常见的颜色

border:

剩下的就是不同类型的按钮的color, fill, border颜色值了。

这两个值会在hover, focus等状态时,设置颜色使用。

首先看下Button组件的模板template

通用的css样式

好了,下面就来进入正题,Button组件的几个设计要点

1. button的尺寸大小

和Bootstrap一样,实现方法其实都是不同的尺寸大小,有不同的类名,设定不同的尺寸。对于Bootstrap,你可能需要显示的把类名写完整,而对于Vue组件,给props传入值就好了,会动态的生成不同的类名,相比更简单点。

我们仔细看button的公共样式,并没有设置宽高,对于大小有关的,就是line-height了,至于为什么是设置为 1,可以看 这篇

一句话总结就是,当line-height设没有单位的值的时候,就根据button的font-size,来计算高度,font-size有多大,button的行高就有多高。

接下来, button就给不同的大小,设定不同的上下左右padding 。这里就有一个需要注意的了,我们需要重复写很多相同的css吗,每个尺寸的类名下面都重新写一次padding, font-size, 当然不是!!!既然都用SCSS了,为什么不用 mixin 呢???

所以,写一个font-size的mixin:

但是,后面我就犯傻了,还是scss用的不熟练的原因,我想,既然large, small, mini都是差不多的,只是改变一点不同的地方,为什么不用循环呢???但是尝试了过后发现,好像并不可以,在循环的时候,通过循环的变量,动态改变css选择器可以,动态改变属性值也是可以的,但是对于已经定义好的变量,不能这样拼接。。。

2. button类型(颜色倾向)

同样,还是写一个mixin, 不过这里面有一个就是,在设置hover, focus状态的样式时,通过mix()函数来混合颜色,这个以前倒是没有用过。

3. 图标按钮和loading状态

这里面涉及了一个设计的问题,开始的时候我在考虑,为什么要加一个loading的prop呢?直接通过设置icon为loading也可以啊。

但是,想一下,在实际的应用中的使用场景,常常时点击后,ajax请求数据,完成后结束loading状态,所以,试想,到底是在这期间改变icon的值好呢,还是直接通过一个computed属性,动态设置loading的boolean值好呢???对吧,虽然只是很小的细节,但对于后面的使用来说,易用性完全不一样呐

还有一点,对于loading按钮,设置了css3属性,pointer-events: none,相当于直接去除了onclick点击效果。

4.内容分发slot

注意模板中的内容分发这句,其实 写的非常的漂亮!!!

想一想,我们要实现一个按钮组件,是不是需要一个slot来放外部环境传入的按钮文字。

接着,我们要实现图标按钮,图标和按钮文字之间肯定要隔一段距离啊,但是slot,css选择器没办法查找到啊,没办法,加个span标签包裹slot吧

看着好像差不多了,但是,如果图标按钮只有图标没有文字呢???图标按钮i后面接着的span标签还是会产生5px距离啊,button莫名就给撑开了。

所以啊,v-if 判断的用处就来了,通过判断$slots.default来判断有没有传入按钮文字,有,才添加span节点。。。。

6啊,对内容分发的理解又加深了很多啊!!!!

5.按钮组

其实,按钮组已经是一个新的组件了,相当于是组件之间的嵌套。

对于button-group组件中的button子组件,左浮动,清除圆角,再首尾按钮添加圆角。

对于button边框的间隔,首节点设置右边框,尾节点设置左边框,中间的margin-right: -1px, 就实现了按钮组中按钮间的1px白色边框间隔了。

CSS Modules 不是官方规范或浏览器中的实现,而是构建步骤中的一个过程(在 Webpack 或 Browserify 的帮助下),它改变了类名和选择器的作用域(即有点像命名空间)。

目的: 解决 CSS 中全局作用域的问题

在 React 中默认开启了 CSS Module,样式表文件需要以 xxx.module.sass/less/css 命名

我们也可以通过配置 webpack 来开启 CSS Module

webpack.config.js

localIdentName 可以定义生产的哈希类名,默认是 [hash:base64]

详细配置见: css-loader

localIdentName 选项的占位符有:

默认 CSS 的规则是全局生效的,任何一个组件下的 CSS 样式,都会影响其他组件中使用相同类名的地方。

style.css

App.js

Header.css

Header.js

index.js

此时我们的页面上展示的就是绿色的 Header 组件 和 Hello World

因为定义了两个相同的 title class,虽然是在不同的组件中导入,但是他们的类名是一样的,最终都会在全局作用域下生效,因为这两个组件都渲染在了页面上。

至于为什么会显示成绿色,因为 Header 组件是后导入的,所以 Header 的 title 样式就覆盖了 App 的 title 样式,这就是 CSS 层叠样式的概念了,此处不再赘述。(如果导入顺序换一下,那么就是红色了)

答案: 产生局部作用域的唯一方法,就是使用一个独一无二的 class 的名字,不会与其他选择器重名。这就是 CSS Modules 的做法。

这里就拿 React 项目来进行解释

在 React 中,默认是开启 CSS Module 的。但是对于样式表文件的命名一个约束。需要以 .module.less/css/sass 结尾

随意我们就可以这样改造一下 Header 组件,来使用 CSS Module 的功能。

效果: Header 组件 展示为绿色; Hello World 展示为红色。可以看到 Header 中相同类名的样式并没有影响到我们的 App 组件

此时在控制台中查看 HTML,发现我们 Header 组件中的 h2 标签上的 class 类名变成了 <h2class="_src_Header_module__title">Header 组件</h2>

同理在样式表文件中也变成了

App 组件

随机的 className 是可以配置的:通过 webpack.config.js 中配置 css-loader 的 localIdentName 选项来定义生成的随机类名

通常在我们的日常开发中有这种场景:

我们有一个自己的组件,但是这个组件使用了一些第三方的组件库,对于我们使用的第三方组件我们又想修改一下它的样式。

如果此时,我们直接在当前组件的样式文件中,通过定义一个和第三方组件相同类名的类(比如说 antd button 的 antdr-btn 类),然后写自己的样式:

Button.module.css

然后我在组件中导入

Button.js

此时我们会发现我们的修改并没有生效,为什么呢?原因就是最后我们导入的类名会被 css-loader 处理成一个随机的值,所以导致不再是 antdr-btn 。

那么我们如何实现在自定义组件中修改第三方组件的样式呢?

需要不对第三方组件的类名进行哈希,保留原始类名,才能起到样式覆盖的作用 :global

:global(.className)那么此时这个 className 即使是在组件的样式表中定义的也不会被添加 hash 值,所以就可以影响全局所有类名为 className 的样式

注意:

此时组件中对该类的样式修改会影响全局所有使用该类名的地方,所以为了将样式修改限制到本组件,一般推荐将:global 使用在组件自定义类名范围下,然后添加这个自定义类名到组件中

CSS Modules 还提供一种显式的局部作用域语法:local(.className),等同于.className(直接在样式文件中写.className)该类名在编译后会被添加 hash 值

在 CSS Modules 中,一个选择器可以继承另一个选择器的规则,这称为"组合"。

在 Header.module.css 中,让.title 继承.back 。

Header.module.css

Header.js

编译后

CSS

HTML

选择器也可以继承其他 CSS 文件里面的规则。

other.module.css

Header.module.css

注意:

导入的类名需要和被导入文件中的类名相同

编译之后的效果和 composes 同一个文件中的 class 效果相同