vue项目仿企业微信移动端(带聊天界面)

news2024/10/6 8:30:49

网上比较知名的网站或者软件,开源代码中都有仿其前端的。比如小米商城,京东商城,仿微信聊天页面诸如此类的。所以我潜意识觉得像那种知名公司或者软件。想找它的仿前端静态代码应该很好找。结果,当我想找仿企业微信移动端的前端静态代码时,竟发现没有。所以,这个短板这个空缺。我得弥补。

下载地址:https://download.csdn.net/download/qq_34761385/87854388

1.效果展示

 

 

2.内容说明

不说模仿的百分之百,但是咋一看大差不差。作为纯前端展示还是没问题的。底下的导航和头部走的父组件,内容以路由的形式嵌入。除了消息,邮件,通讯录这三个是代码写出来的,文档和工作台内容是用图片占位。只是模仿前端界面而已。也没必要把里面所有的二级三级页面都弄出来。当然你也可以在我提供的代码的基础上丰富。

技术栈:因为是纯vue项目的前端静态页面。所以就是vue+vant组件

特别说明:一点交互都没有,也显得太没技术含量了。展示效果也就生硬了点。所以,在消息模块中,是可以点击消息进入聊天页面的。效果图如下:

 可以发送文字,图片,表情等内容。作为一个独立的聊天页面,考虑到可能有人想单独复用这个页面。所以将代码提供出来:

chat.vue

<template>
  <div id="Customer" style="position:relative">
        <div class="header" id="head">
          <div>
            <img src="@/assets/WX/聊天返回.png" alt="" style="width:0.5rem" @click="goback">
            <p>{{chater.name}}</p>
          </div>
          <div>
            <img src="@/assets/WX/聊天录像.png" alt="">
            <img src="@/assets/WX/聊天更多.png" alt="">
          </div>
        </div>
        <div class="population" :style="{width: screenWidth + 'px',height: screenHeight + 'px' }">
            <div class="content" id="MyCenter" @click="back"
                :style="{height:expsions?screenHeight-310 + 'px':screenHeight-45 + 'px' , paddingTop:divhead+'px',paddingBottom:divhead+'px' }">
                <ul class="pop__clearfix" v-for="(item,index) in list" :key="index">
                    <!-- 用户 -->
                    <li class="pop__chat-msg-me" v-if="item.id==1">
                        <div class="pop__chat-msg-content">
                            <div class="pop__chat-msg-msg" v-if="item.cont"><span>{{item.cont}}</span></div>
                            <div class="pop__chat-msg-msg1" @click="imgs(item,index)" v-if="item.img">
                                <!-- <img :src="item.img" :large="item.img" preview="1" >. -->
                                <img :src="item.img">
                            </div>
                            <div class="pop__chat-msg-msg" v-if="item.card" style="background:#ffffff;background-color: #ffffff;border-color: #ffffff;color:#000000">
                                <!-- <img :src="item.img" :large="item.img" preview="1" >. -->
                                <p>{{item.card.title}}</p>
                                <img :src="item.card.imgurl">
                            </div>
                        </div>
                        <span class="pop__chat-msg-avatar">
                            <img :src="require('@/assets/WX/10.png')" />
                            <!-- <img src="xxx.jpg" large="xxx_3x.jpg" preview="2" preview-text="描述文字"> -->
                        </span>
                    </li>

                    <!-- 好友 -->
                    <li class="pop__chat-msg-me2" v-if="item.id==2">
                        <span class="pop__chat-msg-avatar">
                            <img :src="chater.headimg">
                        </span>
                        <div class="pop__chat-msg-content2">
                            <div class="pop__chat-msg-msg2" v-if="item.cont"><span>{{item.cont}}</span></div>
                            <div class="pop__chat-msg-msg22" @click="imgs(item,index)" v-if="item.img">
                                <!-- <img :src="item.img" :large="item.img" preview="1" >. -->
                                <img :src="item.img">
                            </div>
                        </div>
                    </li>
                    <!-- 显示最近一次的聊天时间 -->
                    <li class="time" v-if="item.id==0">{{item.time}}</li>
                </ul>
            </div>
            <div class="Bottom">
                <div class="icomess" v-if="chater.type!='group'&&chater.type!='qq'">
                    <img src="@/assets/WX/消息图标4.png" alt=""  @click="topath" />
                    <img src="@/assets/WX/消息图标5.png" alt=""  @click="topath" />
                    <img src="@/assets/WX/消息图标6.png" alt=""  @click="topath" />
                </div>
                <div class="state">
                    <!-- 语音切换 -->
                    <button class="voice" @click='voice'>
                        <img :src="Texts?require('@/assets/WX/y.png'):'../Image/j.png'" alt="">
                    </button>
                    <!-- 输入框 -->
                    <textarea v-if="Texts" id="t" autofocus ref="myInput" @click="textareas"
                        v-model="TentText"></textarea>
                    <!-- 点击录音 -->
                    <button class="Press" v-if="Press">按住 说话</button>
                    <!-- 表情 -->
                    <button class="expression" @click="expression">
                        <img :src="require('@/assets/WX/b.png')" alt="">
                    </button>
                    <!-- 发送图片 -->
                    <button class="file" @click="file" v-if="TentText?false:true"></button>
                    <!-- capture="camera" 相机拍照 -->
                    <input type="file" style="display: none;" accept="image/*" multiple id="p" name="file"
                        @change="onChooseImage($event)" />
                    <!-- 发送文字内容 -->
                    <button class="sendout" @click="sendout" v-if="TentText?true:false">发送</button>
                </div>
                <div class="express" v-if="expsions">
                    <div style="font-size: 24px; padding: 0.1rem 0.12rem; " @click="copy(item,index)"
                        v-for="(item,index) in emolis" :key="index">{{item.char}}</div>
                </div>
            </div>

        </div>
    </div>
