前端特效的似是而非

让用户看起来是这样,而非实现起来一定是这样。
写特效时经常被逻辑思维所牵绊,A元素B元素分的太清了,反而麻烦。
最近在网上找了一些自己喜欢例子。

1.

effect.gif

html结构

<div class="menu menu1">
    <div class="item">分页1</div>
    <div class="item">分页2</div>
    <div class="item">分页3</div>
    <div class="item">分页4</div>
    <div class="item">分页5</div>
    <div class="bg"></div>
</div>

.bg的层在.item下面,.item背景色是透明的。

2.

html结构

  <div class="menu menu2">
    <div class="item current">分页1</div>
    <div class="item">分页2</div>
    <div class="item">分页3</div>
    <div class="item">分页4</div>
    <div class="item">分页5</div>
</div>

切换类的同时执行一个动画,动画执行完后回到初始状态

1,2 代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Menu Go!</title>
    <style>
        .menu{
            position: relative;
            width: 80%;
            margin: 100px auto;
            height: 50px;
            line-height: 50px;
            text-align: center;
            background-color: #202932;
            color:#fff;
            overflow: hidden;
            transition: all 1s;
        }
        .menu::after{
            content: "";
            display: block;
            clear: both;
        }
        .menu .item
        {
            width: 200px;
            height: 100%;
            float: left;
            z-index: 100;
            position: relative;
            cursor: pointer;
        }

        .menu .bg{
            position: absolute;
            height: 100%;
            width: 200px;
            background-color: #208ff9;
            cursor: pointer;
        }
        .menu1 .bg{
            
            left: 0;
            transition: left 0.25s ease; 
        }

        .menu2 .item.current{
            background-color: #208ff9;
            animation:slideUp 0.35s ease-in-out;
        }

        @keyframes slideUp{
            0%{
                transform:  translateY(-100%);
            }
        }
    </style>
</head>
<body>
    <div class="menu menu1">
        <div class="item">分页1</div>
        <div class="item">分页2</div>
        <div class="item">分页3</div>
        <div class="item">分页4</div>
        <div class="item">分页5</div>
        <div class="bg"></div>
    </div>
    <script>
        let menu1_dom = document.getElementsByClassName('menu1')[0];
        let menu1_bg = menu1_dom.querySelector('.bg');
        menu1_dom.addEventListener('click',(event)=>{
            menu1_bg.style.left = event.target.offsetLeft + 'px';
        })
    </script>
    <div class="menu menu2">
        <div class="item current">分页1</div>
        <div class="item">分页2</div>
        <div class="item">分页3</div>
        <div class="item">分页4</div>
        <div class="item">分页5</div>
    </div>
    <script>
        let menu2_dom = document.getElementsByClassName('menu2')[0];
        menu2_dom.addEventListener('click',(event)=>{
            var ele_dom = event.target;
            while (ele_dom = ele_dom.nextElementSibling) {
                ele_dom.classList.remove('current');
            }
            ele_dom = event.target;
            while (ele_dom = ele_dom.previousElementSibling) {
                ele_dom.classList.remove('current');
            }
            event.target.classList.add('current');
        })
    </script>

</body>
</html>g'h

3.

effect1.gif

HTML结构

<div class="wrapper">
    <form action="">
        <div class="item">
            <label >
                <input name="selected" type="radio" >
                <input type="reset">
                <div class="first">
                    <div class="title"></div>
                    <p class="second">
                        Lorem ipsum dolor sit amet, 
                    </p>
                </div>
            </label>
        </div>
    </form>
</div>

