css组件实战--实用组件篇

写在前面:上一次介绍了下css3组件实战--绚丽效果篇,那篇文章主要是介绍了几个效果比较风骚但相对用的不多的几个组件,这一次介绍几个平时用的比较多的几个实用组件

一.鼠标划过光影效果
当鼠标移动到图片上时,有一道白光从图片上划过,犹如刀光剑影。

鼠标划过光影效果

1.HTML模板

我们要放置一张图片,用一个div包裹起来:

<div class="highlight-box">
    ![](images/example.jpg)
</div>

2.设置图片CSS样式

.highlight-box {
    width: 500px;
    height: 300px;
    overflow: hidden;
    position: relative;
}

.highlight-box img {
    width: 100%;
    height: 100%;
}

3.接着制作白光,这里要用到强大的伪元素:before选择器:

.highlight-box:before {
    display: block;
    /*注意这里top和left,让白光移动到图片左上角,
    后续的划过动画也是依靠这两个属性*/
    top: -200%;
    left: -100%;
    /*定义白光的宽高*/
    width: 50%;
    height: 300%;
    /*旋转角度,你也可以调整*/
    -webkit-transform: rotate(45deg);
    transform: rotate(45deg);
    /*使用渐变来实现白光*/
    background: -webkit-linear-gradient(left, rgba(255, 255, 255, .05) 20%, 
            rgba(255, 255, 255, .6) 65%, rgba(255, 255, 255, .05) 100%);
    background: linear-gradient(left, rgba(255, 255, 255, .05) 20%,
            rgba(255, 255, 255, .6) 65%, rgba(255, 255, 255, .05) 100%);
    content: '';
    z-index: 2;
    position: absolute;
}

这里使用渐变(linear-gradient)来实现白光效果,同时为了斜向划过,使用transform: rotate(45deg)将其旋转45度。
上面的height、width、top和left,你也可以使用具体的像素值,建议采用百分比。

4.最后一步,让白光动起来:

.highlight-box:hover:before {
    animation: cross 1s linear;
}

@keyframes cross {
    0% {
        top: -200%;
        left: -100%;
    }
    100% {
        top: -50px;
        left: 100%;
    }
}

需要改变的只是top和left的值,也就是让白光从左上角向右下角移动。

二.仿loading动态效果
一般loading是用图片来实现的,这里使用纯css来仿写这个图片效果。

仿loading动态效果

1.HTML模板

我们需要一个div,里面放置子元素。

<div class="loader circle-line small">
     <span></span>
        <span></span>
       <span></span>
       <span></span>
      <span></span>
      <span></span>
</div>

2.设置CSS样式
先制作静态的loading
其实,是通过转换不同span之间的位置和角度来实现:

.loader { position: relative; width: 5rem; height: 5rem;}.loader.circle-line span { position: absolute; display: inline-block; width: 1.5rem; height: .5rem; border-top-left-radius: .25rem; border-bottom-left-radius: .25rem; background: red;}.loader.circle-line span:nth-child(1) { top: 50%; left: 0; margin-top: -.25rem;}.loader.circle-line span:nth-child(2) { top: 1rem; left: .5rem; -webkit-transform: rotate(45deg); transform: rotate(45deg);}.loader.circle-line span:nth-child(3) { left: 50%; top: .5rem; margin-left: -.75rem; -webkit-transform: rotate(90deg); transform: rotate(90deg);}.loader.circle-line span:nth-child(4) { right: .5rem; top: 1rem; -webkit-transform: rotate(145deg); transform: rotate(145deg);}.loader.circle-line span:nth-child(5) { left: 3.5rem; top: 50%; margin-top: -.25rem; -webkit-transform: rotate(180deg); transform: rotate(180deg);}.loader.circle-line span:nth-child(6) { bottom: 1rem; right: .5rem; -webkit-transform: rotate(-145deg); transform: rotate(-145deg);}.loader.circle-line span:nth-child(7) { left: 50%; bottom: .5rem; margin-left: -15px; -webkit-transform: rotate(-90deg); transform: rotate(-90deg);}.loader.circle-line span:nth-child(8) { bottom: 1rem; left: .5rem; -webkit-transform: rotate(-45deg); transform: rotate(-45deg);}

静态的loading已经有了,现在我们需要添加动画让其真实地动起来:

创建一个名为circle-line的动画(改变透明度):