</template>

<script>
import { Toast } from 'vant';
import { ImagePreview } from 'vant';
export default {
  data() {
    return {
        chater:'',
        divhead:'',
        screenWidth: '',     // 屏幕宽
        screenHeight: '',    // 屏幕高
        list: [  //1为自己发送的消息,2为对面用户发送的消息,0为聊天时间
            { id: 1, cont: '山不在高,有仙则名。' },
            { id: 0, time: '2023-3-9 5:21' },
            { id: 2, cont: '水不在深,有龙则灵。' },
            { id: 2, cont: '斯是陋室,惟吾德馨。' },
            { id: 1, cont: '苔痕上阶绿,草色入帘青。谈笑有鸿儒,往来无白丁。' },
            { id: 2, cont: '可以调素琴,阅金经.' },
            { id: 1, cont: '无丝竹之乱耳,无案牍之劳形。' },
            { id: 1, cont: '南阳诸葛庐,西蜀子云亭。孔子云:何陋之有?' },
            { id: 0, time: '2023-5-9 5:21' },
            { id: 2, cont: '这位兄台文韬武略,一看就是状元之才啊' },
            { id: 1, cont: '过奖了,岂敢岂敢' },
            { id: 1, cont: '兄台不如到寒舍一聚,把酒言欢,吟诗作赋如何' },
            { id: 2, cont: '甚好' },
            { id: 1, cont: '兄台请😀' },
            { id: 0, time: '2023-5-25 12:59' },
            { id: 2, img: 'https://cdn.seovx.com/ha/?mom=302' },
        ],
        TentText: '',
        getBrowString: '',
        hidden: true,
        Press: false,
        Texts: true,
        active_search: true,
        expsions: false,
        faceList: '',
        emolis:[
            { "char": "😍" },
            { "char": "😁" },
            { "char": "😘" },
            { "char": "🍎" },
            { "char": "🍏" },
            { "char": "🍊" },
            { "char": "🍋" },
            { "char": "😖" },
            { "char": "😉" },
            { "char": "😏" },
            { "char": "😏" },
            { "char": "🍒" },
            { "char": "🍇" },
            { "char": "🍉" },
            { "char": "🍓" },
            { "char": "🍑" },
            { "char": "🍈" },
            { "char": "🍌" },
            { "char": "🍐" },
            { "char": "🍍" },
            { "char": "🍆" },
            { "char": "🍅" },
            { "char": "🍠" },
            { "char": "🌽" },
            { "char": "😳" },
            { "char": "😡" },
            { "char": "😓" },
            { "char": "😭" },
            { "char": "😱" },
            { "char": "😜" },
            { "char": "😰" },
            { "char": "😢" },
            { "char": "😚" },
            { "char": "😄" },
            { "char": "😀" },
            { "char": "😪" },
            { "char": "😣" },
            { "char": "😔" },
            { "char": "😠" },
            { "char": "😌" },
            { "char": "😀" },
            { "char": "😝" },
            { "char": "😂" },
            { "char": "😥" },
            { "char": "😃" },
            { "char": "😞" },
            { "char": "😒" },
            { "char": "😀" },
            { "char": "👽" },
            { "char": "😄" },
            { "char": "😯" },
            { "char": "😂" },
            { "char": "😈" },
            { "char": "😀" },
            { "char": "😐" },
            { "char": "😃" },
            { "char": "😠" },
            { "char": "😑" },
            { "char": "😥" },
            { "char": "😬" },
            { "char": "😟" },
            { "char": "😢" },
            { "char": "😦" },
            { "char": "😱" },
            { "char": "😵" },
            { "char": "😴" },
            { "char": "😧" },
            { "char": "😙" },
            { "char": "😖" },
            { "char": "😛" },
            { "char": "😭" },
            { "char": "😒" },
            { "char": "😗" },
            { "char": "😚" },
            { "char": "😌" },
            { "char": "😪" },
            { "char": "😻" },
            { "char": "😏" },
            { "char": "🙆" },
            { "char": "😽" },
            { "char": "😄" },
            { "char": "😀" },
            { "char": "😕" },
            { "char": "😂" },
            { "char": "😅" },
            { "char": "😐" },
            { "char": "😃" },
            { "char": "😆" },
            { "char": "😑" },
            { "char": "😮" },
            { "char": "😨" },
            { "char": "😢" },
            { "char": "😦" },
            { "char": "😱" },
            { "char": "😵" },
            { "char": "😤" },
            { "char": "😶" },
            { "char": "😀" },
            { "char": "😝" },
            { "char": "😎" },
            { "char": "😞" },
            { "char": "😋" },
            { "char": "😔" },
            { "char": "😀" },
            { "char": "😒" },
            { "char": "😜" },
            { "char": "😌" },
            { "char": "😗" },
            { "char": "😏" },
            { "char": "🙊" },
            { "char": "👦" },
            { "char": "👩" },
            { "char": "😄" },
            { "char": "😃" },
            { "char": "😀" },
            { "char": "😀" },
            { "char": "😉" },
            { "char": "😗" },
            { "char": "😙" },
            { "char": "😜" },
            { "char": "😝" },
            { "char": "😛" },
            { "char": "😁" },
            { "char": "😌" },
            { "char": "💛" },
            { "char": "😒" },
            { "char": "😞" },
            { "char": "😣" },
            { "char": "😀" },
            { "char": "😂" },
            { "char": "😭" },
            { "char": "😪" },
            { "char": "😥" },
            { "char": "😅" },
            { "char": "😀" },
            { "char": "😩" },
            { "char": "😠" },
            { "char": "😤" },
            { "char": "😖" },
            { "char": "😋" },
            { "char": "😷" },
            { "char": "😴" },
            { "char": "😟" },
            { "char": "😦" },
            { "char": "😈" },
            { "char": "👿" },
            { "char": "😬" },
            { "char": "😯" },
            { "char": "😶" },
            { "char": "😇" },
            { "char": "😑" },
            { "char": "🍡" },
            { "char": "🍲" },
            { "char": "🍱" },
            { "char": "🍔" },
            { "char": "🍤" },
            { "char": "🍕" },
            { "char": "🍮" },
            { "char": "🍩" },
            { "char": "🍗" },
            { "char": "🍝" },
            { "char": "🍳" },
            { "char": "🍭" },
            { "char": "🍪" },
            { "char": "🍦" },
            { "char": "🍖" },
            { "char": "🍟" },
            { "char": "🍯" },
            { "char": "🍬" },
            { "char": "🍰" },
            { "char": "🍧" },
            { "char": "🍵" },
            { "char": "🍹" },
            { "char": "🍺" },
            { "char": "💔" },
            { "char": "💘" },
            { "char": "💜" },
            { "char": "💛" },
            { "char": "💚" },
            { "char": "💙" },
            { "char": "💬" },
            { "char": "💩" },
            { "char": "👍" },
            { "char": "👎" },
            { "char": "👊" },
            { "char": "✌" },
            { "char": "👌" },
            { "char": "🐮" },
            { "char": "🐧" },
            { "char": "🐷" },
            { "char": "🐍" },
            { "char": "🐆" },
            { "char": "🐠" },
            { "char": "🐒" },
            { "char": "🐬" },
            { "char": "🐞" },
            { "char": "🐌" },
            { "char": "🐾" },
            { "char": "🐜" },
            { "char": "🐙" },
            { "char": "🐵" },
            { "char": "🐉" },
            { "char": "🚝" },
            { "char": "🚋" },
            { "char": "🚃" },
            { "char": "🚌" },
            { "char": "🚍" },
            { "char": "🚙" },
            { "char": "🚘" },
            { "char": "🚗" },
            { "char": "🚕" },
            { "char": "🚖" },
            { "char": "🚛" },
            { "char": "🚓" },
            { "char": "🚒" },
            { "char": "🚲" },
            { "char": "🍸" }
        ]
    };
  },
   //每次页面渲染完之后滚动条在最底部
    updated() {
        this.scrollToBottom();
    },
    watch: {
        //每次变化,input获取焦点
        active_search: function (a, b) {
            if (b == true) {
                this.$refs.myInput.focus();
            }
        },
    },
   mounted() {
        this.chater =localStorage.getItem("chater")?JSON.parse(localStorage.getItem("chater")):'';
        var chat=localStorage.getItem("chat")?JSON.parse(localStorage.getItem("chat")):[];
        if(chat){
            console.log("消息:",chat);
            this.list=this.list.concat(chat);
        }

        // 页面加载完成后显示
        this.divhead = document.getElementById('head').clientHeight+20;  //头部高度
        this.screenWidth = document.documentElement.clientWidth;
        if(this.screenWidth>550){this.screenWidth=550}
        this.screenHeight = document.documentElement.clientHeight;
        rem()
        setTimeout(function () {
            var container = document.getElementById("MyCenter");
            container.scrollTop = container.scrollHeight * container.clientHeight
        }, 100);//延迟5000毫米
        // 监听屏幕可视区域的宽高
        window.onresize = () => {
            return (() => {
                this.screenWidth = document.documentElement.clientWidth;
                if(this.screenWidth>550){this.screenWidth=550}
                this.screenHeight = document.documentElement.clientHeight;
                // 监听光标跟着最后一个字符
                var textarea = document.getElementById("t");
                console.log("textarea",textarea);
                textarea.onfocus = function () {
                    moveCaretToEnd(textarea);
                    // Work around Chrome's little problem
                    window.setTimeout(function () {
                        moveCaretToEnd(textarea);
                    }, 1);
                };
                rem()
            })();
          
        };
        this.scrollToBottom();
        function rem() {
            let html = document.documentElement;
            let w = html.clientWidth;
            html.style.fontSize = 100 * (w / 750) + "px"
        };
    },
  methods: {
    topath(){
        this.$router.push("/wxinfo");
    },
    goback(){
        this.$router.go(-1);
    },
     scrollToBottom() {
            this.$nextTick(() => {
                var container = document.getElementById("MyCenter");
                // container.scrollTop = container.scrollHeight = container.clientHeight;
                container.scrollTop = container.scrollHeight * container.clientHeight
                // container.scrollTop = container.clientHeight
                
            })
        },
        // 点击获取当前的图片
        imgs(item) {
            ImagePreview({
                //点击获取当前的图片  大图
                images: [item.img],
            })
        },
        // 语音
        voice() {
            Toast('暂不支持此功能...');
            return;
            if (this.expsions) {
                this.expsions = !this.expsions; this.Press = !this.Press; this.Texts = !this.Texts;
            } else {
                this.Press = !this.Press; this.Texts = !this.Texts;
            }
        },
        back() {
            if (this.expsions) {
                this.expsions=false 
            }
        },
        // 表情
        expression() {
            if (this.Press) {
                this.Press = !this.Press; this.Texts = !this.Texts; this.expsions = !this.expsions;
            } else {
                this.expsions = !this.expsions;
            }
            if (this.expsions == false) {
                this.$refs.myInput.focus();
            }
        },
        // 图片
        file() {
            //表情是否开启
            if (this.expsions) {
                this.expsions = false
            }
            document.getElementById('p').click()
        },
        onChooseImage: function (event) {
            //使用FileReader对文件对象进行操作
            let list = this.list
            var reader = new FileReader();
            reader.readAsDataURL(event.target.files[0]); //将读取到的文件编码成Data URL
            reader.onload = function () { //读取完成时
                var replaceSrc = reader.result; //文件输出的内容
                list.push({ id: 1, img: replaceSrc },)
            };
            console.log(this.list)
        },
        // 发送
        sendout() {
            // socket.send(this.TentText);
            this.list.push({ id: 1, cont: this.TentText })
            this.TentText = '';
            if (this.expsions == false) {
                this.$refs.myInput.focus();
            }

        },
        // 把表情复制到输入框中
        copy(item, index) {
            this.getBrowString = this.emolis[index].char;
            this.TentText += this.getBrowString;
        },
        textareas() {
            this.expsions = false
        },
     
  },
};
</script>
<style  scoped>
.header{
    height: 1rem;
    display: flex;
    justify-content: space-between;
    align-items: center;
    background: #3A75C5;
    color:#FFFFFF;
    font-size: 0.3rem;
    letter-spacing: 2px;
    position: absolute;
    width: 100%;
    z-index: 100;
}
.header div{
    display: flex;
    align-items: center;
}
.header img{
    width:0.8rem
}
* {
    padding: 0;
    margin: 0;
}

