Mark Rackley has a brilliant guide on custom forms that I've used in the past. I suggest you check it out:
http://www.markrackley.net/2013/08/29/easy-custom-layouts-for-default-sharepoint-forms/
The two basic elements you need are his JavaScript and your own HTML layout for your form. I'll copy the key bits from the article below.
Here’s the script I wrote that is responsible for moving the contents
of the form fields into your custom layout. You don’t necessarily need
to understand what it’s doing, just make sure to include it on your
page.
<script src="//code.jquery.com/jquery-1.10.1.min.js"></script>
<style type="text/css">
.ms-formtable
{display:none;}
</style>
<script type="text/javascript">
$(document).ready(function() {
//loop through all the spans in the custom layout
$("span.hillbillyForm").each(function()
{
//get the display name from the custom layout
displayName = $(this).attr("data-displayName");
displayName = displayName.replace(/&(?!amp;)/g,'&');
elem = $(this);
//find the corresponding field from the default form and move it
//into the custom layout
$("table.ms-formtable td").each(function(){
if (this.innerHTML.indexOf('FieldName="'+displayName+'"') != -1){
$(this).contents().appendTo(elem);
}
});
});
});
</script>
So, the key that makes this all work is that the script is looking for
each “span” in your custom layout that has the class “hillbillyForm”.
This special span is the placeholder for your SharePoint Form
input/display field.
The script then looks for a custom attribute in this span called
“data-displayName”. The value of this attribute is the DISPLAY NAME of
the SharePoint Form field for which the span is a placeholder
So, all you have to do is design a form using standard html, with css,
and whatever you want, and put this special span where you want the
field input to appear making sure to put in the correct display name
for that field.
Here’s my super basic HTML form. I’m just using an old school table
that basically turns the default form into a two column form.
<h1>New Issueh1>
<table cellpadding="5" cellspacing="5" bgcolor="#FFFFCC" >
<tr >
<td>
<b>Title:b><br>
<span class="hillbillyForm" data-displayName="Title">span>
td>
<td>
<b>Issue Status:b><br>
<span class="hillbillyForm" data-displayName="Issue Status">span>
td>
tr>
<tr >
<td>
<b>Assigned To:b><br>
<span class="hillbillyForm" data-displayName="Assigned To">span>
td>
<td>
<b>Priority:b><br>
<span class="hillbillyForm" data-displayName="Priority">span>
td>
tr>
<tr >
<td>
<b>Description:b><br>
<span class="hillbillyForm" data-displayName="Description">span>
td>
<td valign="top">
<b>Category:b><br>
<span class="hillbillyForm" data-displayName="Category">span>
<b>Alert Me:b><br>
<span class="hillbillyForm" data-displayName="Alert Me">span>
<b>Blame:b><br>
<span class="hillbillyForm" data-displayName="Blame">span>
td>
tr>
<tr >
<td>
<b>Related Issues:b><br>
<span class="hillbillyForm" data-displayName="Related Issues">span>
td>
<td valign="top">
<b>Due Date:b><br>
<span class="hillbillyForm" data-displayName="Due Date">span>
td>
tr>
<tr >
<td>
<b>Comments:b><br>
<span class="hillbillyForm" data-displayName="Comments">span>
td>
<td valign="top">
td>
tr>
table>
Make sense? I just made sure to create a span for each field that I
wanted to display in my custom layout.
Oh, and here’s a quick tip at no extra charge. If you don’t want a
field to show up in your form, just don’t create a span for it. No
error will be thrown (unless it’s a required field) and the form will
still save and update just fine.