【译文】CSS技术:如何正确的塑造button样式!
, but useful for */
display: inline-block;
text-align: center;
text-decoration: none;
/* create a small space when buttons wrap on 2 lines */
margin: 2px 0;
/* invisible border (will be colored on hover/focus) */
border: solid 1px transparent;
border-radius: 4px;
/* size comes from text & padding (no width/height) */
padding: 0.5em 1em;
/* make sure colors have enough contrast! */
color: #ffffff;
background-color: #9555af;
}
.btn:active {
transform: translateY(1px);
filter: saturate(150%);
}
.btn:hover {
color: #9555af;
border-color: currentColor;
background-color: white;
}
/* inverse colors on mouse-over and focus */
.btn:hover,
.btn:focus {
color: #9555af;
border-color: currentColor;
background-color: white;
}
.btn {
/* ... */
/* all browsers: remove the default outline since
we are rolling our own focus styles */
outline: none;
}
/* Firefox: removes the inner border shown on focus */
.btn::-moz-focus-inner {
border: none;
}
-->
英文原文地址 https://fvsch.com/code/styling-buttons/
Styling buttons, the right way!
在本教程中我们将学习完成<a>和<button>的基本样式并进行css自定义
一 <button>样式重造
潜规则里,我们99%的点击事件都是<a>或<button>来承担的。如果你不清楚如何正确使用标签的话可以按下面的规矩来:
①如果即将跳转到其它页面或大幅修改当前页面的内容(ajax)就使用(<a href="some_url">…</a>).
②否则就使用(<button type="button">…</button>).
正确的使用标签有很多好处如①SEO-friendly ②方便键盘快捷键 ③用户体验更好
尽管如此,<button>标签还是被<div> <span> <a>等标签在很多情况下替代。
为什么<button>如此不被重用?
①了解程度: 许多开发者对此标签不了解(学习一下 HTML’s 100+ elements).
②样式复杂: <button> 自带复杂的默认样式,从而想获得较好的自定义样式比较困难
谢天谢地,我们可以 通过下面的代码对<button>进行重塑
/**
* Reset button styles.
* It takes a bit of work to achieve a neutral look.
*/
button {
padding: 0;
border: none;
font: inherit;
color: inherit;
background-color: transparent;
/* show a hand cursor on hover; some argue that we
should keep the default arrow cursor for buttons */
cursor: pointer;
}
完成后<button>标签显示如普通文本
button
这种方法的缺点是,现在我们必须在所有的按钮上设置CSS样式,否则用户将无法识别它们(参见:affordance)。
@mixin button-reset {
padding:;
border: none;
font: inherit;
color: inherit;
background-color: transparent;
cursor: pointer;
}
.my-custom-button {
@include button-reset;
padding: 10px;
background-color: skyblue;
}
<button type="button">
I use default browser styles
</button> <button type="button" class="my-custom-button">
And I’m using custom styles instead
</button>
二 自定义<button>css样式
我们上面已经移除了默认样式,现在我们来定义自己的button样式
①“button”样式可以被用于link或是button
②让样式变的可供选择,毕竟页面会存在各种各样的样式
使用class选择符 .btn (类似bootstrap中的使用)
.btn {
/* 默认为button 但是在<a>上依然有效 */
display: inline-block;
text-align: center;
text-decoration: none;
/* 创造上下间距一定的空间 */
margin: 2px 0;
/* border透明 (当鼠标悬停时上色) */
border: solid 1px transparent;
border-radius: 4px;
/* padding大小与字体大小相关 (no width/height) */
padding: 0.5em 1em;
/* 确保字体颜色和背景色有足够区分度! */
color: #ffffff;
background-color: #9555af;
}
高对比度! strong contrast (5.00):

避免如下! low, inaccessible contrast (2.30):