img {
    width: 100%;
    height: 100%;
    vertical-align: top;
}

li {
    list-style: none;
}

.time {
    text-align: center;
    font-size: 0.24rem;
    margin: 0.25rem 0;
    font-weight: 500;
}

.content {
    background: #EBEBEB;
    padding: 0.2rem;
    overflow: scroll;
    box-sizing: border-box;
    padding-bottom: 0.8rem
}

span {
    word-wrap: break-word;
    font-weight: 500;
    letter-spacing: 1px;
}

.pop__chat-msg-me {
    display: flex;
    margin-bottom: .36rem;
    justify-content: flex-end;
}

.pop__chat-msg-me2 {
    display: flex;
    margin-bottom: .36rem
}

.pop__chat-msg-content {
    width: 6.29rem;
    display: flex;
    justify-content: flex-end;
}

.pop__chat-msg-content2 {
    width: 6.29rem;
}

.pop__chat-msg-content .pop__chat-msg-msg {
    float: right;
    background-color: #4cb4e7;
    border-color: #4cb4e7;
}

/* .pop__chat-msg-content .pop__chat-msg-msg1 {
    float: right;
    background-color: #88cdda;
    border-color: #88cdda;
} */

.pop__chat-msg-msg {
    background-color: #4cb4e7;
    border-color: #4cb4e7;
    border-style: solid;
    border-width: 0.02rem;
    border-radius: .07rem;
    color: #333;
    float: left;
    font-size: .3rem;
    margin: 0 .2rem;
    padding: 0.15rem .2rem;
    max-width: 4.5rem;
    position: relative;
    color: #fff;
}

