了解::after,::before伪元素制作动画效果

331 查看

使用自定义数据属性和伪元素

今天和大家分享一个使用Html5 自定义数据属性 和 CSS 的伪元素来实现一个简单的图片动画效果。
这也是我在使用了大半年Html5和css今天才发现的一个技巧,迫不及待的分享给慕课网的小伙伴,希望慕课网的小伙伴不要笑话。
相信大家都对 ::after,::before,这两个CSS伪元素都不陌生,这两个元素一般都要配合content属性来为该元素添加装饰内容。content这个虚拟元素默认是行内元素。对于我个人来说,常用的是这两种方法 content:”这是一段文字”或者是 content:” ”为空来修饰一个元素属性,但今天才发现content的功能远远不止于此。好了,直接来代码。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf8" >
    <title></title>
    <style>
    body {
        font-family: '微软雅黑', Calibri, Arial, sans-serif;
        color: #89867e;
        background: #f9f9f9;
    }
    *, *:after, *:before { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
    a {text-decoration: none;outline: none;}
    a img {border: none;}
    /* demo1 css */
    .caption {display: inline-block;position: relative;margin: 10px;}
    .caption img {display: block;max-width: 100%;}
    .caption::before,
    .caption::after {
        position: absolute;
        width: 100%;
        color: #fff;
        padding: 20px;
        opacity: 0;
        z-index: 1;
        -webkit-transition: opacity .3s;
           -moz-transition: opacity .3s;
                transition: opacity .3s;
    }
    .caption::before {
        content: attr(data-title); /* 获取自定义数据属性 标题*/
        top: 0;
        height: 30%;
        background: rgb(197, 71, 26);
        font-size: 40px;
        font-weight: 300; 
    }
    .caption::after {
        content: attr(data-description) ; /* 获取自定义数据属性 描述*/
        top: 30%;
        height: 70%;
        background: #a21f00;
        font-size: 16px;
        text-align: right;
    }
    .caption:hover::before,
    .caption:hover::after {
        opacity: 1;
    }
    /* demo2 css*/
    .caption2{display: inline-block;position: relative;margin: 10px;overflow: hidden;background: #000;}
    .caption2 img{
        display: block;
        max-width: 100%;
        -webkit-transition:opacity 0.3s ease-in-out;
           -moz-transition:opacity 0.3s ease-in-out;
                transition:opacity 0.3s ease-in-out;
    }
    .caption2:hover img{
        opacity: .5;
    }
    .caption2::before,
    .caption2::after{
        position: absolute;
        background: #fff;
        width: 100%;
        height: 50%;
        color: #fff;
        padding: 20px;
        -webkit-transition:-webkit-transform 0.3s ease-in-out;
           -moz-transition:-moz-transform 0.3s ease-in-out;
                transition:transform 0.3s ease-in-out;
    }
    .caption2::before{
        content: attr(data-title);
        top: 0;
        z-index: 1;
        background: #B87046;
        font-size: 40px;
        font-weight: 300;
        -webkit-transform: translateY(-100%);
        -moz-transform: translateY(-100%);
        transform: translateY(-100%);
    }
    .caption2::after{
        content: attr(data-description);
        top: 50%;
        background: #E6453E;
        font-size: 16px;
        text-align: left;
        -webkit-transform: translateY(100%);
        -moz-transform: translateY(100%);
        transform: translateY(100%);
    }
    .caption2:hover::before,
    .caption2:hover::after{
        -webkit-transform: translateY(0);
        -moz-transform: translateY(0);
        transform: translateY(0);
    }

    /* demo3 css */
    span[data-descr] {
      position: relative;
      text-decoration: underline;
      color: #00F;
      cursor: help;
    }

    span[data-descr]:hover::after {
      content: attr(data-descr);
      position: absolute;
      left: 0;
      top: 24px;
      min-width: 200px;
      border: 1px #aaaaaa solid;
      border-radius: 10px;
      background-color: #ffffcc;
      padding: 12px;
      color: #000000;
      font-size: 14px;
      z-index: 1;
    }

    </style>
</head>
<body>
<a 
    class="caption" 
    href="#" 
    data-title="Lorem ipsum" data-description="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam">
    <img src="http://payload300.cargocollective.com/1/5/182469/8304068/SmugEagle.png" alt="deom1">
</a>

<a 
    class="caption2" 
    href="#" 
    data-title="Lorem ipsum" data-description="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam">
    <img src="http://payload300.cargocollective.com/1/5/182469/8304068/gunslinger.png" alt="deom2">
</a>

<!-- deom3 -->
<p>这是上面代码的实现<br />
  我们有一些 <span data-descr="collection of words and punctuation">文字</span> 有一些
  <span data-descr="small popups which also hide again">提示</span>。<br />
  把鼠标放上去<span data-descr="not to be taken literally">看看</span>.
</p>

</body>
</html>

使用鼠标的:hover来出发过渡动画,过渡动画的实现主要由CSS3 的transition属性来实现的,不太了解的可以去《十天精通CSS3》的课程,有详细的讲解了transition实现过渡动画的实现,相信你比我更懂。

利用::after,::before可以做出浮动提示框(deom3),有兴趣的朋友可以去优化一下,做出漂亮的提示框。

然后我去MDN上查了一下content属性,不查还真不知道,原来content值有如此多种。很多都是我们不常用的,有需要的小伙伴可以试试,但我们开发上比较常用的还是之前提到的。

content: normal                                /*  :before 和 :after 伪类元素中会被视为 none  */
content: none                    /*不会产生任何元素*/

content: 'prefix'                              /*文本内容*/
content: url(http://www.example.com/test.html)    /* URI值会指定一个外部资源 */
content: chapter_counter                       /* <counter> values */
content: attr(value string)                    /*将元素的X属性以字符串形式返回,也是今天deom用上的 */
content: open-quote                            /* Language- and position-dependant keywords */
content: close-quote
content: no-open-quote
content: no-close-quote

content: open-quote chapter_counter            /* Except for normal and none, several values can be used simultaneously */

content: inherit 

注:代码部分来源于 http://tympanus.net/codrops/2013/07/05/using-custom-data-attributes-and-pseudo-elements/