固定顶部含SlideInDown动画效果的提示框

2019-03-05

前情提要

记录一下工作中进步的小点滴,也方便以后遇到类似的问题可供查阅和借鉴。

配置工作环境

想要详细代码戳我戳我(●’◡’●)

webpack.js

const path = require('path')
const ExtractTextPlugin = require('extract-text-webpack-plugin')

module.exports = {
    // webpack入口文件,同目录下的index.js
    entry: {
        index: path.resolve(__dirname, 'src/index.js')
    },
    // 输出路径为dist,输出的文件为index.js
    output: {
        publicPath: '/',
        // 默认当前静态资源的路径,在html中引用不需要再写dist
        path: path.resolve(__dirname, 'dist/'),
        filename: 'index.js'
    },
    // 开发工具,方便调试
    devtool: 'source-map',
    // 本地服务器,运行服务时,将监听8899端口并自动在浏览器打开
    devServer: {
        contentBase: './',
        inline: true,
        port: 8899,
        open: 'http://localhost:8899/',
        host: '0.0.0.0'
    },
    // loader 被用于转换某些类型的模块,而插件则可以用于执行范围更广的任务
    // 插件的范围包括:打包优化、资源管理和注入环境变量
    // loader是针对某个文件,而plugin是针对整个打包流程
    module: {
        loaders: [
            // 将es6语法的js文件转换为浏览器可以理解的语法
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: [{
                    loader: 'babel-loader',
                    options: {
                        presets: ['es2015']
                    }
                }]
            },
            // 将sass转为css
            {
                test: /\.(scss|sass)$/,
                loader: ExtractTextPlugin.extract({
                    fallback: 'style-loader',
                    use: [{
                        loader: 'css-loader',
                        options: {
                            minimize: true
                        }
                    }, 'sass-loader']
                })
            }
        ]
    },
    plugins: [
        // 将静态文件独立打包到css文件内
        new ExtractTextPlugin({
            filename: `common.css`
        })
    ]
}

package.json

{
  //...
  // 在命令行中输入 npm start 启动本地服务
  "scripts": {
    "start": "webpack-dev-server --color --progress --config webpack.js"
  },
  //...
}

index.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <!-- 控制布局 使页面能够进行合适的缩放和平移 -->
    <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" />
    <!-- 静态资源不需要写/dist路径 -->
    <link href="/common.css" type="text/css" rel="stylesheet" />
    <title>css animation</title>
</head>

<body>
    <!-- 为了展示效果 -->
    <div class="banner">
        <img src="https://zhanglinlin-site-1258125238.cos.ap-beijing.myqcloud.com/%E5%B0%8F%E7%8E%8B%E5%AD%90.jpg" />
    </div>
    <!-- 页面滚动会触顶固定且开始时有sliceInDown的动画效果 -->
    <div class="alert-info-wrapper">
        <div class="alert-info">
            <p>我是提示信息框,<span>嘻嘻</span></p>
        </div>
    </div>
    <!-- 为了展示效果 -->
    <ul>
        <li>
            <span>向下滚动</span>
            <img src="https://zhanglinlin-site-1258125238.cos.ap-beijing.myqcloud.com/%E5%B0%8F%E7%8E%8B%E5%AD%90.jpg" />
        </li>
        <li>
            <span>向下滚动</span>
            <img src="https://zhanglinlin-site-1258125238.cos.ap-beijing.myqcloud.com/%E5%B0%8F%E7%8E%8B%E5%AD%90.jpg" />
        </li>
        <li>
            <span>向下滚动</span>
            <img src="https://zhanglinlin-site-1258125238.cos.ap-beijing.myqcloud.com/%E5%B0%8F%E7%8E%8B%E5%AD%90.jpg" />
        </li>
        <li>
            <span>向下滚动</span>
            <img src="https://zhanglinlin-site-1258125238.cos.ap-beijing.myqcloud.com/%E5%B0%8F%E7%8E%8B%E5%AD%90.jpg" />
        </li>
        <li>
            <span>向下滚动</span>
            <img src="https://zhanglinlin-site-1258125238.cos.ap-beijing.myqcloud.com/%E5%B0%8F%E7%8E%8B%E5%AD%90.jpg" />
        </li>
    </ul>

    <script src="/index.js"></script>
</body>

</html>

固定顶部的js实现

index.js

import './index.scss';
import './alertInfo.scss';

window.addEventListener('scroll', () => {
// 获取提示框元素及滚动条的滚动高度
var alertWrapper = document.getElementsByClassName('alert-info-wrapper')[0],
    alertBox = document.getElementsByClassName('alert-info')[0],
    scrollTop = document.body.scrollTop 
                || document.documentElement.scrollTop;

    // 将滚动高度与提示框距离顶部的位移进行对比
    if (scrollTop >= alertWrapper.offsetTop) {
        // 滚动高于位移则将提示框固定在屏幕顶部
        alertBox.style.position = 'fixed';
    } else {
        // 否则,使提示框处于正常流布局中
        alertBox.style.position = 'static';
    }
})

SlideInDown的动画效果实现

alertInfo.scss

// 动画部分
@keyframes slideInDownOuter {
    // 从0%开始到100%的变化
    from {
        height: 0;
    }

    to {
        height: 50px;
    }
}

@keyframes slideInDownInner {
    10% {
        padding: 0 15px;
    }

    to {
        padding: 15px;
    }
}

.alert-info {
    width: 100%;
    height: 50px;
    // 固定顶部
    top: 0;
    // 让提示框展示在最上层
    z-index: 99;
    // 必须属性,让内部元素在展开前不至于显露出来
    overflow: hidden;
    background-color: #FFF9E7;
    // 引用动画名 动画执行完成所需的时间 动画执行的效果
    animation: slideInDownOuter .8s linear;

    p {
        padding: 15px;
        margin: 0;
        animation: slideInDownInner .8s linear;
    }

    span {
        color: #FF6700;
    }
}

新的一篇产出!~