.pop__chat-msg-msg1 {
    /* background-color: #fff;
    border-color: #fff;
    border-style: solid; */
    border-width: 1px;
    border-radius: .07rem;
    color: #333;
    float: left;
    font-size: .3rem;
    margin: 0 .2rem;
    /* padding: .15rem .2rem; */
    max-width: 2rem;
    position: relative;
}

.pop__chat-msg-msg2 {
    background-color: #fff;
    border-color: #fff;
    border-style: solid;
    border-width: 1px;
    border-radius: .07rem;
    color: #333;
    float: left;
    font-size: .3rem;
    margin: 0 .2rem;
    padding: .15rem .2rem;
    max-width: 4.5rem;
    position: relative;
}

.pop__chat-msg-msg22 {
    /* background-color: #fff;
    border-color: #fff;
    border-style: solid; */
    border-width: 1px;
    border-radius: .07rem;
    /* color: #333; */
    float: left;
    font-size: .3rem;
    margin: 0 .2rem;
    max-width: 2rem;
    position: relative;
}

.pop__chat-msg-avatar {
    display: block;
    overflow: hidden;
    height: .85rem;
    width: .85rem;
    border-radius: 0.06rem;
}

.pop__clearfix:after {
    content: "";
    clear: both;
    display: block;
}

