当青训营遇上码上掘金 | 我的名片

174 阅读4分钟

引文

当青训营遇上码上掘金。这一次的码上掘金活动,我写的是“我的名片”。制作了一张可以翻页的名片,另外,使用了阿里的矢量图点缀。

image.png

image.png

灵感&思路:

在翻看书籍时灵光乍现,当时就思考能否将一张名片如同翻看纸张一样,实现翻页的效果,思考过后发现可行。然后以下是实现的具体的操作:

首先,分为左右两部分,分别以div承载对应的内容,这里我是以一半是图片的效果一半是文字介绍的效果展示,最外层以container将所有内容承载,开启相对定位,左右的图片处于同一水平上,这就使用弹性效果flex,然后内容部分使用的是一个contentdiv去容纳。

然后就是处理文字部分了。这里的文字部分是分成两部分————前一页、后一页,第一页放的是自己的一些信息,昵称、性别、生日......同时使用了阿里的矢量图进行点缀,当点击翻页时可以翻到下一页。

翻页效果的实现。在container中使用了perspective: 1000pxtransform-style: preserve-3d开启3D效果,js部分通过选择器将对应的元素选中,这里有一个注意的地方(由于使用的是原生的js ,以选择器选出来的节点都是以类似数组的形式存在,例:var link = document.querySelectorAll(".footer a"); 将获取到的link再进行操作时需要加上下标,例:link[0].addEventListener("click", function (e){}),在调试时我就是在这个细节上调试了比较久。

图片缩放效果和动画过渡效果。鼠标划过时transform: scale(1.5); 图片添加过渡属性transition:all .8s; 操作也就到这里了,接下来,请看源码部分。

HTML部分

<div class="container">
        <div class="home"><img src="./01.jpg" alt="">
            <h3>青训营,再出发</h3>
        </div>
        <div class="content">
            <div class="pageOne">
                <div class="description">
                    <span>
                        <h3>昵称:zhou</h3>
                    </span>
                    <span>
                        <h3>性别:男</h3>
                    </span>
                    <span>
                        <h3>生日:九月九日</h3>
                    </span>

                    <span>

                        <h3>星座:处女座</h3>
                    </span>

                    <span>
                        <h3>学校:XXXX大学</h3>
                    </span>
                    <span>

                        <h3>专业:XXXX专业</h3>
                    </span>
                </div>
                <div class="text">
                    <p>留言:在这个寒假让我们一起愉快的学习吧</p>
                </div>
                <div class="footer">
                    想要了解更多吗?<a href="#"> 点击翻到下一页</a>
                </div>
            </div>
            <div class="pageTwo  xiaoshi">
                <div class="description">
                    <div class="aihao">
                        <span>我的爱好</span>
                        <p>喜欢打篮球,和朋友一起去浪</p>
                    </div>
                    <div class="jieshao">
                        <span>用到了什么</span>
                        <p>HTML+CSS+JavaScript</p>
                    </div>
                    <div class="jianjie">
                        <span>灵感&思路</span>
                        <p>在翻书时突发奇想,制作一个翻页的名片,通过js控制标签的隐藏与显示,然后通过动画效果,
                            当点击链接后,以Y轴垂直翻180度。在翻页的同时将原先的页面隐藏起来(display:none)</p>
                    </div>
                </div>

                <div class="text">
                    <p>寒假不要浪了,快来一起愉快的学习吧</p>
                </div>
                <div class="footer">
                    没有更多了哦~<a href="#"> 点击返回上一页</a>
                </div>
            </div>
        </div>
        <div class="home"><img src="./01.jpg" alt="">
            <h3>我的名片</h3>
        </div>
    </div>

CSS部分

            display: flex;
            align-items: center;
            justify-content: center;
            height: 100vh;
            margin: 0;
            background-image: linear-gradient(120deg, rgb(201, 254, 254), rgb(98, 202, 243));
        }

        .container {
            position: relative;
            display: flex;
            perspective: 1000px;
            /* 开3D */
            transform-style: preserve-3d;
        }

        .home {
            width: 400px;
            height: 500px;
            display: flex;
            justify-content: center;
            align-items: center;
            flex-direction: column;
            background-color: #fff;
            border: 3px snow #8ba0ed;
            box-sizing: border-box;
            overflow: hidden;
             border-radius:0 5px 5px  0  ;
        }
        .home img {
            width: 70%;
            margin-bottom: 10px;
            transition:all .8s;
        }
        .home img:hover{
            transform: scale(1.5);
        }
        .home h3 {
            color: #888;
            font-size: 18px;
        }

        .home:nth-child(1) {
            border-radius: 5px 0 0 5px;
        }

        .content {
            width: 400px;
            height: 500px;
            position: absolute;
            transition: 0.5s;
            left: 0;
            transform-origin: right;
        }

        .content .pageOne {
            width: 100%;
            height: 100%;
            display: flex;
            flex-direction: column;
            border-radius: 5px 0 0 5px;
            background-image: linear-gradient(to bottom, #63d7fe, #8da3f1);
            position: relative;
        }

        .content .pageTwo {
            width: 100%;
            height: 100%;
            display: flex;
            flex-direction: column;
            background-image: linear-gradient(to bottom, #63d7fe, #8ba0ed);
            border-radius: 0 5px 5px 0;
            transform: rotateY(180deg);
            position: relative;
        }

        .content .xiaoshi {
            display: none;
        }

        .pageOne,
        .pageTwo {
            padding: 20px;
            box-sizing: border-box;

        }

        .description h3 {
            font-size: 16px;
            margin-left: 10px;
        }

        .description span {
            display: flex;
            align-items: center;
        }

        .icon {
            width: 40px;
            height: 40px;
        }

        .pageOne .footer,
        .pageTwo .footer {
            color: #fff;
            position: absolute;
            width: 70%;
            left: 50%;
            transform: translateX(-50%);
            bottom: 40px;
        }

        a {
            text-decoration: none;
            color: #fff;
        }

        .pageTwo .description span {
            display: block;
            border-bottom: 1px #f5f5f5 solid;
            line-height: 24px;
        }

        .pageTwo .description p {
            text-indent: 2em;
        }

JS部分

var content = document.getElementsByClassName("content");
var page1 = document.getElementsByClassName("pageOne");
var page2 = document.getElementsByClassName("pageTwo");
// 翻个页
// console.log(page1, page2);
link[0].addEventListener("click", function (e) {
  page1[0].classList.add("xiaoshi")
  page2[0].classList.remove("xiaoshi")
  content[0].style.transform = "rotateY(180deg)"
})
// 翻回来
link[1].addEventListener("click", function (e) {
  page1[0].classList.remove("xiaoshi")
  page2[0].classList.add("xiaoshi")
  content[0].style.transform = "none"
})