JavaScript 30 Day -- 04 可伸缩的图片墙

实现效果:

点击任意一张图片,图片展开,同时从图片上下两方分别移入文字。点击已经展开的图片后,图片被压缩,同时该图片上下两端的文字被挤走。

关键点:

display: flex
    flex-direction
    justify-content
    align-items
transform: translateX/translateY
element.classList.toggle()
transitionend 事件

css

    html {
        box-sizing: border-box;
        background: #ffc600;
        font-family: 'helvetica neue';
        font-size: 20px;
        font-weight: 200;
    }

    body {
        margin: 0;
    }

    *,
    *:before,
    *:after {
        box-sizing: inherit;
    }

    .panels {
        min-height: 100vh;
        overflow: hidden;
        display: flex;
        flex: 1;
    }

    .panel {
        background: #6B0F9C;
        box-shadow: inset 0 0 0 5px rgba(255, 255, 255, 0.1);
        color: white;
        text-align: center;
        align-items: center;
        /* Safari transitionend event.propertyName === flex */
        /* Chrome + FF transitionend event.propertyName === flex-grow */
        transition: font-size 0.7s cubic-bezier(0.61, -0.19, 0.7, -0.11), flex 0.7s cubic-bezier(0.61, -0.19, 0.7, -0.11), background 0.2s;
        font-size: 20px;
        background-size: cover;
        background-position: center;
        display: flex;
        flex: 1;
        justify-content: center;
        flex-direction: column;
    }

    .panel1 {
        background-image: url(https://source.unsplash.com/gYl-UtwNg_I/1500x1500);
    }

    .panel2 {
        background-image: url(https://source.unsplash.com/1CD3fd8kHnE/1500x1500);
    }

    .panel3 {
        background-image: url(https://images.unsplash.com/photo-1465188162913-8fb5709d6d57?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&cs=tinysrgb&w=1500&h=1500&fit=crop&s=967e8a713a4e395260793fc8c802901d);
    }

    .panel4 {
        background-image: url(https://source.unsplash.com/ITjiVXcwVng/1500x1500);
    }

    .panel5 {
        background-image: url(https://source.unsplash.com/3MNzGlQM7qs/1500x1500);
    }

    .panel>* {
        margin: 0;
        width: 100%;
        transition: transform 0.5s;
    }

    .panel p {
        text-transform: uppercase;
        font-family: 'Amatic SC', cursive;
        text-shadow: 0 0 4px rgba(0, 0, 0, 0.72), 0 0 14px rgba(0, 0, 0, 0.45);
        font-size: 2em;
        display: flex;
        align-items: center;
        justify-content: center;
        /*flex-direction: column;*/
        flex: 2 0 auto;
    }

    .panel.opens p:first-child {
        transform: translateY(-100%);
    }

    .panel p:first-child {
        transform: translateY(0%);
    }

    .panel.opens p:last-child {
        transform: translateY(100%);
    }

    .panel p:last-child {
        transform: translateY(0%);
    }

    .panel p:nth-child(2) {
        font-size: 4em;
    }

    .panel.open {
        font-size: 40px;
        flex: 5;
    }

html

     <div class="panels">
        <div class="panel panel1">
            <p>Hey</p>
            <p>Let's</p>
            <p>Dance</p>
        </div>
        <div class="panel panel2">
            <p>Give</p>
            <p>Take</p>
            <p>Receive</p>
        </div>
        <div class="panel panel3">
            <p>Experience</p>
            <p>It</p>
            <p>Today</p>
        </div>
        <div class="panel panel4">
            <p>Give</p>
            <p>All</p>
            <p>You can</p>
        </div>
        <div class="panel panel5">
            <p>Life</p>
            <p>In</p>
            <p>Motion</p>
        </div>
    </div>

javascript

    html {
        box-sizing: border-box;
        background: #ffc600;
        font-family: 'helvetica neue';
        font-size: 20px;
        font-weight: 200;
    }

    body {
        margin: 0;
    }

    *,
    *:before,
    *:after {
        box-sizing: inherit;
    }

    .panels {
        min-height: 100vh;
        overflow: hidden;
        display: flex;
        flex: 1;
    }

    .panel {
        background: #6B0F9C;
        box-shadow: inset 0 0 0 5px rgba(255, 255, 255, 0.1);
        color: white;
        text-align: center;
        align-items: center;
        /* Safari transitionend event.propertyName === flex */
        /* Chrome + FF transitionend event.propertyName === flex-grow */
        transition: font-size 0.7s cubic-bezier(0.61, -0.19, 0.7, -0.11), flex 0.7s cubic-bezier(0.61, -0.19, 0.7, -0.11), background 0.2s;
        font-size: 20px;
        background-size: cover;
        background-position: center;
        display: flex;
        flex: 1;
        justify-content: center;
        flex-direction: column;
    }

    .panel1 {
        background-image: url(https://source.unsplash.com/gYl-UtwNg_I/1500x1500);
    }

    .panel2 {
        background-image: url(https://source.unsplash.com/1CD3fd8kHnE/1500x1500);
    }

    .panel3 {
        background-image: url(https://images.unsplash.com/photo-1465188162913-8fb5709d6d57?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&cs=tinysrgb&w=1500&h=1500&fit=crop&s=967e8a713a4e395260793fc8c802901d);
    }

    .panel4 {
        background-image: url(https://source.unsplash.com/ITjiVXcwVng/1500x1500);
    }

    .panel5 {
        background-image: url(https://source.unsplash.com/3MNzGlQM7qs/1500x1500);
    }

    .panel>* {
        margin: 0;
        width: 100%;
        transition: transform 0.5s;
    }

    .panel p {
        text-transform: uppercase;
        font-family: 'Amatic SC', cursive;
        text-shadow: 0 0 4px rgba(0, 0, 0, 0.72), 0 0 14px rgba(0, 0, 0, 0.45);
        font-size: 2em;
        display: flex;
        align-items: center;
        justify-content: center;
        /*flex-direction: column;*/
        flex: 2 0 auto;
    }

    .panel.opens p:first-child {
        transform: translateY(-100%);
    }

    .panel p:first-child {
        transform: translateY(0%);
    }

    .panel.opens p:last-child {
        transform: translateY(100%);
    }

    .panel p:last-child {
        transform: translateY(0%);
    }

    .panel p:nth-child(2) {
        font-size: 4em;
    }

    .panel.open {
        font-size: 40px;
        flex: 5;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值