.pop__chat-msg-content .pop__chat-msg-msg:before {
    background: inherit;
    border-color: inherit;
    right: -.11rem;
    transform: translate(0, -50%) rotate(45deg);
}

.pop__chat-msg-content .pop__chat-msg-msg:before {
    content: '';
    display: inline-block;
    border-style: solid;
    border-width: .01rem .01rem 0 0;
    height: .2rem;
    width: .2rem;
    position: absolute;
    top: .3rem;
}

.pop__chat-msg-msg2:before {
    background: inherit;
    border-color: inherit;
    left: -0.11rem;
    transform: translate(0, -50%) rotate(45deg);
}

.pop__chat-msg-msg2:before {
    content: '';
    display: inline-block;
    border-style: solid;
    border-width: .01rem .01rem 0 0;
    height: .2rem;
    width: .2rem;
    position: absolute;
    top: .3rem;
}

/*  */

.pop__chat-msg-content .pop__chat-msg-msg1:before {
    background: inherit;
    border-color: inherit;
    right: -.11rem;
    transform: translate(0, -50%) rotate(45deg);
}

/* .pop__chat-msg-content .pop__chat-msg-msg1:before {
    content: '';
    display: inline-block;
    border-style: solid;
    border-width: .01rem .01rem 0 0;
    height: .2rem;
    width: .2rem;
    position: absolute;
    top: .3rem;
} */

