【问题标题】:Add a Profile Picture in form in HTML and CSS以 HTML 和 CSS 的形式添加个人资料图片
【发布时间】:2017-05-15 08:40:04
【问题描述】:

我正在创建一个表单,其中我需要用户的个人资料图片,并且我希望图片是圆形或矩形。默认情况下,图像区域应为黑色或虚拟图片。当用户点击该区域时,他/她可以选择一张图片,就像在 Facebook 或 Twitter 中上传个人资料图片一样。

我的表单

HTML

<div class="signup-w3ls">
    <div class="signup-agile1">
        <form action="#" method="post">
        
            <div class="form-control">
                <label class="header">Profile Photo:</label>
                
                <input id="image" type="file" name="profile_photo" placeholder="Photo" required="" capture>
            </div>
            
            <div class="form-control">
                <label class="header">Store Name :</label>
                <input type="text" id="store_name" name="store_name" placeholder="Store Name" title="Please enter your First Name" required="">
            </div>
            
            <div class="form-control">
                <label class="header">Store Type :</label>
                <input type="text" id="store_type" name="store_type" placeholder="Store Type" title="Please enter your Last Name" required="">
            </div>

            <div class="form-control">
                <label class="header">Owner Type :</label>
                <input type="text" id="owner_type" name="owner_type" placeholder="Owner Type" title="Please enter a valid email" required="">
            </div>

            <div class="form-control">
                <label class="header">Website :</label>
                <input type="url" id="website" name="website" placeholder="Website" id="password1" required="">
            </div>

            <div class="form-control">
                <label class="header">Contact Number :</label>
                <input type="text" id="contact_number" name="contact_number" placeholder="Contact Number" required="">
            </div>

            <div class="form-control">
                <label class="header">Contact Email :</label>
                <input type="email" id="contact_email" name="contact_email" placeholder="Contact Email" required="">
            </div>
            
            <input type="submit" class="register" value="Register">

        </form>
    </div>
</div>

CSS

.signup-w3ls {
    width: 50%;
    margin: 70px 25% 80%;
    padding: 0;
    display: table;
    position: relative;
}
.signup-agile1{
    width:100%;
    float:center;
}

.signup-w3ls .signup-agile1 .form-control {
    margin-bottom: 20px;
}
label.header {
    font-size: 16px;
    font-weight: 500;
    width: 215px;
    color: grey;
    margin-right:10px;
    text-align:justify;
    letter-spacing: 1px;
    text-transform: uppercase;
    display: inline-block;
    font-family: 'Nunito', sans-serif;
}
input#image,input#store_name, input#store_type,input#owner_type, input#website,input#contact_number,input#contact_email {
    padding:0 40px;
    width:40%;
    height:55px;
    border: 1px solid #dadada;
    color: grey;
    text-align:justify;
    outline: none;
    letter-spacing: 1px;
    font-size: 16px;
    font-weight:normal;
    font-family: 'Muli', sans-serif;
    border-radius:30px;
    -webkit-border-radius:30px;
    -moz-border-radius:30px;
    -o-border-radius:30px;
    -ms-border-radius:30px; 
}
input#image:focus,input#store_name:focus, input#store_type:focus,input#owner_type:focus, input#website:focus,input#contact_number:focus,input#contact_email:focus  {
    background-color:#f5f8fa !important;
    border:1px solid #dadada;
}
input::-webkit-input-placeholder {
color: grey;
} 
input:-moz-placeholder { /* Firefox 18- */
color: grey;  
} 
input::-moz-placeholder {  /* Firefox 19+ */
color: grey;  
} 
input:-ms-input-placeholder {  
color: grey;  
}
.register {
    background-color: lightgreen;
    width: 52%;
    height: 55px;
    border: none;
    margin-left: 233px;
    cursor: pointer;
    color: #fff;
    outline: none;
    font-size: 20px;
    font-weight: normal;
    text-transform: uppercase;
    transition: all 0.5s ease-in-out;
    -webkit-transition: all 0.5s ease-in-out;
    -moz-transition: all 0.5s ease-in-out;
    -o-transition: all 0.5s ease-in-out;
    border-radius: 30px;
    -webkit-border-radius: 30px;
    -moz-border-radius: 30px;
    -o-border-radius: 30px;
    -ms-border-radius: 30px;
    font-family: 'Muli', sans-serif;
}   
.register:hover {
    background-color:#36b051;
    color:#fff;
}

JSFIDDLE:- https://jsfiddle.net/7ao1qxLe/

【问题讨论】:

  • 你必须研究 twitter/facebook API 并弄清楚如何做到这一点——这是一个多步骤的过程,不能一想就解决
  • 不,我只是给你 twitter 和 facebook 的例子,我想要图片上传器
  • 这也是一个多步骤的过程——你需要有一个使用 PHP 或其他服务器端语言来存储照片的后端实现......这必须是首先通过 FORM 或 ajax 提交到后端,然后您可能还需要一个 database 来存储所有不同的用户配置文件
  • 是的,但是兄弟我只需要设计,我是php和mysql专家
  • 所以,我说你能帮我设计一个只有个人资料上传器的设计

标签: javascript jquery html css user-profile


【解决方案1】:

您可以使用以下代码来应用此图片选择器

<img id="idcardfront" src="images/UploadImgPlaceholder.png" data-type="editable" />
<script>
$("#idcardfront").each(function (i, e) {
var _inputFile = $('<input/>')
.attr('type', 'file')
.attr('hidden', 'hidden')
.attr('id', 'idCardFrontFile')
.attr('onchange', 'readImage()')
.attr('data-image-placeholder', e.id)
.attr('Class', 'hidden');
 $(e.parentElement).append(_inputFile);
 $(e).on("click", _inputFile, triggerClick);
 });
