做一个模拟两人聊天的界面遇到困难。

问题描述

现在有三个问题:
第一:我无法让头像图片跟随说的话一起发送出去,我试过直接放入img.src但是并不行。
第二:我没有办法做到让两个模拟的对话一人一句分的清清楚楚,因为我这个发送出去的 是改变这个div的innerHTML 但是我发第二句的话同样也是改变div的innerHTML 他们两个本来就应该是一个 所以我搞不清要怎么变成两个 。
第三:怎么让我发送的字是从上到下显示,我试过改变他们的外边距,但是并没有什么效果。

问题出现的环境背景及自己尝试过哪些方法

我询问了多个前端群,自己也在浏览器查了多次,但都没能解决。

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

<!doctype html>
<html>
<head>
<meat charset="utf-8">
<title>模拟手机聊天</title>
<style>
#phpone{
    width:330px;
    height:550px;
    border:5px solid #FFD700;
    margin:80px auto 0;
    position:relative;
}
#case{
    width:330px;
    height:50px;
    border-top:2px solid #ccc;
    position:absolute;
    bottom:0;
    background:#EBEBEB;
}
#img1{
    widht:50px;
    height:50px;
    position:absolute;
    left:0;
    bottom:0;    
}
#img2{
    widht:50px;
    height:50px;
    position:absolute;
    left:0;
    bottom:0;
    display:none;    
}    
#text{
    position:absolute;
    right:110px;
    bottom:10px;
}
#but{
    width:80px;
    height:30px;
    position:absolute;
    right:10px;;
    bottom:7px;
    background:#708090;
}
#box{
    padding:5px 0;
    background:#7CFC00;
    font-size:20px;
    font-family:"宋体";
    position:absolute;
    right:0;
    
}
#box2{
    widht:auto;
    background:#ccc;
    font-size:20px;
    font-family:"宋体";
    margin:50px 50px 50px 0;
    position:absolute;
    left:0;
    padding:5px 0;
}
</style>
</head>
<body>
<div id="phpone">
<div id="box"></div><br/>
    <div id="box2"></div>
    <div id="case">
    <img id="img1" src="img/wou.svg"/>
    <img id="img2" src="img/man.svg"/>
    <input id="text" type="text"/>
    <input id="but" type="button" value="发送"/>
</div>
</div>
</body>
/*下面是js代码*/
<script>
    window.onload=function(){
    var oImg1=document.getElementById('img1');
    var oImg2=document.getElementById('img2');
    var oText=document.getElementById('text');
    var oBut=document.getElementById('but');
    var oPhpone=document.getElementById('phpone');
    var oBox=document.getElementById('box');
    var oBox2=document.getElementById('box2');    

    low();

    oImg1.onclick=show;
    function show(){
    oImg2.style.display='block';
    oBut.onclick=function(){
    oBox2.innerHTML +='说:'+oText.value+'<br/>';
    oText.value='';
};
};
    oImg2.onclick=low;
    function low(){
    oImg2.style.display='none';
    oBut.onclick=function(){
    oBox.innerHTML +='说:'+oText.value+'<br/>';
    oText.value='';
    
};
    
};
};
</script>
</html>

你期待的结果是什么?实际看到的错误信息又是什么?

希望完成的如下的效果:
图片描述
目前是这样:
图片描述

希望各位伙伴可以帮助我,或给我提供一个思路。我现在完全想不明白要怎么继续写。谢谢!

阅读 1.9k
2 个回答

首先要理解页面的模块应该怎么划分,首先,可以看出来头像与文字应该组成一个模块,因为都是它们都是组合出现的,所以可以放在同一个块状元素下,其次头像与文字上面应该有一个模块,有固定高度,使得当内容超出长度时,出现滚动条而不是溢出显示。最后概括如下:

   <div>  // 盒子
           <p>
               <img /> //头像
               <span></span> //文字
           </p>
           <p>
               <img /> //头像
               <span></span> //文字
           </p>
           <p>
               <img /> //头像
               <span></span> //文字
           </p>
   </div>

至于从上到下显示,只要将组合好的P标签一直插入到盒子元素的第一个就好了

理清完html显示,现在理一下js逻辑,首页,可以看出有两个人说话,按照面向对象编程,可以理解为两个对象
。然后我们看一下两个对象有什么相同的,不相同的。
相同
(1)都有头像
(2)都会说话
不同
(1) 一个说话时头像文字居左显示,一个头像文字居右显示