/* .pop__chat-msg-msg22:before {
    background: inherit;
    border-color: inherit;
    left: -0.11rem;
    transform: translate(0, -50%) rotate(45deg);
}

.pop__chat-msg-msg22:before {
    content: '';
    display: inline-block;
    border-style: solid;
    border-width: .01rem .01rem 0 0;
    height: .2rem;
    width: .2rem;
    position: absolute;
    top: .3rem;
} */

/*  */
.icomess{
    height: 0.6rem;
    background: #f7f7f7;
    display: flex;
    align-items: center;
    justify-content: flex-start;
    padding-bottom: 0.3rem;
    width: 100%;
    overflow: auto;
    overflow-y: hidden;
}
.icomess img{
    height: 0.6rem;
    border-radius: 0.5rem;
    width: 1.8rem;
    margin-left: 0.3rem;
}
.Bottom {
    width: 100%;
    position: absolute;
    bottom: 0;
    left: 0;
    background: #f7f7f7;
    box-shadow: 0px 0px 0.3rem 0px rgba(245, 245, 245, 0.25);
    /* display: flex; */
    border-top: 1px solid rgb(228, 228, 228);
    padding: 0.31rem 0 0;
}

.Bottom button {
    width: 0.52rem;
    height: 0.52rem;
    display: flex;
    align-self: center;
    text-align: center;
    margin: 0 0.14rem;
    border-radius: 50%;
    border: none;
    outline: none;
}

/* .expression {
    background-image: url(../Image/b.png);
    background-size: 100% 100%;
    background-repeat: no-repeat;
} */

.file {
    background-image: url('@/assets/WX/s.png');
    background-size: 100% 100%;
    background-repeat: no-repeat;
}

.sendout {
    width: 1rem !important;
    height: 0.6rem !important;
    border-radius: 0.1rem !important;
    line-height: 0.65rem;
    padding: 0 0.24rem;
    font-size: 0.24rem;
    font-weight: 500;
    background: #297CF1;
    color: #fff;
}

.Bottom input {
    width: 63%;
    height: 0.76rem;
    display: flex;
    align-self: center;
    border: none;
    border-radius: 0.1rem;
    outline: none;
    font-size: 0.32rem;
    padding-left: 0.1rem;
    word-wrap: break-word;
}

.Bottom textarea {
    width: 64%;
    height: 0.56rem;
    display: flex;
    align-self: center;
    border: none;
    border-radius: 0.1rem;
    outline: none;
    font-size: 0.32rem;
    padding-left: 0.1rem;
    word-wrap: break-word;
    padding-top: 0.1rem;
    resize: none;
}

