- This topic has 11 replies, 4 voices, and was last updated 3 years, 5 months ago by
David.
-
AuthorPosts
-
November 24, 2021 at 5:15 pm #2020625
_blank
Hello,
How To Make a Toggle Switch Pricing Table using GeneratePress Premium and GenerateBlocks Pro with a clean and light code please? Price table with monthly/annual button, example
Thanks ๐
Best regards.
November 24, 2021 at 8:14 pm #2020697Elvin
StaffCustomer SupportHi Olivier,
This is possible with a bit of custom JS.
Here’s what you can do:
1.) Create the button layout for toggle. Add an HTML anchor to the buttons. (example:
annual-price,monthly-price.) Add class as well (example:price-toggle-btn)
2.) Create the grid layout for the first tab and second tab to be toggled. Add class to both of their wrapper containers (example:price-table). Add an HTML anchor to their container wrappers as well. (example:annual-price-table,monthly-price-table.)After making layout, add this CSS:
.price-tables.active-tab { display: flex; } .price-tables { display: none; }and then hook this script on the wp_footer of the site. (you can do this with Hook Element).
<script> let pricing_toggle_btn = document.querySelectorAll('.price-toggle-btn'); let PriceTables = document.getElementsByClassName('price-tables'); function toggle_price_handle_click(evt) { for (var y = 0; y < pricing_toggle_btn.length; y++) { if ( pricing_toggle_btn[y] == evt.target ) { evt.preventDefault(); targetElement = document.querySelector(evt.target.hash+'-table'); remove_active_tables(); targetElement.classList.add('active-tab'); } } } function remove_active_tables() { for (var i = 0; i < PriceTables.length; i++) { PriceTables[i].classList.remove('active-tab'); } } window.addEventListener("click", toggle_price_handle_click); </script>Note: If you want one of the tables to display by default, add
active-tabon its additional CSS.November 24, 2021 at 8:21 pm #2020703_blank
Hi Elvin,
Thanks ๐
Best regards.
November 24, 2021 at 8:22 pm #2020705Elvin
StaffCustomer SupportNo problem. Glad to be of any help. ๐
November 9, 2022 at 6:26 am #2408062Erol
Hi Elvin,
This solution did not work for me. What I did can be seen @ https://grafabric.com/ink/pricing-table/ and I have created a 2,5 minutes screenshot video showing the block entries @ https://grafabric.com/videos/toggle.mp4
Could this have something to do with the GP updates (This post is dated 2021)?
I can provide admin login if needed. Thank you very much
November 9, 2022 at 6:55 am #2408107David
StaffCustomer SupportHi there,
its probably this:
1.) Create the button layout for toggle. Add an HTML anchor to the buttons. (example: annual-price, monthly-price.) Add class as well (example: price-toggle-btn)I think Elvin meant the URL should include the anchor eg. URL =
#annual-price
As this line of the JS:targetElement = document.querySelector(evt.target.hash+'-table');is grabbing the
hashfrom the URL not the blocks ID.November 9, 2022 at 7:33 am #2408171Erol
Thank you very much but I have tried with both buttons and containers anchors as links but nothing changes. I have also tried full URLs as links for the buttons eg: https://grafabric.com/ink/pricing-table/#monthly-price-table but still no luck. I think problem is both grid containers are always visible hence links don’t work.
November 9, 2022 at 8:10 am #2408442David
StaffCustomer SupportPersonally i would approach it like so:
1. for the tab buttons i would use a custom HTML radio form. This allows a correct Toggle option ie. its either Monthly or its Yearly:
<form id="diggeddy-pricing-form" class="diggeddy-pricing-form"> <input type="radio" id="diggeddy-monthly" name="diggeddy-form-switch" value="monthly" checked=""> <label for="diggeddy-monthly">Monthly</label> <input type="radio" id="diggeddy-yearly" name="diggeddy-form-switch" value="yearly"> <label for="diggeddy-yearly">Yearly</label> <span class="radio-slider"></span> </form>2. Which can be styled with some CSS:
input[name="diggeddy-form-switch"] { width: 0; height: 0; position: absolute; left: -9999px; } input[name="diggeddy-form-switch"]+label { display: block; padding: 15px; position: relative; cursor: pointer; box-sizing: border-box; } input[name="diggeddy-form-switch"]:not(:checked)+label { opacity: 0.7; } .diggeddy-pricing-form { display: flex; box-sizing: border-box; position: relative; z-index: 1; width: 100%; background-color: #eee; border-radius: 8px; overflow: hidden; } .diggeddy-pricing-form label { flex: 1 0 50%; text-align: center; } .diggeddy-pricing-form .radio-slider { display: block; width: calc(50% - 10px); border-radius: 6px; background-color: #fff; position: absolute; left: 5px; top: 5px; bottom: 5px; transform: translate3d(0, 0, 0); transition: transform 0.3s ease-in-out; z-index: -1; } .diggeddy-pricing-form.active .radio-slider { transform: translate3d(calc(100% + 10px), 0, 0); }3. Now for our Javscript:
// Select the target Table element const diggeddyPricingTable = document.querySelector('#diggeddy-price-table'); // Select the Input Form and Input Fields const diggeddyPricingForm = document.querySelector('#diggeddy-pricing-form'); const diggeddyRadios = document.querySelectorAll('input[name="diggeddy-form-switch"]'); // Add event listener on form buttons diggeddyRadios.forEach(radio => { radio.addEventListener('click', function () { // get the selected inputs value diggeddyRadioVal = radio.value; // add remove the yearly class from the table if (diggeddyRadioVal == 'yearly') { diggeddyPricingTable.classList.add('yearly'); diggeddyPricingForm.classList.add('active'); } else { diggeddyPricingTable.classList.remove('yearly'); diggeddyPricingForm.classList.remove('active'); } }); });4. Now after the Radio button form add a Container Block with the ID of
#diggeddy-price-tableThe script will do toggle two classes:
1. On the radio form it will toggle the
activeclass which is used in the above CSS
2. On the container it will toggle theyearlyclass which you can use in your own CSS.5. Inside your Container add your two grids, one for Monthly with a class of
monthly-priceand one for yearly with a class ofyearly-price6. You can use the parent container class to to hide them on condition:
#diggeddy-price-table:not(.yearly) .yearly-price, #diggeddy-price-table.yearly .monthly-price { display: none !important; }November 10, 2022 at 4:40 am #2409666Erol
Many thanks David,
This solution did not work because I could not find a way to add custom div ID to the container and when I do it manually Gutenberg changes the blocks into a classic block which stops the functions. Is there a way to add custom ID to the container bu using add custom attribute function? By the way I managed to find a way in youtube https://www.youtube.com/watch?v=91bCzjUb49I and it works nicely ๐
November 10, 2022 at 7:20 am #2409844David
StaffCustomer SupportAny block including the Container Block, in Advanced there is the HTML Anchor field that is the ID field.
November 10, 2022 at 7:24 am #2409850Erol
Many thanks, I didn’t know anchors could be used for div ID as well ๐ Now I know.. Great support ๐
November 10, 2022 at 8:22 am #2410127David
StaffCustomer SupportYeah they could have made that clearer !
-
AuthorPosts
- You must be logged in to reply to this topic.