@keyframes circle-line {
    0% {
        opacity: .05;
    }
    100% {
        opacity: .7;
    }
}

@-webkit-keyframes circle-line {
    0% {
        opacity: .05;
    }
    100% {
        opacity: .7;
    }
}

然后给每一个线条添加circle-line动画:

.loader.circle-line span {
    position: absolute;
    display: inline-block;
    width: 1.5rem;
    height: .5rem;
    border-top-left-radius: .25rem;
    border-bottom-left-radius: .25rem;
    background: #1ABC9C;
    opacity: .05;
    -webkit-animation: circle-line 1s ease infinite;
    animation: circle-line 1s ease infinite;
}

要实现不同线条的间隔动画,我们只需添加animation-delay延迟时间:

.loader.circle-line span:nth-child(1) {
    top: 50%;
    left: 0;
    margin-top: -.25rem;
    -webkit-animation-delay: .13s;
    animation-delay: .13s;
}

.loader.circle-line span:nth-child(2) {
    top: 1rem;
    left: .5rem;
    -webkit-transform: rotate(45deg);
    transform: rotate(45deg);
    -webkit-animation-delay: .26s;
    animation-delay: .26s;
}

.loader.circle-line span:nth-child(3) {
    left: 50%;
    top: .5rem;
    margin-left: -.75rem;
    -webkit-transform: rotate(90deg);
    transform: rotate(90deg);
    -webkit-animation-delay: .39s;
    animation-delay: .39s;
}

.loader.circle-line span:nth-child(4) {
    right: .5rem;
    top: 1rem;
    -webkit-transform: rotate(145deg);
    transform: rotate(145deg);
    -webkit-animation-delay: .52s;
    animation-delay: .52s;
}

.loader.circle-line span:nth-child(5) {
    left: 3.5rem;
    top: 50%;
    margin-top: -.25rem;
    -webkit-transform: rotate(180deg);
    transform: rotate(180deg);
    -webkit-animation-delay: .65s;
    animation-delay: .65s;
}

.loader.circle-line span:nth-child(6) {
    bottom: 1rem;
    right: .5rem;
    -webkit-transform: rotate(-145deg);
    transform: rotate(-145deg);
    -webkit-animation-delay: .78s;
    animation-delay: .78s;
}

.loader.circle-line span:nth-child(7) {
    left: 50%;
    bottom: .5rem;
    margin-left: -15px;
    -webkit-transform: rotate(-90deg);
    transform: rotate(-90deg);
    -webkit-animation-delay: .91s;
    animation-delay: .91s;
}

.loader.circle-line span:nth-child(8) {
    bottom: 1rem;
    left: .5rem;
    -webkit-transform: rotate(-45deg);
    transform: rotate(-45deg);
    -webkit-animation-delay: 1.04s;
    animation-delay: 1.04s;
}

circle-line动画的周期时间正好是最后一个span的延迟时间。
其他加载Loading也是同样的原理,先是定义好静态布局,然后实现一个动画(透明度变化、高度变化、大小变化等),最后将动画添加给给每个子项,再添加动画延迟时间即可。

三.纸片阴影

纸片阴影

1.要实现实现阴影,先来了解一下box-shadow属性:

box-shadow:[inset] x-offset y-offset blur-radius spread-radius color;
参数说明:

阴影类型:可选;如省略,默认是外阴影;它有且只有一个值“inset”,表示为内阴影;
x-offset:阴影水平偏移量,它可以是正负值。如为正值,则阴影在元素的右边;如其值为负值,则阴影在元素的左边;
y-offset:阴影垂直偏移量,它可以是正负值。如为正值,则阴影在元素的底部;如其值为负值时,则阴影在元素的顶部;
blur-radius:阴影模糊半径,可选,它只能是正值。如值为0,则阴影不具有模糊效果;它的值越大,阴影的边缘就越模糊;
spread-radius:阴影扩展半径,可选,它可以是正负值。如为正值,则扩大阴影的尺寸;如为负值,则缩小阴影的尺寸;(记住这个属性值,制作单边阴影的关键)
color:阴影颜色,可选,如不设定颜色,浏览器会取默认色,但各浏览器默认取色不一致。(经测试,在Safari上是半透明的,在chrome、firefox、ie上都是黑色的)。不推荐省略颜色值。
注意:颜色(color)也可以放在最前面的,inset值也可以放在最后面;阴影并不会占据空间,也就是说它不会阴影布局。