.Press {
    width: 65% !important;
    height: 0.76rem !important;
    border-radius: 0.1rem !important;
    background: #fff !important;
    padding: 0.16rem 1.75rem !important;
    font-size: 0.32rem !important;
    text-align: center !important;
    font-weight: 500;
    margin: 0 !important;
}

.Press:active {
    background: #EBEBEB!important;
}

.state {
    display: flex;
    padding-bottom: 0.31rem;
}

.express {
    transition: all 2s;
    height: 250px;
    display: flex;
    justify-content: flex-start;
    box-sizing: border-box;
    padding: 0.2rem 0.1rem 0;
    flex-wrap: wrap;
    overflow: scroll;
}

</style>

相关关键图标:

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot+vue住房分配管理系统vue

本城镇保障性住房管理系统管理员&#xff0c;用户。管理员功能有个人中心&#xff0c;用户管理&#xff0c;房屋类型管理&#xff0c;房源信息管理&#xff0c;房源申请管理&#xff0c;住房分配管理&#xff0c;留言板管理&#xff0c;系统管理等。因而具有一定的实用性。 本…

c++11 标准模板(STL)(std::bitset)(四)

定义于头文件 <bitset> template< std::size_t N > class bitset; 类模板 bitset 表示一个 N 位的固定大小序列。可以用标准逻辑运算符操作位集&#xff0c;并将它与字符串和整数相互转换。 bitset 满足可复制构造 (CopyConstructible) 及可复制赋值 (CopyAssign…

华为OD机试真题 Java 实现【矩阵稀疏扫描】【2023 B卷 100分】,附详细解题思路

一、题目描述 如果矩阵中的许多系数都为零&#xff0c;那么该矩阵就是稀疏的。对稀疏现象有兴趣是因为它的开发可以带来巨大的计算节省&#xff0c;并且在许多大的实践中都会出现矩阵稀疏的问题。 给定一个矩阵&#xff0c;现在需要逐行和逐列地扫描矩阵&#xff0c;如果某一…

使用阿里云免费Serverless函数计算产品资源安装 Stable Diffusion

喜欢用 Stable Diffusion 的小伙伴注意了&#xff01;上一篇介绍了使用谷歌的 Colab 免费资源来安装这个画图神器。 但因为资源是免费的&#xff0c;高峰时期有可能会被谷歌断掉服务的连接&#xff0c;像周末这种使用高峰&#xff0c;GPU 的资源得不到保证。 没关系&#xff0c…

WPF开发txt阅读器:需求分析和文件读写

文章目录 需求分析读取文本文件保存文本文件 需求分析 尽管现在比较主流的阅读格式已经是epub, modi之类的&#xff0c;但txt的使用范围要远比前两者广泛&#xff0c;所以做一个txt阅读器还是有必要的。 但是对于书籍阅读而言&#xff0c;纯文本不包含目录信息&#xff0c;这…

chatgpt赋能python:Python奇数偶数判断:从基础语法到优化运行

Python奇数偶数判断&#xff1a;从基础语法到优化运行 Python是一门简单易学的编程语言&#xff0c;并且在科学计算、数据处理和人工智能等领域都有广泛的应用。在Python中&#xff0c;判断一个数是奇数还是偶数是一个基础问题&#xff0c;本文将介绍Python中奇数偶数的判断方…

事务与项目跟踪软件Jira

本文软件应网友 不长到一百四誓不改名 要求折腾&#xff1b; 什么是 Jira &#xff1f; Jira 是由 Atlassian 开发的跟踪和管理任务的软件开发工具&#xff0c;您可以将它用于敏捷和瀑布项目管理&#xff0c;以跟踪错误、功能和其他工作项。您还可以将 JIRA 配置为与许多服务管…

Leetcode之二分查找

1. 二分查找 二分查找的前提条件是&#xff1a;有序数组。 二分查找的递归实现&#xff1a; class Solution: def search_recur(self,nums:List[int],low:int,high:int,target:int):if low > high:return -1mid low (high - low) // 2if nums[mid] target:return midel…