之所要避免第二种的低对比度图像
一方面,有的人可能视力有所欠缺;另一方面,即使是视力良好的朋友在阳光下看手机等情况也无法正常阅读。
可以通过这个网站完成对比度的测试 check your contrast ratios here
三 对button的hover,focus,active状态进行区分
由于button是一个需要交互的标签,用户在对button进行操作时肯定要得到反馈
浏览器本身对focus和active有默认的样式,但是我们的重置取消了这部分样式;因此我们需要添加一部分css代码完成这部分的操作,并让button变化的状态和我们此前的样式更搭!
①:active状态
/* old-school "的button位置下移+ 颜色饱和度增加 */
.btn:active {
transform: translateY(1px);
filter: saturate(150%);
}
②我们可以改变按钮的颜色,但是我想为悬停时保留这种样式:
/* 鼠标悬停时颜色反转 */
.btn:hover {
color: #9555af;
border-color: currentColor;
background-color: white;
}
③让我们增加focus样式,用户经常会用键盘或是虚拟键盘(ios或安卓等)来focus表单,button,links和其他一些交互性组件
一方面:这样可以加快交互效率
另一方面:对有的人而言,无法使用鼠标,那么就可能依赖键盘或是其他工具访问网站
在绝大多数我见过的项目中,设计师仅仅指定mouse-over样式而没有focus样式,我们应该怎么做呢?
答案:最简单的方法就是复用hover样式给focus
/* 复用样式 */
.btn:hover,
.btn:focus {
color: #9555af;
border-color: currentColor;
background-color: white;
}
④如果要用到focus样式,那么就需要移除浏览器button默认的样式(否则当button是focus或active状态下都会有outline边框)
.btn {
/* ... */
/* all browsers: 移除默认focus样式 */
outline: none;
}
/* Firefox: 移除默认focus样式 */
.btn::-moz-focus-inner {
border: none;
}
试一试效果,如果有键盘可以尝试用tab和shift+tab进行导航从而触发focus!
Hi, I’m a link And I’m a button
四 :active和:focus同时触发的问题!!
当我们对button进行点击时,active和focus伪类同时触发,在鼠标移开后,active伪类消失,但是focus样式还在,这种时候我们就需要点击其他地方才可以消除样式,很难受!
我们发现,有一种新的伪类:focus-visible pseudo-class (draft specification).
这个特性还没有完全确定,但是这个想法很好,是指浏览器应该只在键盘或键盘式交互之后出现:focus-visible,而鼠标点击无效。
但是由于多数浏览器还没有这个新特性,所有需要借助this polyfill.
该JS保证了后相兼容性
在引入该polyfill后
/*
保留键盘触发的focus,取消鼠标触发的focus
*/
.js-focus-visible :focus:not(.focus-visible) {
outline: none;
} /*
Optionally: Define a strong focus indicator for keyboard focus.
If you choose to skip this step then the browser's default focus
indicator will be displayed instead.
这段我不太清楚怎么翻译,,
*/
.js-focus-visible .focus-visible {
…
}
在本项目中首先对hover和focus解耦
/* inverse colors on hover */
.btn:hover {
color: #9050AA;
border-color: currentColor;
background-color: white;
} /* make sure we have a visible focus ring */
.btn:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(255, 105, 180, 0.5),
0 0 0 1.5px rgba(255, 105, 180, 0.5);
}
然后利用polyfill完成移除多余的鼠标focus效果
/* hide focus style if not from keyboard navigation */
.js-focus-visible .btn:focus:not(.focus-visible) {
box-shadow: none;
}
完成地址: look at the final code
只有键盘交互才会出现的focus样式!
【译文】CSS技术:如何正确的塑造button样式!的更多相关文章
- Css技术入门笔记01
在学习html的时候,html中的标签都具备了特定功能,或者含义,以及相应的样式效果.可是在有些时候我们可能仅仅希望使用 html标签把要显示的数据封装起来,而不需要任何的样式效果.这时就需要单独的标 ...
- 前端html、Javascript、CSS技术小结
简单地总结了一下前端用过的html.javascript.css技术,算是清点一下,做个大略的小结,为进一步的学习给个纲领. 一.HTML 由于HTML5的兴起,简单地判断一个网页是否是html5网页 ...
- 如何提升我的HTML&CSS技术,编写有结构的代码
前言 之前写了四篇HTML和CSS的知识点,也相当于是一个知识点汇总.有需要的可以收藏,平时开发过程中应该会遇到这些点,到时候再查看这些博客可能更容易理解.从这篇开始更多的介绍开发过程经常让人头痛的前 ...
- 【转】精选30个优秀的CSS技术和实例
今天,我为大家收集精选了30个使用纯CSS完成的强大实践的优秀CSS技术和实例,您将在这里发现很多与众不同的技术,比如:图片集.阴影效果.可扩展按钮.菜单等-这些实例都是使用纯CSS和HTML实现的. ...
- 精选30个优秀的CSS技术和实例
精选30个优秀的CSS技术和实例 投递人 墙头草 发布于 2008-12-06 20:57 评论(97) 有17487人阅读 原文链接 [收藏] « » 今天,我为大家收集精选了30个使用纯CSS ...
- CSS3-基于浮动的布局,响应式WEB设计,定位网页上的元素,设计打印页面的css技术
基于浮动的布局: 1.除非图片设置了宽度,否则始终应该要对浮动的图片设置一个宽度,这样可以让浏览器给其他内容腾出环绕的空间 2.当侧边栏的高度与主内容区的高度不一致的时候,可以用个margin进行调整 ...
- css技术和实例
今天,我为大家收集精选了30个使用纯CSS完成的强大实践的优秀CSS技术和实例,您将在这里发现很多与众不同的技术,比如:图片集.阴影效果.可扩展按钮.菜单等-这些实例都是使用纯CSS和HTML实现的. ...
- CSS 技术关键字
CSS 技术关键字 元素 替换元素 非替换元素------替换元素和非替换元素的分类是CSS范畴内的,其它的分类都不属于CSS定义的 替换元素和非替换元素的定义是出于“我 ...
- 进入html+css世界的正确姿势
今天,我带大家一起走进html+css的世界. HTML其实是HyperText Markup Language的缩写, 超文本标记语言.他是用于告诉浏览器这是一个网页, 也就是说告诉浏览器我是一个H ...
随机推荐
- 数据挖掘进阶之序列模式分析算法GSP的实现
序列模式分析算法GSP的实现 一.算法简介 序列模式定义:给定一个由不同序列组成的集合,其中,每个序列由不同的元素按顺序有序排列,每个元素由不同项目组成,同时给定一个用户指定的最小支持度阈值,序列模式 ...
- CentOS服务器下JavaEE环境搭建指南(远程桌面+JDK+Tomcat+MySQL)
--------------------------------------------------------------------------------1 系统设置:1.1 远程桌面设置:通过 ...
- rails4 中使用分页的方法
以前老版本的rails中默认自带分页方法,不过从rails2.0开始就将内置的分页pagination对象移除了,改以第三方gem提供支持.要在新的rails里使用分页也是非常简单啦,首先安装will ...
- angular中的jqLite的基本使用方法
angular.element() 参数要求是HTML string or DOMElement, angular.element 虽然很接近 jQuery,但是直接通过 HTML tag 去获取元素 ...
- ]Java 5|6 并发包介绍
ava.util.concurrent 包含许多线程安全.测试良好.高性能的并发构建块.不客气地说,创建 java.util.concurrent 的目的就是要实现 Collection 框架对数据结 ...
- 使用可变对象作为python函数默认参数引发的问题
写python的都知道,python函数或者方法可以使用默认参数,比如 1 def foo(arg=None): 2 print(arg) 3 4 foo() 5 6 foo("hello ...
- MLDS笔记:Generalization
1 泛化能力 用VC维来衡量一个模型的表达能力,比如2维线性模型的VC维为3. 在图1-2中,随便给啥训练数据该model都能learn起来. 从理论上来看,当2个model在训练数据上表现一样时,为 ...
- SystemJS to Webpack – Before You Begin
http://angularfirst.com/systemjs-to-webpack-before-you-begin/ This is a primer discussing why to mov ...
- 干货!从Tomcat执行流程了解jsp是如何被解析的,错误提示是哪里生成的。
一.关于Tomcat组成 先上张图: Tomcat组成: 1. Server:代表整个 servlet 容器,如Tomcat,JBoss之类的. 2. Service:它由一个或者多 ...
- unity做游戏常用功能实现(一)多方向同时输入也能让物体正常移动
-------小基原创,转载请给我一个面子 网上有很多讲输入控制如何移动,但是多数都是讲单一按下,对于同时按下2个或2个以上按键并没有说明怎么解决,这里小基研究了一下方便大家 (如果你直接写input ...