2.HTML模板

只需一个div:

<div class="box shadow">纸片阴影</div>

3.设置CSS样式

之前也已经已经介绍过box-shadow属性的用法

// 四周阴影
.shadow {
  box-shadow:0 0 25px 0px rgba(0,0,0,0.22);
}
// 左上邻边阴影
.shadow-top-left {
  box-shadow:-10px -10px 25px 0px rgba(0,0,0,0.22);
}
// 右上邻边阴影
.shadow-top-right {
  box-shadow:10px -10px 25px 0px rgba(0,0,0,0.22);
}
// 右下邻边阴影
.shadow-bottom-right {
  box-shadow:10px 10px 25px 0px rgba(0,0,0,0.22);
}
// 左下邻边阴影
.shadow-bottom-left {
  box-shadow:-10px 10px 25px 0px rgba(0,0,0,0.22);
}
// 顶部单边阴影
.shadow-top {
  box-shadow:0 -15px 10px -10px rgba(0,0,0,.22);
}
// 右侧单边阴影
.shadow-right {
  box-shadow:15px 0 10px -10px rgba(0,0,0,.22);
}
// 底部单边阴影
.shadow-bottom {
  box-shadow:0 15px 10px -10px rgba(0,0,0,.22);
}
// 左侧单边阴影
.shadow-left {
  box-shadow:-15px 0 10px -10px rgba(0,0,0,.22);
}

注意:当实现单边阴影时,第四个数值都是负数,而且水平偏移量(第一个数值)或垂直偏移量(第二个数值)的绝对值都会比第四个数值的绝对值大。

四.纯css版tooltip

我们平时用到的提示框tooltip大部分都是用js去写的,其实用css3不需要一句js同样可以达到这个效果的。

2.HTML模板
div和button都可,这里的重点是data-tooltip和data-direction这两个自定义属性。

<button class="btn btn-tooltip tooltip" 
    data-tooltip="在下方" data-direction="down">
    在下方
</button>
纯css版tooltip

3.设置CSS样式
首先还是我们之前大量使用过的伪元素来写出hover效果显示的工具栏

image.png
.tooltip
{
    position: relative;
}
.tooltip:before
{
    position: absolute;
    content: '';
    border: 5px solid transparent;
}
.tooltip:after
{
    font-size: 14px;
    line-height: normal;
    position: absolute;
    padding: 5px 10px;
    /* 在 content里使用HTML模板里的data-tooltip属性*/
    content: attr(data-tooltip);
    white-space: nowrap;
    color: #fff;
    border-radius: 3px;
    background: #383838;
}

默认先用 visibility属性隐藏tooltip

.tooltip:before,
.tooltip:after
{
    visibility: hidden;
    opacity: 0;
    z-index: 1000000;
    transition: .3s ease;
    transition-delay: 0ms;

/* 阻止tooltip元素不会成为鼠标事件的target */
    pointer-events: none;
}

然后hover让tooltip显示:

.tooltip:hover:before,
.tooltip:hover:after
{
    visibility: visible;
    opacity: 1;
}

最后加点动画:

[data-direction='down']:before
{
    top: -webkit-calc(100% - 5px);
    top:    -moz-calc(100% - 5px);
    top:         calc(100% - 5px);

    border-bottom-color: #383838;
}
[data-direction='down']:after
{
    top: -webkit-calc(100% + 5px);
    top:    -moz-calc(100% + 5px);
    top:         calc(100% + 5px);
}
[data-direction='down']:before,
[data-direction='down']:after
{
    left: 50%;
    -webkit-transform: translate3d(-50%,0,0);
    -moz-transform: translate3d(-50%,0,0);
    transform: translate3d(-50%,0,0);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,298评论 0 11
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,722评论 0 2
  • 1、垂直对齐 如果你用CSS,则你会有困惑:我该怎么垂直对齐容器中的元素?现在,利用CSS3的Transform,...
    kiddings阅读 3,144评论 0 11
  • 1.CSS3 边框 border-radius CSS属性用来设置边框圆角。当使用一个半径时确定一个圆形;当使用两...
    garble阅读 624评论 0 0
  • 感情越纯粹,越珍贵! 这一次,苏哥哥不谈爱情,我们说说友情。 周国平先生说过:“对于人际关系,我逐渐总结出了一个最...
    苏哥哥说阅读 751评论 0 1