chatgpt赋能python:Python在线播放——让您轻松畅览优质视频

Python在线播放——让您轻松畅览优质视频 在数字时代&#xff0c;视频已经成为了一种不可或缺的媒体形式&#xff0c;人们在在日常生活和工作中也更多地借助视频来实现信息传递和沟通。Python在线播放是当下最受欢迎的视频播放方式之一&#xff0c;相比于下载、实时流媒体等方…

Coursera自动驾驶2.3-2.4——传感器:IMU,GNSS,LiDAR

文章目录 一、3D几何和参考系1.旋转变换2.参考系 二、惯性测量单元1.陀螺仪2.加速计 三、全球导航卫星系统&#xff08;GNSS&#xff09;四、激光雷达1.激光雷达和测量模型&#xff08;1&#xff09;激光雷达概述&#xff08;2&#xff09;测量模型 2.点云3.平面拟合4.点云匹配…

Docker 基本管理

一、Docker 概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵守了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。 Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自…

rimraf : 无法加载文件 C:\Program Files\nodejs\rimraf.ps1,因为在此系统上禁止运行脚本。

问题&#xff1a; rimraf 运行 rimraf node_modules 命令报错&#xff1a;&#xff08;rimraf 前端同学可以多多了解&#xff09;rimraf : 无法加载文件 C:\Program Files\nodejs\rimraf.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/…

C#,码海拾贝(34)——求“赫申伯格矩阵”全部“特征值”的“QR方法”之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 矩阵类 /// 作者&#xff1a;周长发 /// 改进&#xff1a;深度混淆 /// https://blog.csdn.net/beijinghorn /// </summary> public partial class Matrix {…

chatgpt赋能python:Python基本词汇介绍

Python基本词汇介绍 Python是一种高级编程语言&#xff0c;它有着广泛的应用&#xff0c;从软件开发到数据科学。Python的语法简单易懂&#xff0c;它被广泛认为是一种易于学习和使用的编程语言。在本文中&#xff0c;我们将介绍一些Python基本词汇&#xff0c;让您能够更好地…

chatgpt赋能python:用Python统计奇偶数的方法

用Python统计奇偶数的方法 Python作为一种广泛应用于数据分析和科学计算的编程语言&#xff0c;具有许多内置函数和库&#xff0c;可以轻松地进行奇偶数的统计。这篇文章将向您展示如何使用Python统计奇偶数&#xff0c;并提供几个常见的示例。 Python奇偶数的定义 奇数是除…

ConcurrentHashMap核心源码(JDK1.8)

一、ConcurrentHashMap的前置知识扫盲 ConcurrentHashMap的存储结构&#xff1f; 数组 链表 红黑树 二、ConcurrentHashMap的DCL操作 HashMap线程不安全&#xff0c;在并发情况下&#xff0c;或者多个线程同时操作时&#xff0c;肯定要使用ConcurrentHashMap 无论是HashM…

Ceph分布式存储 原理+架构图详解

存储基础 单机存储设备 ●DAS&#xff08;直接附加存储&#xff0c;是直接接到计算机的主板总线上去的存储&#xff09; IDE、SATA、SCSI、SAS、USB 接口的磁盘 所谓接口就是一种存储设备驱动下的磁盘设备&#xff0c;提供块级别的存储 ●NAS&#xff08;网络附加存储&#x…

2、MySQL数据库基础

目录 MySQL 连接查询 表 约束 存储引擎 事务 索引 视图&#xff08;View&#xff09; 数据库的导入导出&#xff08;DBA命令&#xff09; 数据库设计三范式 MySQL sql、DB、DBMS分别是什么&#xff1f;它们之间的关系&#xff1f; DB&#xff1a; DataBase&#xff0…

软考A计划-电子商务设计师-系统开发项目管理

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

华为OD机试真题 Java 实现【最小传输时延】【2023 B卷 100分】,附详细解题思路

一、题目描述 某通信网络中有N个网络节点&#xff0c;用1到N进行标识。 网络通过一个有向无环图表示&#xff0c;其中图的边的值表示结点之间的消息传递时延。 现给定相连节点之间的时延列表times[i] {u,v,w}&#xff0c;u表示源节点&#xff0c;v表示目的节点&#xff0c;…