The following would be the approach that I take when designing a form (some more context about the use of this contact form would be greatly appreciated to help improve this answer).
Though you say that there are 20 required fields for this contact form I'd firstly pose two questions:
- Is there any contextual information / pre-population that you can leverage to help reduce the amount of inputs needed by a user?
- Do all those fields need to be answered at that particular point in time?
For the first point, this could involve leveraging location services to help answer fields that relate to geographic / geospatial information. This would also involve ensuring that these fields have been coded properly (e.g. HTML defining what type of field it is) to assist web browsers in pre-populating common input fields that a user has filled out before (e.g. First Name, Last Name, Address, Contact Number).
For the second point, I'd pose whether all of those fields need to be answered at that particular point in time. I would ask what information is essential to initially capture, and then what information could be captured at a later date. For example, I recently signed up to a new bank that had a complete online application process. Since signing up to a new bank involves the bank needing a lot of information, they designed the application process to capture the essential information needed to prove my identity. Once my identity was proved my bank account was open and I was able to login. Here is where they asked for additional information that was still needed, but not essential in the application process to prove my identity.
Once you have answered those first two questions, I would do the following things:
- Determine which fields can be logically grouped together
- Determine which fields can have pre-determined answers to help reduce free-text data input
- If the contact form is expands beyond one page, have an indicator for the user to show how much progress they have made and how much they have to go when filling out the form
Firstly by grouping fields into logical categories it can help reduce the cognitive load for a user filling out the information (see below). By grouping the fields into relevant categories a user is able to focus easier on the information that is needed for a particular category. It can also assist in providing context to the field needing to be completed.
download bmml source – Wireframes created with Balsamiq Mockups
Secondly look at which fields can have predetermined answers. By identifying which fields can have predetermined answers, it can help a user answer a question easier through the use of a radio button or a checkbox rather than text field entry (see below).
download bmml source
Hope this helps, any more questions please ask!