通过radio的单一状态实现状态切换,label的特性可以控制input的选中,
选中后,reset会覆盖整个区域,使得再次点击可以回到初始状态
左侧的线是wrapper元素的,两个球的层级在比线的高

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>下拉手风琴</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <meta name="viewport" content="initial-scale=1.0,width=device-width">
    <link rel="stylesheet" href="index.css">
    <link href="http://cdn.bootcss.com/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet">
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        body{
            font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
            font-size: 14px;
            color: #305275;
        }
        .wrapper::before{
            content: "";
            position: absolute;
            display: block;
            width: 1px;
            top:20px;
            bottom: 20px;
            left: -24px;
            background-color: #550527;
        }
        .wrapper{
            position: relative;
            margin-top: 120px;
            margin-left: auto;
            margin-right: auto;
            width: 505px;
        }
        .item{
            background-color: #fff;
            margin-bottom: 12px;
            position: relative;
        }
        .item label{
            display: block;
        }
        .item input{
            display: none;
        }
        .item .first{
            padding-left: 30px;
            cursor: pointer;
            transition: height .35s;
            height: 52px;
            box-shadow: 0px 2px 5px rgba(0,0,0,0.15);
            background-image: linear-gradient(to bottom,#688e26 0%,#ff816a 100%);
            background-size: 2px 100%;
            background-repeat: no-repeat;
            overflow: hidden;
        }
        .item input ~ input{
            opacity: 0;
            position: absolute;
            width: 100%;
            height: 100%;
            z-index: 12;
            cursor: pointer;
        }

        .item input:not(:checked) ~ input{
            display: none;

        }
        .item input:checked ~ .first{
            height: 500px;
        }
        .item input:checked ~ .first .title:after{
            content: "\f067";
        }
        .item input:checked{
            display: none;
        }
        .item input:checked ~ input{
            display: block;

        }
        .item .first .title{
            line-height: 52px;
            position: relative;
        }
        .item .second
        {
            padding-right: 15px;
            line-height: 28px;
        }
        .item .first .title:before{
            content: "Section1";
            color: #550527;
            font-size: 20px;
            font-weight: 600;
        }

        .item .first .title:after{
            display: block;
            content: "\f068";
            font-family: fontawesome;
            width: 25px;
            height: 25px;
            line-height: 25px;
            border-radius: 50%;
            font-size: 15px;
            font-weight: normal;
            color: #688e26;
            text-align: center;
            border: 1px solid #688e26;
            float: right;
            margin-top: 12.5px;
            margin-right: 15px;
        }
        .item:before{
            display: block;
            content: "";
            width: 15px;
            height: 15px;
            border-radius: 50px;
            background: #fff;
            border: 1px solid #550527;
            position: absolute;
            top: 18.5px;
            left: -32px;
        }
    </style>
</head>
<body>
    <div class="wrapper">
        <form action="">
            <div class="item">
                <label >
                    <input name="selected" type="radio" >
                    <input type="reset">
                    <div class="first">
                        <div class="title"></div>
                        <p class="second">
                            Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi aperiam esse voluptatem laboriosam labore distinctio ullam tempora soluta, molestias nesciunt eveniet eius debitis aspernatur ratione, natus commodi, culpa eum sequi doloribus exercitationem! Est doloribus tempora sint quas reprehenderit ut et nihil rem laudantium quidem dolorem consectetur eveniet, vel accusantium. Suscipit commodi nemo iusto quaerat molestias aut necessitatibus quae numquam neque dolorum tempora id quasi officia minima explicabo, est earum, sed accusamus obcaecati consequatur doloremque, doloribus asperiores velit, corporis. Minima consectetur ab sequi nam, sunt! Ut sed sunt laudantium, possimus illum aliquam corporis, tenetur pariatur eveniet iusto, nisi ipsum harum. Error.
                        </p>
                    </div>
                </label>
            </div>
            <div class="item">a
                <label >
                    
                    <input type="radio" name="selected" >
                    <input type="reset">
                    <div class="first">
                        <div class="title"></div>
                        <div class="second">
                            Lorem ipsum dolor sit amet, consectetur adipisicing elit. Hic, vel ratione animi quisquam placeat vitae architecto id ducimus labore repudiandae eaque atque incidunt dolorem culpa at similique saepe harum laboriosam assumenda nam numquam a! Veritatis a ab autem aspernatur quod, deleniti, adipisci suscipit mollitia voluptas numquam officiis nesciunt, cum voluptatem maxime accusantium iste in modi debitis totam quisquam! Fugit a minima sint facilis consequuntur dolorem iure tempora sit aperiam beatae sapiente assumenda quae dolores dolore repellat recusandae necessitatibus natus, architecto ex quod eos ipsa cum quia? Deserunt optio recusandae, in labore eos omnis maiores reprehenderit consequatur, quae sint accusamus quo.
                        </div>
                    </div>
                </label>
            </div>
        </form>
    </div>
</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • CSS参考手册 一、初识CSS3 1.1 CSS是什么 CSS3在CSS2.1的基础上增加了很多强大的新功能。目前...
    没汁帅阅读 9,599评论 1 13
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,904评论 1 32
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 10,149评论 0 0
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 13,169评论 0 3
  • 名字:Sunny黎细妹 定位:机关行政干部跨界的健康管理师 主题:将你从营养小白变身家庭健康管理员 内容方向: 营...
    sunnyliximei阅读 1,675评论 0 0

友情链接更多精彩内容