GravityView CSS guide
This guide covers the HTML structure and CSS classes for all GravityView layouts. It is designed for developers who want to customize the appearance of GravityView Views using CSS.
Table of contents #
- Container wrapper
- Table layout
- List layout
- Layout Builder layout
- DataTables layout
- Maps layout
- DIY layout
- Edit Entry
- Search bar widget
- The gv_class() function
- Grid system
- Other styles
- CSS customization filters
- Related links
Container wrapper #
The outermost View wrapper uses the pattern div#gv-view-{View ID}-{counter}. This ID is unique per View instance on a page.
All layouts share the following container classes added by the gv_container_class() function:
.gv-containerโ Standard container class on all Views.gv-container-{id}โ View-specific container (e.g.,gv-container-47)
The following state classes are added conditionally:
.gv-container-no-resultsโ Added when there are zero entries to display.gv-hiddenโ Added when “Hide Until Searched” is active and no search has been performed, or whenno_entries_options === 3- Custom CSS class โ User-defined class from View settings (
$context->view->settings->get('class'))
Each layout also has an outermost template wrapper <div> with a layout-specific class:
.gv-template-tableโ Table layout.gv-template-listโ List layout.gv-template-layout-builderโ Layout Builder layout.gv-template-datatablesโ DataTables layout
This wrapper HTML can be modified using the gravityview/view/wrapper_container filter. See also: All about the View container. The container classes listed above apply to ALL layouts.
Table layout #
Multiple entries
The Table layout renders entries as table rows with column headers.
Class hierarchy:
div#gv-view-{id}-1.gv-template-table
โโโ div.gv-grid.gv-widgets-header (widget zone)
โ โโโ div.gv-grid-row
โ โโโ div.gv-grid-col-1-1.gv-left
โโโ div.gv-table-view.gv-table-container.gv-table-multiple-container.gv-container.gv-container-{id}
โโโ table.gv-table-view
โโโ thead > tr > th.gv-field-{form}-{field}
โโโ tbody > tr.alt > td.gv-field-{form}-{field}
โโโ tfoot > tr > th.gv-field-{form}-{field}HTML example:
<div id="gv-view-47-1" class="gv-template-table">
<div class="gv-grid gv-widgets-header">
<div class="gv-grid-row">
<div class="gv-grid-col-1-1 gv-left">
<!-- Search widget -->
</div>
</div>
</div>
<div class="gv-table-view gv-table-container gv-table-multiple-container gv-container gv-container-47">
<table class="gv-table-view">
<thead>
<tr>
<th id="gv-field-1-id" class="gv-field-1-id" data-label="Entry ID">
<span class="gv-field-label">Entry ID</span>
</th>
<th id="gv-field-1-1" class="gv-field-1-1" data-label="Name">
<span class="gv-field-label">Name</span>
</th>
</tr>
</thead>
<tbody>
<tr class="alt" data-row="0">
<td id="gv-field-1-id" class="gv-field-1-id" data-label="Entry ID">12</td>
<td id="gv-field-1-1" class="gv-field-1-1" data-label="Name">
<a href="/your-view-page/entry/12/">John Doe</a>
</td>
</tr>
<tr class="" data-row="1">
<td id="gv-field-1-id" class="gv-field-1-id" data-label="Entry ID">13</td>
<td id="gv-field-1-1" class="gv-field-1-1" data-label="Name">
<a href="/your-view-page/entry/13/">Jane Smith</a>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<th id="gv-field-1-id" class="gv-field-1-id" data-label="Entry ID">
<span class="gv-field-label">Entry ID</span>
</th>
<th id="gv-field-1-1" class="gv-field-1-1" data-label="Name">
<span class="gv-field-label">Name</span>
</th>
</tr>
</tfoot>
</table>
</div>
</div>Single entry
The single-entry view uses horizontal row orientation: each <tr> contains one field with the label in <th> and value in <td>.
Key differences:
- Container uses
.gv-table-single-containerinstead of.gv-table-multiple-container - Table uses
.gv-table-view-contentclass - Each field is a table row (horizontal orientation)
- Back link appears before the container
HTML example:
<p class="gv-back-link">
<a data-viewid="47" href="/your-view-page/">โ Go back</a>
</p>
<div class="gv-table-view gv-table-container gv-table-single-container gv-container gv-container-47">
<table class="gv-table-view-content">
<thead></thead>
<tbody>
<tr id="gv-field-1-id" class="gv-field-1-id">
<th scope="row"><span class="gv-field-label">Entry ID</span></th>
<td>12</td>
</tr>
<tr id="gv-field-1-1" class="gv-field-1-1">
<th scope="row"><span class="gv-field-label">Name</span></th>
<td>John Doe</td>
</tr>
<tr id="gv-field-1-5" class="gv-section gv-field-1-5">
<th scope="row"><span class="gv-field-label">Additional details</span></th>
<td></td>
</tr>
<tr id="gv-field-1-8" class="gv-field-1-8">
<th scope="row"><span class="gv-field-label">Photo</span></th>
<td>
<a class="gravityview-fancybox" href="..." rel="gv-field-1-8-12">
<img src="..." alt="Photo" class="gv-image gv-field-id-8">
</a>
</td>
</tr>
</tbody>
<tfoot></tfoot>
</table>
</div>No results state
When there are no entries, the Table layout displays the message inside a <td> spanning all columns:
<tbody>
<tr>
<td colspan="3" class="gv-no-results gv-no-results-text">
<p>No entries match your request.</p>
</td>
</tr>
</tbody>Or with an embedded form (no_entries_options = 1):
<tbody>
<tr>
<td colspan="3" class="gv-no-results gv-no-results-form">
<!-- Gravity Forms form rendered here -->
</td>
</tr>
</tbody>Note: The no-results markup differs by layout. Table uses <td> inside the table structure, while List and Layout Builder use <div> elements.
Table-specific notes
- The
gv_class()function generates.gv-field-{form}-{field}classes on<th>and<td>elements - Sort links appear in headers with
.gv-sortand state classes (.gv-icon-caret-up-down,.gv-icon-sort-asc,.gv-icon-sort-desc) - The
.altclass alternates on table rows in<tbody> - Mobile responsive:
<thead>and<tfoot>hidden at โค575.98px;<td>elements use:beforepseudo-elements withdata-labelattribute values
Filter: gravityview/template/table/entry/class modifies CSS class on each <tr> row.
List layout #
Multiple entries
The List layout displays entries as individual list items with title, content, and footer zones.
Class hierarchy:
div#gv-view-{id}-1.gv-template-list
โโโ div.gv-list-container.gv-list-multiple-container.gv-container.gv-container-{id}
โโโ div#gv_list_{entry_id}.gv-list-view
โโโ div.gv-list-view-title
โ โโโ h3.gv-field-{form}-{field} > a (linked title)
โ โโโ div.gv-list-view-subtitle > h4
โโโ div.gv-grid.gv-list-view-content
โ โโโ div.gv-grid-col-1-3.gv-list-view-content-image
โ โโโ div.gv-grid-col-2-3.gv-list-view-content-description
โโโ div.gv-grid.gv-list-view-footer
โโโ div.gv-grid-col-1-2.gv-left
โโโ div.gv-grid-col-1-2.gv-rightHTML example:
<div id="gv-view-22-1" class="gv-template-list">
<div class="gv-list-container gv-list-multiple-container gv-container gv-container-22">
<div id="gv_list_5" class="gv-list-view">
<div class="gv-list-view-title">
<h3 class="gv-field-2-1">
<a href="/your-view-page/entry/5/">John Doe</a>
</h3>
<div class="gv-list-view-subtitle">
<h4 id="gv-field-2-2" class="gv-field-2-2">
Software Engineer at Example Corp
</h4>
</div>
</div>
<div class="gv-grid gv-list-view-content">
<div class="gv-grid-col-1-3 gv-list-view-content-image">
<div id="gv-field-2-8" class="gv-field-2-8">
<a class="gravityview-fancybox" href="...image.jpg" rel="gv-field-2-8-5">
<img src="...image.jpg" width="250" alt="Featured Image"
class="gv-image gv-field-id-8">
</a>
</div>
</div>
<div class="gv-grid-col-2-3 gv-list-view-content-description">
<div id="gv-field-2-3" class="gv-field-2-3">
<p>A brief description of the directory listing goes here.</p>
</div>
</div>
</div>
<div class="gv-grid gv-list-view-footer">
<div class="gv-grid-col-1-2 gv-left">
<div id="gv-field-2-4.1" class="gv-field-2-4.1">123 Main Street</div>
</div>
<div class="gv-grid-col-1-2 gv-right">
<div id="gv-field-2-entry_link" class="gv-field-2-entry_link">
<a href="/your-view-page/entry/5/">View Details</a>
</div>
</div>
</div>
</div>
</div>
</div>Single entry
Key differences:
- Container uses
.gv-list-single-container - Back link appears first
- Title is NOT linked (plain text in
<h3>) - Content zone does NOT have
.gv-gridclass - No footer zone
- Fields may include
span.gv-field-label
HTML example:
<div id="gv-view-22-1" class="gv-template-list">
<div class="gv-list-container gv-list-single-container gv-container gv-container-22">
<p class="gv-back-link">
<a data-viewid="22" href="/your-view-page/">โ Go back</a>
</p>
<div id="gv_list_5" class="gv-list-view">
<div class="gv-list-view-title">
<h3 class="gv-field-2-1">John Doe</h3>
<div class="gv-list-view-subtitle">
<h4 id="gv-field-2-2" class="gv-field-2-2">
Software Engineer at Example Corp
</h4>
</div>
</div>
<div class="gv-list-view-content">
<div class="gv-list-view-content-image gv-grid-col-1-3">
<div id="gv-field-2-entry_map" class="gv-field-2-entry_map">
<!-- Google Map canvas -->
</div>
<div id="gv-field-2-4" class="gv-field-2-4">
123 Main Street<br>Springfield, Illinois 62701<br>United States
</div>
</div>
<div class="gv-list-view-content-description">
<div id="gv-field-2-3" class="gv-field-2-3">
<p>A detailed description of the listing goes here.</p>
</div>
<div id="gv-field-2-7" class="gv-field-2-7">
<span class="gv-field-label">Website:</span>
<p><a href="https://www.example.com" target="_blank">example.com</a></p>
</div>
<div id="gv-field-2-6" class="gv-field-2-6">
<span class="gv-field-label">Email address:</span>
<p><a href="mailto:john@example.com">john@example.com</a></p>
</div>
<div id="gv-field-2-5" class="gv-field-2-5">
<span class="gv-field-label">Phone:</span>
<p><a href="tel:(555)%20123-4567">(555) 123-4567</a></p>
</div>
</div>
</div>
</div>
</div>
</div>No results state
Same pattern as Table layout โ uses .gv-no-results, .gv-no-results-text, or .gv-no-results-form classes.
Filter: gravityview/template/list/entry/class modifies entry wrapper classes.
Layout Builder layout #
Multiple entries
The Layout Builder uses a BEM-style grid system for complete layout control.
Class hierarchy:
div#gv-view-{id}-1.gv-template-layout-builder
โโโ div.gv-grid.gv-widgets-header (widget zone)
โโโ div.gv-layout-builder-container.gv-layout-builder-multiple-container.gv-container.gv-container-{id}
โโโ div.gv-layout-builder-view.gv-layout-builder-view--entry.gv-grid
โโโ div.gv-grid-row
โ โโโ div.gv-grid-col-2-3
โ โ โโโ div.gv-field-{form}-{field}
โ โ โโโ div.gv-grid-value
โ โโโ div.gv-grid-col-1-3
โ โโโ div.gv-field-{form}-{field}
โ โโโ div.gv-grid-value
โโโ div.gv-grid-row
โโโ div.gv-grid-col-1-1
โโโ div.gv-field-{form}-{field}
โโโ div.gv-grid-valueHTML example:
<div id="gv-view-63-1" class="gv-template-layout-builder">
<div class="gv-grid gv-widgets-header">
<div class="gv-grid-row">
<div class="gv-grid-col-1-1 gv-left">
<!-- Search widget here -->
</div>
</div>
</div>
<div class="gv-layout-builder-container gv-layout-builder-multiple-container gv-container gv-container-63">
<div class="gv-layout-builder-view gv-layout-builder-view--entry gv-grid">
<div class="gv-grid-row">
<div class="gv-grid-col-2-3">
<div id="gv-field-3-1" class="gv-field-3-1">
<div class="gv-grid-value">
<a href="/your-view-page/entry/8/">John Doe</a>
</div>
</div>
</div>
<div class="gv-grid-col-1-3">
<div id="gv-field-3-date_created" class="gv-field-3-date_created">
<div class="gv-grid-value">
September 16, 2025
</div>
</div>
</div>
</div>
<div class="gv-grid-row">
<div class="gv-grid-col-1-1">
<div id="gv-field-3-4" class="gv-field-3-4">
<div class="gv-grid-value">Springfield, IL</div>
</div>
<div id="gv-field-3-5" class="gv-field-3-5">
<div class="gv-grid-value">
Full time
</div>
</div>
</div>
</div>
</div>
</div>
</div>Note: The BEM modifier .gv-layout-builder-view--entry distinguishes entry blocks. The .gv-featured-entry class is available in the stylesheet for styling featured entries, but it is not applied automatically. To add it, use the gravityview/template/layout-builder/entry/class filter to conditionally add the class (e.g., for starred entries).
Single entry
Key differences:
- Container uses
.gv-layout-builder-single-container - Back link inside container
- Single grid row with all fields stacked in
.gv-grid-col-1-1 - Fields include
span.gv-field-labelbefore value
HTML example:
<div class="gv-layout-builder-container gv-layout-builder-single-container gv-container gv-container-63">
<p class="gv-back-link">
<a data-viewid="63" href="/your-view-page/">โ Go back</a>
</p>
<div class="gv-layout-builder-view gv-layout-builder-view--entry gv-grid">
<div class="gv-grid-row">
<div class="gv-grid-col-1-1">
<div id="gv-field-3-date_created" class="gv-field-3-date_created">
<span class="gv-field-label">Date created</span>
<div class="gv-grid-value">September 16, 2025</div>
</div>
<div id="gv-field-3-1" class="gv-field-3-1">
<span class="gv-field-label">Name</span>
<div class="gv-grid-value">John Doe</div>
</div>
<div id="gv-field-3-6" class="gv-field-3-6">
<span class="gv-field-label">Category</span>
<div class="gv-grid-value">Full time</div>
</div>
<div id="gv-field-3-4" class="gv-field-3-4">
<span class="gv-field-label">Location</span>
<div class="gv-grid-value">Springfield, IL</div>
</div>
<div id="gv-field-3-3" class="gv-field-3-3">
<span class="gv-field-label">Description</span>
<div class="gv-grid-value">
<p>A detailed description of the entry goes here.</p>
</div>
</div>
</div>
</div>
</div>
</div>No results state
<div class="gv-no-results">
<div class="gv-layout-builder-view-title">
<h3>No entries match your request.</h3>
</div>
</div>Filter: gravityview/template/layout-builder/entry/class modifies entry class.
DataTables layout #
Multiple entries
The DataTables layout extends the Table layout with the DataTables.net JavaScript library. The underlying table structure reuses Table layout classes, but adds DataTables-specific wrappers and controls.
Class hierarchy:
div#gv-view-{id}-1.gv-template-datatables
โโโ div.gv-grid.gv-widgets-header (widget zone)
โโโ div#gv-datatables-{id}.gv-datatables-container.gv-container.gv-container-{id}
โโโ div#DataTables_Table_0_wrapper.dataTables_wrapper
โโโ div.dt-buttons (export buttons)
โโโ div.dataTables_length (page size selector)
โโโ div.dataTables_processing (loading indicator)
โโโ table.gv-datatables.display.dataTable.nowrap.dtr-inline
โ โโโ thead > tr > th.gv-field-{form}-{field}.sorting
โ โโโ tbody > tr.odd|.even > td
โ โโโ tfoot > tr > th
โโโ div.dataTables_info (entry count)
โโโ div.dataTables_paginate.paging_simple_numbers (pagination)HTML example:
<div id="gv-view-85-1" class="gv-template-datatables">
<div class="gv-grid gv-widgets-header">
<div class="gv-grid-row">
<div class="gv-grid-col-1-1 gv-left">
<!-- Search widget -->
</div>
</div>
</div>
<div id="gv-datatables-85" class="gv-datatables-container gv-container gv-container-85">
<div id="DataTables_Table_0_wrapper" class="dataTables_wrapper">
<div class="dt-buttons">
<button class="dt-button buttons-csv buttons-html5" type="button">
<span>CSV</span>
</button>
<button class="dt-button buttons-excel buttons-html5" type="button">
<span>Excel</span>
</button>
<button class="dt-button buttons-print" type="button">
<span>Print</span>
</button>
<button class="dt-button buttons-collection buttons-colvis" type="button">
<span>Columns</span><span class="dt-down-arrow">▼</span>
</button>
</div>
<div class="dataTables_length" id="DataTables_Table_0_length">
<label>Show
<select name="DataTables_Table_0_length">
<option value="10">10</option>
<option value="25">25</option>
<option value="50">50</option>
<option value="-1">All</option>
</select> entries
</label>
</div>
<div class="dataTables_processing" role="status" style="display: none;">
<div class="dataTables_processing_text">Loading data…</div>
<div><div></div><div></div><div></div><div></div></div>
</div>
<table data-viewid="85"
class="gv-datatables display dataTable nowrap dtr-inline"
id="DataTables_Table_0">
<thead>
<tr>
<th id="gv-field-4-1" class="gv-field-4-1 sorting" scope="col">
<span class="gv-field-label">Name</span>
</th>
<th id="gv-field-4-3" class="gv-field-4-3 sorting" scope="col">
<span class="gv-field-label">Department</span>
</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td data-row-index="0" data-column-index="0" class="dtr-control">
<a href="...">John Doe</a>
</td>
<td data-row-index="0" data-column-index="1">Engineering</td>
</tr>
<tr class="even">
<td data-row-index="1" data-column-index="0" class="dtr-control">
<a href="...">Emily Smith</a>
</td>
<td data-row-index="1" data-column-index="1">Marketing</td>
</tr>
</tbody>
<tfoot>
<tr>
<th class="gv-field-4-1" scope="col">
<span class="gv-field-label">Name</span>
</th>
<th class="gv-field-4-3" scope="col">
<span class="gv-field-label">Department</span>
</th>
</tr>
</tfoot>
</table>
<div class="dataTables_info" role="status" aria-live="polite">
Showing 1 to 10 of 10 entries
</div>
<div class="dataTables_paginate paging_simple_numbers">
<a class="paginate_button previous disabled">Previous</a>
<span>
<a class="paginate_button current" aria-current="page">1</a>
</span>
<a class="paginate_button next disabled">Next</a>
</div>
</div>
</div>
</div>Separating GravityView classes from DataTables library classes
GravityView classes:
gv-template-datatables,gv-datatables-container,gv-datatables,gv-field-{form}-{field},gv-field-label,gv-container,gv-container-{id}
DataTables library classes:
dataTables_wrapper,dataTable,display,nowrap,dtr-inline,dtr-control,sorting,odd,even,dataTables_length,dataTables_filter,dataTables_info,dataTables_paginate,paginate_button,current,previous,next,disabled
DataTables Buttons extension classes:
dt-buttons,dt-button,buttons-csv,buttons-excel,buttons-print,buttons-html5,buttons-collection,buttons-colvis,dt-down-arrow
Single entry
The DataTables single-entry view uses the standard Table layout single-entry template โ no DataTables-specific markup. See the Table layout section.
Filter: gravityview_datatables_table_class modifies table CSS classes. See DataTables styling documentation for DataTables library classes.
External documentation: DataTables.net styling documentation
Maps layout #
The Maps layout displays entries as markers on a Google Map with an entry listing table below (or above) the map. The map container is placed in the header widget zone, and the entry listing uses the standard Table layout with a .gv-has-map modifier.
Map container
The map is rendered inside the header widget area using Google Maps JavaScript API.
HTML example:
<div id="gv-map-canvas-31"
class="gv-map-canvas gk-map-canvas gk-multi-entry-map gk-map-visible gk-map-markers-generated gk-map-generated"
data-entryid=""
data-gk-map='{"view_id":31,"entry_id":"","is_multi_entry_map":true,"markers_data":[...]}'
data-gk-map-settings='{"MapOptions":{...},"icon":{...},"layers":{...}}'
style="position: relative; overflow: hidden;">
<!-- Google Maps renders its internal DOM here -->
</div>Entry listing
The entry listing uses the standard Table layout structure with the .gv-has-map modifier:
<div class="gv-table-view gv-table-container gv-table-multiple-container gv-container gv-container-31 gv-has-map">
<table class="gv-table-view">
<thead>
<tr>
<th id="gv-field-5-1" class="gv-field-5-1" data-label="Name">
<span class="gv-field-label">Name</span>
</th>
</tr>
</thead>
<tbody>
<tr class="alt" data-row="0">
<td id="gv-field-5-1" class="gv-field-5-1" data-label="Name">
John Doe
</td>
</tr>
</tbody>
<tfoot></tfoot>
</table>
</div>Info window structure
Info windows (marker popups) are rendered when a marker is clicked. The HTML is stored in the data-gk-map JSON attribute.
Without image:
<div class="gv-infowindow-container gv-infowindow-no-image">
<div class="gv-infowindow-content">
<h4>
<a href="/your-view-page/entry/3/" class="gv-infowindow-entry-link">
John Doe
</a>
</h4>
<p>123 Main Street, Springfield, Illinois 62701</p>
</div>
</div>With image:
<div class="gv-infowindow-container">
<div class="gv-infowindow-image">
<img src="..." alt="...">
</div>
<div class="gv-infowindow-content">
<h4>
<a href="..." class="gv-infowindow-entry-link">Business Name</a>
</h4>
<p>Address details</p>
</div>
</div>Geolocation search
The geolocation search field adds location-based filtering with address autocomplete, current-location button, and radius/unit selectors.
HTML example:
<div class="gv-search-box gk-search-geolocation-field">
<input type="hidden" class="gk-maps-search-current-geolocation-has-search" value="0">
<input type="hidden" class="gk-maps-current-view" value="31">
<input type="hidden" name="lat" class="gk-maps-search-geolocation-lat" value="0" disabled>
<input type="hidden" name="long" class="gk-maps-search-geolocation-lng" value="0" disabled>
<div class="gv-grid-col-1-1">
<label for="search-box-filter_geolocation">Geolocation Radius</label>
</div>
<div class="gv-grid-col-1-1">
<div class="gk-maps-search-geolocation-address-autocomplete-container">
<input type="text"
class="gk-maps-search-geolocation-address-autocomplete pac-target-input"
name="address_search" value="" placeholder="Enter a location">
<button type="button" class="gk-maps-search-current-geolocation"
title="Click to use current location">
<svg><!-- location pin icon --></svg>
</button>
</div>
</div>
<div class="gv-grid-col-1-1">
<select name="filter_geolocation"
class="gk-maps-search-current-geolocation-radius">
<option value="1">1</option>
<option value="5" selected>5</option>
<option value="10">10</option>
</select>
<select name="unit" class="gk-maps-search-current-geolocation-unit">
<option value="km">Kilometers</option>
<option selected value="mi">Miles</option>
</select>
</div>
</div>Maps-specific classes
GravityView Maps classes (gk-* prefix):
gk-map-canvasโ Map canvas containergk-multi-entry-mapโ Multi-entry map identifiergk-map-visible,gk-map-markers-generated,gk-map-generatedโ Map state classesgk-search-geolocation-fieldโ Geolocation search containergk-maps-search-geolocation-address-autocompleteโ Address inputgk-maps-search-current-geolocationโ Current location buttongk-maps-search-current-geolocation-radiusโ Radius selectorgk-maps-search-current-geolocation-unitโ Unit selector (km/mi)
Info window classes:
gv-infowindow-containerโ Outer wrappergv-infowindow-no-imageโ Modifier for entries without imagesgv-infowindow-imageโ Image containergv-infowindow-contentโ Content areagv-infowindow-entry-linkโ Link to entry detail
Google Maps library classes (gm-* prefix):
These classes are generated by the Google Maps JavaScript API โ they are NOT GravityView classes:
gm-style,gm-bundled-control,gm-fullscreen-control,gm-style-cc,gm-style-mtc, etc.
DIY layout #
The DIY layout provides minimal markup for maximum customization flexibility. Unlike other layouts, DIY intentionally has almost no structural HTML.
Multiple entries
Class hierarchy:
div#gv-view-{id}-{seq}.gv-container.gv-container-{id}.gv-diy-container.gv-diy-multiple-container
โโโ div#gv_diy_{entry_slug}.gv-diy-view
โโโ {field value} (bare output, no wrapper by default)
โโโ <div class="{css_classes}">Value</div> (with container tag)
โโโ {Before HTML}{value}{After HTML} (with Before/After Output)HTML example:
<div id="gv-view-100-1"
class="gv-container gv-container-100 gv-diy-container gv-diy-multiple-container">
<div id="gv_diy_abc123" class="gv-diy-view">
John Doe
<div class="custom-field-class">john@example.com</div>
<strong>Phone:</strong> 555-1234<br>
</div>
<div id="gv_diy_def456" class="gv-diy-view">
Jane Smith
<div class="custom-field-class">jane@example.com</div>
<strong>Phone:</strong> 555-5678<br>
</div>
</div>Single entry
Key differences:
- Container uses
.gv-diy-single-container - Back link before container
- Both container and entry classes on same element (
.gv-diy-view.gv-diy-container.gv-diy-single-container)
HTML example:
<p class="gv-back-link"><a href="/your-view-page/">← Go back</a></p>
<div id="gv_diy_abc123"
class="gv-container gv-container-100 gv-diy-view gv-diy-container gv-diy-single-container">
John Doe
<div class="email-field">john@example.com</div>
<p>Full bio text here...</p>
</div>No results state
<div class="gv-diy-view gv-no-results gv-no-results-text">
<div class="gv-diy-view-title">
<h3>No entries match your request.</h3>
</div>
</div>Available filters
DIY provides extensive customization through filters:
gravityview-diy/containerโ Change or remove container element (default:div)gravityview-diy/wrap/multipleโ Toggle entry wrapping in the multiple-entry view (default:true)gravityview-diy/wrap/singleโ Toggle entry wrapping in the single-entry view (default:true)- Per-field Container Tag setting โ Choose from: none,
div,h1–h4,p,blockquote,pre,address - Per-field Before/After Output HTML โ Supports Merge Tags for dynamic content
Note: DIY is intentionally minimal for maximum customization. Fields output bare values with no labels, no wpautop processing, and no default wrapper classes.
Edit Entry #
The Edit Entry view is a shared component that appears across all layouts. When a user clicks an “Edit Entry” link, GravityView renders a form using Gravity Forms’ native GFFormDisplay::get_form(), wrapped in GravityView-specific containers.
Complete structure
<div class="gv-edit-entry-wrapper">
<h2 class="gv-edit-entry-title">
<span>Edit Entry</span>
</h2>
<div class="gv-notice">
Entry Updated. <a href="{back_link}">Return to Entry</a>
</div>
<form method="post" id="gform_{form_id}" enctype="multipart/form-data">
<input type="hidden" name="is_gv_edit_entry" value="..." />
<div class="gform_wrapper gravity-theme">
<div class="gform_body">
<ul class="gform_fields">
<li class="gfield">
<label class="gfield_label">Field Label</label>
<div class="ginput_container ginput_container_{field_type}">
<!-- Input elements -->
</div>
</li>
</ul>
</div>
<div class="gform-footer">
<div id="publishing-action">
<!-- Previous button (multi-page forms only) -->
<input id="gform_previous_button_{form_id}"
class="btn btn-lg button button-large gform_button button-primary gv-button-previous"
type="submit" value="Previous" name="save" />
<!-- Next button (multi-page forms only) -->
<input id="gform_next_button_{form_id}"
class="btn btn-lg button button-large gform_button button-primary gv-button-next"
type="submit" value="Next" name="save" />
<!-- Update button -->
<input id="gform_submit_button_{form_id}"
class="btn btn-lg button button-large gform_button button-primary gv-button-update"
type="submit" value="Update" name="save" />
<!-- Cancel link -->
<a class="btn btn-sm button button-small gv-button-cancel"
onclick="history.go({-N}); return false;"
href="{back_link}">
Cancel
</a>
<!-- Delete button (added by Delete Entry extension) -->
<a class="btn btn-sm button button-small alignright pull-right btn-danger gv-button-delete"
onclick="{confirm_dialog}" href="{delete_url}">
Delete
</a>
<input type="hidden" name="action" value="update" />
</div>
</div>
</div>
</form>
</div>Cancel button behavior
The cancel button’s onclick dynamically calculates how many history steps to go back based on how many times the entry has been updated in the current session. On first visit, it is history.go(-1). After two updates, it becomes history.go(-3). The formula is (update_count + 1) * -1. For multi-page (paged) forms, it uses window.location.href instead of history.go().
Button classes
Update button:
btn btn-lg button button-large gform_button button-primary gv-button-updateCancel button:
btn btn-sm button button-small gv-button-cancelDelete button:
btn btn-sm button button-small alignright pull-right btn-danger gv-button-deletePrevious/Next buttons (multi-page forms):
btn btn-lg button button-large gform_button button-primary gv-button-previous
btn btn-lg button button-large gform_button button-primary gv-button-nextSuccess/error notices
After an entry is updated, a notice is displayed:
<div class="gv-notice">
Entry Updated. <a href="{back_link}">Return to Entry</a>
</div>The notice can have an error class for validation failures:
<div class="gv-notice error">
There was an error updating this entry.
</div>Gravity Forms CSS Ready Classes support
Edit Entry fully supports Gravity Forms CSS Ready Classes because the form is rendered using the native GFFormDisplay::get_form() engine. All standard GF layout classes work:
gf_left_half/gf_right_halfโ Two-column layoutgf_left_third/gf_middle_third/gf_right_thirdโ Three-column layoutgf_inlineโ Inline fieldsgf_list_2col/gf_list_3coletc. โ Multi-column choice lists
The Gravity Forms 2.5+ “gravity-theme” wrapper is also included, providing the modern form styling framework. See Gravity Forms CSS Ready Classes documentation for the full list of available layout classes.
Search bar widget #
The search widget appears in the header widget zone of any layout. It supports horizontal and vertical layouts, various field types (text, select, date, number range), and optional clear buttons.
Search layout classes
The search form uses one of two layout classes on the <form> element:
.gv-search-horizontalโ Fields displayed side by side (horizontal layout).gv-search-verticalโ Fields stacked vertically (vertical layout)
These classes are set based on the “Search Layout” setting in the Search Bar widget configuration.
Horizontal layout
Class hierarchy:
form.gv-widget-search.gv-search-horizontal.gv-search-rows
โโโ div.gv-widget-search-general-search.gv-grid
โโโ div.gv-grid-row
โ โโโ div.gv-grid-col-1-1
โ โโโ div.gv-search-widget-area.gv-search-horizontal
โ โโโ div.gv-search-box.gv-search-field-text.gv-search-field-search_all
โ โโโ div.gv-search-box.gv-search-field-select
โ โโโ div.gv-search-box.gv-search-date.gv-search-field-entry_date
โ โโโ div.gv-search-box.gv-search-field-text
โโโ div.gv-grid-row (submit row)
โโโ div.gv-grid-col-1-2
โ โโโ div.gv-search-box.gv-search-box-submit
โ โโโ a.button.gv-search-clear (optional)
โ โโโ input.button.gv-search-button
โโโ div.gv-grid-col-1-2
โโโ input[type=hidden][name=mode]Search box types
- Text:
div.gv-search-box.gv-search-field-text - Search all:
div.gv-search-box.gv-search-field-text.gv-search-field-search_all - Select:
div.gv-search-box.gv-search-field-select - Multiselect:
div.gv-search-box.gv-search-field-multiselect - Checkbox:
div.gv-search-box.gv-search-field-checkbox - Radio:
div.gv-search-box.gv-search-field-radio - Link:
div.gv-search-box.gv-search-field-link.gv-search-box-links - Date:
div.gv-search-box.gv-search-date.gv-search-field-entry_date - Date range:
div.gv-search-box.gv-search-date-range - Number range:
div.gv-search-box.gv-search-number.gv-search-number-range
Buttons
- Submit:
input.button.gv-search-button - Clear:
a.button.gv-search-clear
Active search state
The form receives .gv-is-search class when an active search is in progress.
Advanced search
Advanced search sections use:
.gv-widget-search-advanced-searchโ Container.gv-search-advanced--openโ Expanded state
HTML example
<form class="gv-widget-search gv-search-horizontal gv-search-rows"
method="get" action="/your-view-page/#gv-view-47-1"
data-viewid="47">
<div class="gv-widget-search-general-search gv-grid">
<div class="gv-grid-row">
<div class="gv-grid-col-1-1">
<div class="gv-search-widget-area gv-search-horizontal">
<div class="gv-search-box gv-search-field-text gv-search-field-search_all">
<div class="gv-search">
<label for="gv_search_47">Search entries</label>
<p>
<input type="search" name="gv_search" id="gv_search_47" value="">
</p>
</div>
</div>
<div class="gv-search-box gv-search-field-select">
<label for="search-box-filter_5">Status</label>
<p>
<select name="filter_5" id="search-box-filter_5">
<option value="" selected>โ</option>
<option value="Active">Active</option>
<option value="Inactive">Inactive</option>
</select>
</p>
</div>
<div class="gv-search-box gv-search-date gv-search-field-entry_date">
<label for="gv_start_date_47">Filter by date:</label>
<p>
<input name="gv_start" id="gv_start_date_47" type="text"
class="gv-datepicker datepicker mdy hasDatepicker" value="">
</p>
</div>
</div>
</div>
</div>
<div class="gv-grid-row">
<div class="gv-grid-col-1-2">
<div class="gv-search-widget-area">
<div class="gv-search-box gv-search-box-submit">
<input type="submit" class="button gv-search-button" value="Search">
</div>
</div>
</div>
<div class="gv-grid-col-1-2">
<div class="gv-search-widget-area">
<input type="hidden" name="mode" value="any">
</div>
</div>
</div>
</div>
</form>The gv_class() function #
The gv_class() function (a wrapper for GravityView_API::field_class()) generates CSS classes for field containers. It is used across all layouts.
How it works
The function builds an array of CSS classes from two sources:
1. Custom class setting โ If the field has a custom_class setting (configured in the View Editor), it is added with Merge Tag support
2. Field ID class โ Generates gv-field-{form_id}-{field_id} format
Format pattern
gv-field-{form_id}-{field_id}Concrete examples
| Form ID | Field ID | Generated Class |
|---|---|---|
| 1 | 5 | gv-field-1-5 |
| 3 | 12 | gv-field-3-12 |
| 1 | 1.3 | gv-field-1-1.3 (Address Street sub-field) |
| 1 | 1.6 | gv-field-1-1.6 (Address Country sub-field) |
Complex fields (address sub-fields)
Address, Name, and other composite fields have sub-fields with decimal IDs:
- Address field 1, Street:
gv-field-1-1.3 - Address field 1, Country:
gv-field-1-1.6
Cross-form fields (joins)
When a field comes from a different form than the View’s primary form, an additional class is added:
<div class="gv-field-1-5 gv-field-3-5">
<!-- Field ID 5 from form 3, displayed in form 1's View -->
</div>Merge Tag CSS class conversion
Custom classes support Merge Tags. The field value is sanitized with sanitize_html_class(), which strips spaces and special characters.
Example:
Custom class {Status:8} where Status = “Office Manager” produces class OfficeManager (single class token, not two separate classes).
Filter hook
The gravityview/field_output/context/class filter allows customization:
add_filter( 'gravityview/field_output/context/class', function( $class, $args, $context ) {
return $class . ' my-custom-class';
}, 10, 3 );Grid system #
GravityView uses its own responsive grid system across all layouts and widgets.
Grid column classes
| Class | Width | Description |
|---|---|---|
.gv-grid |
โ | Grid container |
.gv-grid-row |
100% | Grid row |
.gv-grid-col-1-1 |
100% | Full-width column |
.gv-grid-col-1-2 |
50% | Half-width column |
.gv-grid-col-1-3 |
33.3% | One-third width column |
.gv-grid-col-2-3 |
66.6% | Two-thirds width column |
.gv-grid-col-1-4 |
25% | Quarter-width column |
.gv-grid-col-1-6 |
16.6% | One-sixth width column |
.gv-grid-col-1-8 |
12.5% | One-eighth width column |
Alignment classes
| Class | Description |
|---|---|
.gv-left |
Left-aligned content (widget zones, footers) |
.gv-right |
Right-aligned content (List layout footers) |
See also: Adding Custom CSS Classes to fields or widgets
Responsive behavior
Grid columns collapse to 100% width at:
- 320px (mobile portrait)
- 480px (mobile landscape)
Other styles #
Back link
The back link appears on single-entry Views across all layouts:
<p class="gv-back-link">
<a data-viewid="47" href="/your-view-page/">โ Go back</a>
</p>Pagination widget classes
- Page links:
.gv-widget-page-linkscontainer.page-numbersโ List and link class.page-numbers.currentโ Current page.prev.page-numbersโ Previous button.next.page-numbersโ Next button
- Pagination info:
.gv-widget-pagination(“Displaying X – Y of Z”) - Page size:
.gv-widget-page-sizecontainer
Sort indicator classes
Table layout column headers with sorting enabled use:
.gv-sortโ Base class on sort link.gv-icon-caret-up-downโ Neutral sort state.gv-icon-sort-ascโ Sorted ascending.gv-icon-sort-descโ Sorted descending
No results state classes
.gv-no-resultsโ No entries wrapper.gv-no-results-textโ Text message variant.gv-no-results-formโ Embedded form variant.gv-container-no-resultsโ Container modifier when no entries
Other utility classes
.gv-powered-byโ “Powered by GravityView” credit.gv-widgets-headerโ Header widget zone.gv-widgets-footerโ Footer widget zone
Responsive breakpoints
SCSS variables:
$mobile-portrait: 320px$mobile-landscape: 480px$small-tablet: 600px$tablet-portrait: 768px
Behavior:
- Grid columns collapse to 100% at 320px and 480px
- Table layout:
<thead>and<tfoot>hidden at โค575.98px;<td>displayed as block - Layout Builder: stacks at 768px
- Edit Entry: buttons stack at 400px
CSS customization filters #
Container filters
gravityview/render/container/class
Modify the CSS class added to the wrapper <div> of a View.
| Parameter | Type | Description |
|---|---|---|
$css_class |
string |
Default: gv-container gv-container-{view_id}. Adds gv-container-no-results when no entries, gv-hidden when hidden until searched. |
$context |
\GV\Template_Context |
The template context object. |
Since: 1.5.4, 2.0
add_filter( 'gravityview/render/container/class', function( $css_class, $context ) {
return $css_class . ' my-custom-container';
}, 10, 2 );gravityview/view/wrapper_container
Modify the wrapper container HTML markup.
| Parameter | Type | Description |
|---|---|---|
$wrapper_container |
string |
Wrapper container HTML markup. |
$anchor_id |
string |
(optional) Unique anchor ID to identify the View. |
$view |
\GV\View |
The View object. |
Since: 2.15
add_filter( 'gravityview/view/wrapper_container', function( $wrapper, $anchor_id, $view ) {
return '<section id="' . esc_attr( $anchor_id ) . '" class="gv-template-table">{content}</section>';
}, 10, 3 );Entry row filters
gravityview/template/table/entry/class
Modify the class applied to each entry row in Table layout.
| Parameter | Type | Description |
|---|---|---|
$class |
string |
The existing class. |
$context |
\GV\Template_Context |
The template context object. |
Since: 2.0.6.1
add_filter( 'gravityview/template/table/entry/class', function( $class, $context ) {
$entry = $context->entry->as_entry();
if ( ! empty( $entry['is_starred'] ) ) {
$class .= ' gv-featured-entry';
}
return $class;
}, 10, 2 );gravityview/template/table/entry/row/attributes
Filter the HTML attributes for a row in Table layout.
| Parameter | Type | Description |
|---|---|---|
$attributes |
array |
The HTML attributes. |
$context |
\GV\Template_Context |
The template context object. |
Since: 2.0
gravityview/template/list/entry/class
Modify the class applied to each entry in List layout.
| Parameter | Type | Description |
|---|---|---|
$class |
string |
The existing class. |
$context |
\GV\Template_Context |
The template context object. |
Since: 2.0.6.1
gravityview/template/layout-builder/entry/class
Modify the class applied to each entry in Layout Builder layout.
| Parameter | Type | Description |
|---|---|---|
$class |
string |
The existing class. |
$context |
\GV\Template_Context |
The template context object. |
Since: 2.46.2
gravityview_entry_class (deprecated)
Modify the class applied to an entry row. Use the layout-specific filters above instead.
| Parameter | Type | Description |
|---|---|---|
$class |
string |
Existing class. Default: alt for odd rows, empty string for even rows. |
$entry |
array |
Current entry being displayed. |
$view |
\GravityView_View |
Current GravityView_View object. |
Field filters
gravityview/field_output/context/{$tag}
Filter content for a specific template tag placeholder. For CSS class customization, use the class tag: gravityview/field_output/context/class.
| Parameter | Type | Description |
|---|---|---|
$value |
string |
The content to be shown instead of the {{ tag }} placeholder. |
$args |
array |
Arguments passed to the function. |
$context |
\GV\Template_Context |
The template context object. |
Since: 1.11, 2.0
add_filter( 'gravityview/field_output/context/class', function( $class, $args, $context ) {
return $class . ' custom-field-class';
}, 10, 3 );Modify the args before field output generation begins.
| Parameter | Type | Description |
|---|---|---|
$args |
array |
Associative array; field and form are required. |
$passed_args |
array |
Original associative array with field data. |
$context |
\GV\Template_Context |
The template context object. |
Since: 1.7, 2.0
Modify the final rendered field HTML output.
| Parameter | Type | Description |
|---|---|---|
$html |
string |
Existing HTML output. |
$args |
array |
Arguments passed to the function. |
$context |
\GV\Template_Context |
The template context object. |
Since: 2.0
gravityview/field_output/pre_html
Modify the field HTML template before placeholder replacement.
| Parameter | Type | Description |
|---|---|---|
$markup |
string |
The HTML markup template. |
$args |
array |
All args for the field output. |
$context |
\GV\Template_Context |
The template context object. |
Since: 1.11, 2.0
Search filters
Modify the CSS class for the search form.
| Parameter | Type | Description |
|---|---|---|
$search_class |
string |
The CSS class for the search form. |
add_filter( 'gravityview_search_class', function( $search_class ) {
return $search_class . ' custom-search-class';
});gk/gravityview/search/widget/grid/column-class
Filter the CSS class for search widget grid columns.
| Parameter | Type | Description |
|---|---|---|
$column_class |
string |
The CSS class for the column (e.g., gv-grid-col-1-3). |
$col |
string |
The original column specification. |
$areas |
array |
Array of areas within the column. |
$search_fields |
\Search_Field_Collection |
The search fields collection. |
Since: 2.44
DIY-specific filters
gravityview-diy/container
Changes the container element type (default: 'div'). Return false or empty string to remove container.
add_filter( 'gravityview-diy/container', function() {
return 'section'; // or '__return_false' to remove
});gravityview-diy/wrap/multiple
Toggles entry wrapping in the multiple-entry view (default: true).
gravityview-diy/wrap/single
Toggles entry wrapping in the single-entry view (default: true).
gravityview-diy/container-tags
Modifies available container tag options for field wrapping.
Returns: array of 'tag' => 'LABEL'
Widget zone filters
gravityview/widgets/wrapper_css_class
Modify the CSS class applied to the widget zone wrapper <div> (the .gv-widgets-header and .gv-widgets-footer containers).
| Parameter | Type | Description |
|---|---|---|
$css_class |
string |
Default: gv-grid gv-widgets-{zone}. Adds gv-widgets-no-results when the View has no results. |
$zone |
string |
Current widget zone: header or footer. |
$widgets |
array |
Array of widget configurations for the current zone. |
Since: 1.16.2
add_filter( 'gravityview/widgets/wrapper_css_class', function( $css_class, $zone, $widgets ) {
if ( 'header' === $zone ) {
$css_class .= ' my-custom-header';
}
return $css_class;
}, 10, 3 );Other filters
Override the lightbox script to enqueue. Default: thickbox.
| Parameter | Type | Description |
|---|---|---|
$script_slug |
string |
If you want to use a different lightbox script, return the name of it here. |
$view |
\GV\View |
The View object. |
Since: 2.5.1
add_filter( 'gravityview_lightbox_script', function( $script_slug ) {
return 'my-lightbox-script';
}, 10, 2 );gravityview_datatables_table_class
Modifies the CSS classes applied to the DataTables <table> element.
| Parameter | Type | Description |
|---|---|---|
$classes |
array |
Array of CSS class strings. |
add_filter( 'gravityview_datatables_table_class', function( $classes ) {
$classes[] = 'my-custom-table-class';
return $classes;
});