</script>

【讨论】:

    【解决方案2】:

    $("#profileImage").click(function(e) {
        $("#imageUpload").click();
    });
    
    function fasterPreview( uploader ) {
        if ( uploader.files && uploader.files[0] ){
              $('#profileImage').attr('src', 
                 window.URL.createObjectURL(uploader.files[0]) );
        }
    }
    
    $("#imageUpload").change(function(){
        fasterPreview( this );
    });
    #imageUpload
    {
        display: none;
    }
    
    #profileImage
    {
        cursor: pointer;
    }
    
    #profile-container {
        width: 150px;
        height: 150px;
        overflow: hidden;
        -webkit-border-radius: 50%;
        -moz-border-radius: 50%;
        -ms-border-radius: 50%;
        -o-border-radius: 50%;
        border-radius: 50%;
    }
    
    #profile-container img {
        width: 150px;
        height: 150px;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div id="profile-container">
       <image id="profileImage" src="http://lorempixel.com/100/100" />
    </div>
    <input id="imageUpload" type="file" 
           name="profile_photo" placeholder="Photo" required="" capture>

    【讨论】:

      【解决方案3】:

      将图片标签与默认图片分开插入,然后在通过输入标签选择图片的同时读取URL。

      <img id="profile" src="default.png" alt="profile-image" />
      

      function readURL(input) {
              if (input.files && input.files[0]) {
                  var reader = new FileReader();
                  
                  reader.onload = function (e) {
                      $('#profile').attr('src', e.target.result);
                  }
                  
                  reader.readAsDataURL(input.files[0]);
              }
          }
          
          $("#image").change(function(){
              readURL(this);
              //other uploading proccess [server side by ajax and form-data ]
          });

      小提琴链接:https://jsfiddle.net/7ao1qxLe/1/

      【讨论】:

        【解决方案4】:

        您可以做的是隐藏输入,并在点击个人资料图片时表现得好像被点击了:

        $("#profileImage").click(function(e) {
            $("#imageUpload").click();
        });
        #imageUpload
        {
            display: none;
        }
        
        #profileImage
        {
            cursor: pointer;
        }
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <image id="profileImage" src="http://lorempixel.com/100/100" />
        <input id="imageUpload" type="file" 
               name="profile_photo" placeholder="Photo" required="" capture>

        图片预览

        您还可以为用户提供上传图片的预览:

        function previewProfileImage( uploader ) {   
            //ensure a file was selected 
            if (uploader.files && uploader.files[0]) {
                var imageFile = uploader.files[0];
                var reader = new FileReader();    
                reader.onload = function (e) {
                    //set the image data as source
                    $('#profileImage').attr('src', e.target.result);
                }    
                reader.readAsDataURL( imageFile );
            }
        }
        
        $("#imageUpload").change(function(){
            previewProfileImage( this );
        });
        

        效率说明:如果您使用createObjectURL而不是将数据作为 URL 读取,则可以提高效率。

        function fasterPreview( uploader ) {
            if ( uploader.files && uploader.files[0] ){
                  $('#profileImage').attr('src', 
                     window.URL.createObjectURL(uploader.files[0]) );
            }
        }
        

        正如您在MDN 中看到的,URL.createObjectUrl 只会生成文件的 URL,而不必将其加载到 DOM 中,这对于大文件来说绝对是更可取的。

        圆形图像裁剪

        要显示裁剪成圆形的图像,您需要给它一个外部div 并对其应用border-radius:

        HTML:

        <div id="profile-container">
           <image id="profileImage" src="aDefaultImage.png" />
        </div>
        

        CSS:

        #profile-container {
            width: 150px;
            height: 150px;
            overflow: hidden;
            -webkit-border-radius: 50%;
            -moz-border-radius: 50%;
            -ms-border-radius: 50%;
            -o-border-radius: 50%;
            border-radius: 50%;
        }
        

        完整的解决方案

        这个 sn-p 将所有三个步骤放在一起:

        $("#profileImage").click(function(e) {
            $("#imageUpload").click();
        });
        
        function fasterPreview( uploader ) {
            if ( uploader.files && uploader.files[0] ){
                  $('#profileImage').attr('src', 
                     window.URL.createObjectURL(uploader.files[0]) );
            }
        }
        
        $("#imageUpload").change(function(){
            fasterPreview( this );
        });
        #imageUpload
        {
            display: none;
        }
        
        #profileImage
        {
            cursor: pointer;
        }
        
        #profile-container {
            width: 150px;
            height: 150px;
            overflow: hidden;
            -webkit-border-radius: 50%;
            -moz-border-radius: 50%;
            -ms-border-radius: 50%;
            -o-border-radius: 50%;
            border-radius: 50%;
        }
        
        #profile-container img {
            width: 150px;
            height: 150px;
        }
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <div id="profile-container">
           <image id="profileImage" src="http://lorempixel.com/100/100" />
        </div>
        <input id="imageUpload" type="file" 
               name="profile_photo" placeholder="Photo" required="" capture>

        【讨论】:

        • 兄弟,它显示的是默认图片,但它不能显示我可以选择图片的对话窗口
        • 选择图像后,图像保持不变,默认图像
        • 尝试我刚刚添加到答案中的完整解决方案。第一个 sn -p 仅用于文件上传触发。最终解决方案包含预览。
        • 你能帮我解决这个问题吗?
        • 优秀的代码.. 刚刚在我的网站上使用并且完美无瑕!!
        猜你喜欢
        • 1970-01-01
        • 2017-10-24
        • 2020-09-18
        • 1970-01-01
        • 2017-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多