根据上面我们我们可以构建出这两个对象

var xiaoMing = {
    img: 'xiaoMing.png',
    float: 'left',
    say: function(){}
}
var xiaoMei = {
    img: 'xiaoMei.png',
    float: 'right',
    say: function(){}
}

由于说话的方法大部分相同 可以抽出来

    function sayFun(text) {
        var p = document.createElement('p'),
            imgHTML = '<img src="' + this.img + '" style="float: ' + this.float + '"/>';
            textHTML = '<span style="float: ' + this.float + '">' + text+'</span>',
            clearHTML = '<div style="clear:both"></div>';
            box = document.getElementById('box2');
        p.innerHTML = imgHTML + textHTML + clearHTML;
        box.insertBefore(p, box.firstChild);
    }    

切换左下角头像时,等于指定接下来要说话的人,即 nextSayPersion = 某人
在点击说话时 就是说这个被指定要说话的人要说话了 即 nextSayPersion.say('我说话啦')

整理全部代码如下:

<!doctype html>
<html>
<head>
<meat charset="utf-8">
<title>模拟手机聊天</title>
<style>
p{
    padding: 0;
    margin:  0;
}
#phpone{
    width:330px;
    height:550px;
    border:5px solid #FFD700;
    margin:80px auto 0;
    position:relative;
}
#case{
    width:330px;
    height:50px;
    border-top:2px solid #ccc;
    position:absolute;
    bottom:0;
    background:#EBEBEB;
}
#img1{
    width:50px;
    height:50px;
    position:absolute;
    background: red;
    left:0;
    bottom:0;    
}
#text{
    position:absolute;
    right:110px;
    bottom:10px;
}
#say{
    width:80px;
    height:30px;
    position:absolute;
    right:10px;
    bottom:7px;
    background:#708090;
}
#box{
    padding:5px 0;
    background:#7CFC00;
    font-size:20px;
    font-family:"宋体";
    position:absolute;
    right:0;
    
}
#box2{
    height: 480px;
    background: #ccc;
    font-size: 20px;
    font-family: "宋体";
    padding: 5px 0;
}
</style>
</head>
<body>
    <div id="phpone">
        <div id="box"></div>
           <div id="box2"></div>
            <div id="case">
                <div id="choose">
                    <img id="img1" src="img/wou.svg"/>                
                </div>
                <input id="text" type="text"/>
                <input id="say" type="button" value="发送"/>
            </div>
    </div>
</body>
/*下面是js代码*/
<script>
    window.onload = function () {
        function sayFun(text) {
            var p = document.createElement('p'),
                imgHTML = '<img src="' + this.img + '" style="float: ' + this.float + '"/>';
                textHTML = '<span style="float: ' + this.float + '">' + text+'</span>',
                clearHTML = '<div style="clear:both"></div>';  // 清除浮动 浮动元素才会撑起父元素高度
                box = document.getElementById('box2');
            p.innerHTML = imgHTML + textHTML + clearHTML;
            box.insertBefore(p, box.firstChild);
        }        

        var xiaoMing = {
            img: 'xiaoMing.png',
            float: 'left',
            say: sayFun
        }
        var xiaoMei = {
            img: 'xiaoMei.png',
            float: 'right',
            say: sayFun
        }
        var nextSayPerson = false, //默认小明先说话 之后触发点击事件 这里先不设置
            chooseDom = document.getElementById('choose'),
            sayDom = document.getElementById('say');         

        // 切换要说话的对象 以及 他的头像
        choose.onclick = function () {
            nextSayPerson = nextSayPerson === xiaoMing ? xiaoMei : xiaoMing;
            document.getElementById('img1').src = nextSayPerson.img;
        }

        // 让要说话的人说话
        sayDom.onclick = function () {
            var textDom = document.getElementById('text'),
                text = textDom.value;
            nextSayPerson.say(text);
            // 说完把记录删了
            textDom.value = '';
        }

        // 让小明先说话
        choose.onclick();


    }
</script>
</html>

<div>
    <img src="" />
    <p>你要说的话</p>
</div>

发送一句插入一段上面的上面这个结构,可以克隆也可以创建一个新的div

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题