#3dbuttons
Explore tagged Tumblr posts
Text
Click Me! Creating a Stunning 3D Button with CSS
Introduction
Welcome to the world of captivating web design! In this blog post, we will delve into the art of creating a stunning 3D button using CSS. As websites continue to evolve, user interaction and engagement become increasingly vital. A well-crafted 3D button not only adds visual appeal but also enhances the overall user experience.
Why 3D Buttons Matter
See the Pen 3D Buttons by Rafaël De Jongh (@RafaelDeJongh) on CodePen. In the realm of web design, the significance of 3D buttons cannot be overstated. These elements play a crucial role in grabbing users' attention and fostering a more engaging online experience. Let's explore the reasons why 3D buttons matter: - Visual Appeal: 3D buttons bring a sense of depth and realism to a webpage, making them visually striking and memorable. - User Interaction: The interactive nature of 3D buttons encourages users to click, providing a tangible response to their actions. - Enhanced User Experience: Well-designed 3D buttons contribute to a positive user experience by making navigation intuitive and enjoyable. - Call-to-Action Emphasis: When used for call-to-action (CTA) elements, 3D buttons draw attention to important actions, increasing conversion rates. - Modern Aesthetics: As web design trends evolve, 3D elements, including buttons, contribute to a contemporary and stylish look. Consider the psychological aspect as well. Humans are naturally drawn to three-dimensional objects, and leveraging this instinct in web design can make a website more inviting and memorable. Now, let's break down the key details that make 3D buttons stand out: Aspect Details Depth: 3D buttons simulate depth, creating the illusion that they exist in a three-dimensional space. Shadows and Highlights: Strategically applied shadows and highlights add realism, making buttons appear more tactile. Color and Texture: Choosing the right color scheme and texture contributes to the overall aesthetics and feel of the button. By understanding these details, web designers can harness the power of 3D buttons to create a visually appealing and user-friendly website that stands out in the crowded digital landscape.
Getting Started with CSS
Embarking on the journey to create a stunning 3D button requires a solid foundation in CSS (Cascading Style Sheets). Let's break down the essential steps to get started: - CSS Setup: Begin by linking your HTML file to an external CSS stylesheet. This ensures a separation of concerns, making your code more organized and maintainable. - Basic HTML Structure: Create the HTML structure for your button, ensuring you use semantic and accessible markup. This includes the button element itself and any additional elements for text or icons. - Selectors and Classes: Utilize CSS selectors to target the specific elements you want to style. Using classes for styling 3D buttons allows for reusability across multiple buttons on your site. Now, let's delve into the foundational CSS code to set the stage for your 3D button: Step CSS Code 1. Button Styling: Define the styles for the button, including dimensions, border-radius, and background color. This sets the initial appearance of the button. 2. Box Shadow: Add a subtle box shadow to create the illusion of depth. Adjust the shadow's properties to achieve the desired 3D effect. Transition Effects: Incorporate CSS transitions for smooth hover effects. This enhances the user experience by providing visual feedback when the button is interacted with. Keep in mind the importance of experimenting and fine-tuning these styles to achieve the desired look and feel for your 3D button. Don't hesitate to iterate and make adjustments as needed. By laying the groundwork with these CSS basics, you're ready to move on to the next steps in creating a visually appealing and interactive 3D button for your website.
Building the Foundation
Now that we've set up the groundwork with CSS, let's focus on building the foundation of our stunning 3D button. This phase involves creating the core structure and styling that will form the basis of the button's appearance. Here's a step-by-step guide to building this foundation: - HTML Structure: Ensure your HTML includes the necessary elements, such as the button container and any text or icons within the button. Semantic and accessible HTML contributes to better overall web accessibility. - Button Styles: Apply the foundational styles to the button, setting properties like dimensions, border-radius, and background color. This creates the initial visual appearance of the button. - Box Model: Understand and manipulate the CSS box model to control spacing, padding, and margins around the button. This ensures proper alignment and spacing within your design. Let's delve into the details with a breakdown of key elements in building the foundation: Element Details Button Container: Create a container for the button, setting its display property and positioning if necessary. This container serves as the encompassing element for your 3D button. Text and Icons: If your button includes text or icons, style these elements to complement the overall design. Consider factors like font size, color, and alignment to achieve a cohesive look. Background Gradient: Enhance the button's visual appeal by applying a gradient background. This adds depth and dimension, contributing to the 3D effect. Remember to maintain a balance between creativity and usability during this phase. Striking visuals should not compromise the button's functionality or accessibility. As you build this foundation, take the opportunity to preview your work regularly and make adjustments to achieve the desired aesthetic and user experience. The next steps will further refine and elevate your 3D button, bringing it to life on your website.
Adding Depth and Shadows
Now that we've established the foundational structure of our 3D button, it's time to elevate its visual appeal by adding depth and shadows. This phase involves incorporating CSS techniques to simulate a three-dimensional appearance, making the button stand out on the webpage. Let's explore the key details in adding depth and shadows to our 3D button: - Box Shadow: Utilize the CSS box-shadow property to create shadows around the button. Adjust parameters such as offset, blur, and color to achieve the desired depth effect. A subtle shadow can make the button appear raised, giving it a tactile feel. - Inner Shadows: Experiment with pseudo-elements or additional box-shadow properties to simulate inner shadows. This technique adds complexity to the button's appearance, making it visually intriguing. - Gradient Enhancements: Enhance the gradient background with variations in color stops. This not only adds depth but also contributes to the illusion of light and shadow on the button's surface. Let's break down the process with a detailed look at the CSS code: Technique CSS Code Basic Box Shadow: Add a box-shadow property to the button, specifying values for horizontal and vertical offset, blur radius, and shadow color. This creates a simple shadow effect. Inner Shadow: Experiment with pseudo-elements (::before or ::after) to create inner shadows. Apply an inset box-shadow with appropriate parameters to achieve the desired effect. Gradient Adjustments: Refine the gradient background by adjusting color stops and angles. Consider incorporating lighter and darker shades to mimic light and shadow play on the button. Keep in mind that moderation is key when adding shadows. Striking a balance between subtlety and impact ensures the button retains a polished and professional appearance. Regularly preview your button's design and make adjustments as needed to achieve the perfect 3D effect. With these depth-enhancing techniques, your 3D button is poised to capture attention and provide users with an engaging visual experience.
Hover Effects and Animations
Adding dynamic and interactive elements to your 3D button can elevate the user experience. Hover effects and animations contribute to the overall engagement by providing visual feedback when users interact with the button. In this phase, we'll explore how to implement captivating hover effects and subtle animations to make your 3D button come to life: - Transition Properties: Begin by setting up CSS transition properties for the button. This defines how the styles will smoothly change over a specified duration, creating a polished effect during hover. - Transform Property: Utilize the CSS transform property to apply transformations to the button on hover. This can include scaling, rotating, or translating the button to add a dynamic element. - Opacity Changes: Experiment with altering the opacity of the button or its elements during hover. This can create a subtle fading effect that enhances the overall transition. Let's delve into the details with a breakdown of the CSS code for implementing hover effects and animations: Effect CSS Code Smooth Transition: Define the transition property on the button to control which styles will transition smoothly. Specify the duration and easing function for a seamless effect. Scale on Hover: Apply a transform scale property to the button on hover, making it appear larger or smaller. Adjust the scale factor to achieve the desired visual impact. Opacity Change: Implement a transition on the opacity property to create a fading effect during hover. This can be particularly effective in providing a subtle, sophisticated animation. It's crucial to strike a balance between adding engaging animations and maintaining a professional look. Overly flashy effects might distract users, so consider the overall design and purpose of your website. Regularly test and refine your hover effects to ensure they enhance the user experience without causing any usability issues. With these dynamic additions, your 3D button will not only look impressive but also engage users as they explore your website.
Responsive Design Considerations
Ensuring your 3D button looks great and functions seamlessly across various devices is a crucial aspect of modern web design. Responsive design allows your website to adapt to different screen sizes and orientations, providing an optimal user experience. Let's explore the key considerations for making your 3D button responsive: - Media Queries: Implement media queries in your CSS to define styles based on different device characteristics, such as screen width. This allows you to customize the appearance of your 3D button for various devices. - Fluid Layout: Design your button with a fluid layout that scales proportionally with the screen size. This ensures that the button adapts smoothly to different devices without losing its 3D effect. - Touch-Friendly Size: Consider the touch interface on mobile devices. Ensure that your 3D button is of an adequate size to be easily tappable, preventing user frustration with accidental clicks. Now, let's break down the responsive design considerations with a detailed look at the CSS code: Consideration CSS Code Media Query Setup: Define media queries in your CSS file, specifying breakpoints based on screen width. Adjust styles within these queries to optimize the 3D button's appearance for each breakpoint. Fluid Width: Set the width of your button using percentage units rather than fixed pixels. This allows the button to scale proportionally with the screen, maintaining its 3D effect across devices. Touch-Friendly Styling: Include styles that increase the size of the 3D button on smaller screens. This ensures a touch-friendly design and enhances the overall user experience on mobile devices. Regular testing on various devices and screen sizes is crucial to ensure your 3D button adapts gracefully to different contexts. By prioritizing responsive design, you guarantee that users across devices have access to an aesthetically pleasing and functional button on your website.
Optimizing for Performance
As you refine the design of your stunning 3D button, it's essential to prioritize performance to ensure a seamless and efficient user experience. Optimizing your CSS code and considering performance implications contribute to faster page load times and a more responsive website. Let's explore key strategies for optimizing the performance of your 3D button: - CSS Minification: Minify your CSS code by removing unnecessary whitespace, comments, and redundant code. This reduces file size, leading to quicker downloads for users. - Use of CSS Sprites: Combine multiple images or icons into a single sprite sheet. This reduces the number of server requests, enhancing loading speed, especially for users with slower internet connections. - Lazy Loading: If your 3D button includes images or additional resources, implement lazy loading. This technique defers the loading of non-essential assets until they are needed, improving initial page load times. Now, let's delve into the details with a breakdown of strategies and their implementation: Strategy Implementation CSS Minification: Use online tools or build processes to minify your CSS file. Additionally, consider utilizing CSS minification plugins if you're using a content management system (CMS). CSS Sprites: Create a sprite sheet that combines multiple images into a single file. Update your CSS to use background-position to display the appropriate image for your 3D button. Lazy Loading: Add the 'loading' attribute to your image tags or use JavaScript-based lazy loading libraries. This ensures that images are loaded only when they come into the user's viewport. Optimizing for performance is not only about improving user experience but also positively impacting search engine rankings. Search engines favor fast-loading websites, and optimizing your 3D button contributes to the overall speed of your web pages. Regularly test your website's performance using tools like PageSpeed Insights to identify potential bottlenecks and implement further optimizations. By prioritizing performance, you ensure that your 3D button remains a visually impressive element without compromising the speed and efficiency of your website.
FAQ
Explore common questions related to creating stunning 3D buttons with CSS: Q: Can I apply 3D effects to any button on my website? A: Absolutely! The techniques shared in this blog post can be applied to any button element on your website. Just ensure that you have a clear understanding of the HTML structure and CSS styles of the button you want to enhance. Q: Will these 3D buttons work on mobile devices? A: Yes, they can! By implementing responsive design considerations, such as fluid layouts and touch-friendly styling, you can ensure that your 3D buttons look great and function seamlessly across various devices, including mobile. Q: How can I further customize the hover effects? A: The hover effects discussed in the blog post are just a starting point. Feel free to experiment with different CSS properties, transitions, and transformations to customize the hover effects according to your design preferences. Regular testing and iteration are key. Q: Are there any performance considerations for 3D buttons? A: Yes, optimizing for performance is crucial. Consider strategies like CSS minification, the use of CSS sprites, and lazy loading to ensure that your 3D buttons contribute to a fast and efficient user experience without compromising visual appeal. Q: Can I use these techniques in combination with other CSS frameworks? A: Certainly! The techniques shared in this blog post are applicable within the context of various CSS frameworks. Whether you're using Bootstrap, Foundation, or any other framework, you can adapt the provided concepts to enhance your 3D buttons. Feel free to experiment with these tips and adapt them to your specific project requirements. If you have additional questions, don't hesitate to reach out for further guidance.
Conclusion
Congratulations on embarking on the journey to create a stunning 3D button with CSS! Throughout this blog post, we've explored the various aspects of designing and implementing a visually appealing and interactive 3D button for your website. Let's recap the key takeaways: - Visual Impact: 3D buttons contribute to the visual appeal of your website, enhancing user engagement and providing a modern aesthetic. - Foundational Steps: Starting with a solid foundation in CSS, we built the structure of the button, added depth and shadows, and considered responsive design for a seamless experience across devices. - Hover Effects and Animations: Implementing dynamic hover effects and subtle animations brings your 3D button to life, creating a more interactive user experience. - Performance Optimization: Prioritizing performance through CSS minification, the use of sprites, and lazy loading ensures that your 3D button remains both impressive and efficient. - FAQ: Addressing common questions about 3D buttons, we provided insights into customization, mobile responsiveness, hover effects, performance considerations, and compatibility with CSS frameworks. As you integrate these techniques into your web design projects, remember to balance creativity with usability. Read the full article
0 notes
Photo

Vintage Blue Buttons | Yin Yang Buttons | Royal Electric Blue | Antique Buttons | Plastic Buttons 20mm Buttons | Set of 6 Blue Buttons #bluevintagebuttons #antiquebuttons #vintagebuttons #yinyangbuttons #bluebuttons #electricroyalblue #3dbuttons #coffeebeanbuttons #sewingbuttons #craftbuttons https://www.instagram.com/p/CC091B-JmK3/?igshid=3q54f1kfvghq
#bluevintagebuttons#antiquebuttons#vintagebuttons#yinyangbuttons#bluebuttons#electricroyalblue#3dbuttons#coffeebeanbuttons#sewingbuttons#craftbuttons
0 notes
Link
В этом уроке я покажу вам как сделать объемную 3D-кнопку на HTML и CSS. Мы используем transition, transform, box-shadow и hover.
1 note
·
View note
Note
Math report!
I don't have much to show, sorry. First, I spent most of a day working on this:
data:text/html,%3Chtml%3E%3Chead%3E%3Cstyle type%3Dtext%2Fcss%3Elabel%2Ctextarea%7Bdisplay%3Ablock%7Dtextarea%7Bwidth%3A100%25%3Bheight%3A20em%7D%3C%2Fstyle%3E%3Ctitle%3EDeck Calculator%3C%2Ftitle%3E%3C%2Fhead%3E%3Cbody%3E%3Clabel%3EAmount of land%3A %3Cinput type%3Dnumber min%3D0 max%3D60 value%3D15 id%3Dlands%3E%3C%2Finput%3E%3C%2Flabel%3E%3Clabel%3EAmount of spells%3A %3Cinput type%3Dnumber min%3D0 max%3D60 value%3D45 id%3Dspells%3E%3C%2Finput%3E%3C%2Flabel%3E%3Clabel%3EDeck size%3A %3Cinput type%3Dnumber min%3D0 value%3D60 id%3Ddeck%3E%3C%2Finput%3E%3C%2Flabel%3E%3Clabel%3ERequired lands%3A %3Cinput type%3Dnumber min%3D0 max%3D7 value%3D2 id%3Dflood%3E%3C%2Finput%3E%3C%2Flabel%3E%3Clabel%3ERequired spells%3A %3Cinput type%3Dnumber min%3D0 max%3D7 value%3D1 id%3Dscrew%3E%3C%2Finput%3E%3C%2Flabel%3E%3Clabel%3EHand size%3A %3Cinput type%3Dnumber min%3D0 max%3D7 value%3D7 id%3Dhand%3E%3C%2Finput%3E%3C%2Flabel%3E%3Cinput type%3Dbutton id%3Ddo value%3DCalculate%3E%3C%2Finput%3E%3Ctextarea id%3Dresult%3E%3C%2Ftextarea%3E%3C%2Fbody%3E%3Cscript type%3Dtext%2Fjavascript%3E(function(a%2Cb%2Cc%2Cd%2Ce%2Cf%2Cg%2Ch%2Ci%2Cj%2Ck%2Cl%2Cm%2Cn%2Co%2Cp%2Cq%2Cr%2Cs%2Ct%2Cu%2Cv%2Cw%2Cx%2Cy%2Cz)%7Bthis.lands.onchange%3Dthis.spells.onchange%3Dfunction(a)%7B(a.target%3D%3Dthis.lands%3Fthis.spells%3Athis.lands).value%3D%2Bthis.deck.value-a.target.value%3B%7D.bind(this)%3Bthis.deck.onchange%3Dfunction(a%2Cb%2Cc%2Cd%2Ce%2Cf%2Cg)%7Bthis.lands.max%3Dthis.spells.max%3Dthis.hand.max%3Da%3D%2Ba.target.value%3Bif(this.hand.value%3Ea)%7Bthis.hand.value%3Da%3B%7D%3Bb%3D%2Bthis.lands.value%3Bc%3D%2Bthis.spells.value%3Ba-%3D(d%3Db%2Bc)%3Bb%2F%3Dd%3Bb*%3Da%3Bc%3Da-b%3Bif(b%3Cc)%7Bb%3DMath.ceil(b)%3Bc%3DMath.floor(c)%3B%7Delse%7Bb%3DMath.ceil(b)%3Bc%3DMath.floor(c)%3B%7D%3Bthis.lands.value%3D%2Bthis.lands.value%2Bb%3Bthis.spells.value%3D%2Bthis.spells.value%2Bc%3B%7D.bind(this)%3Bthis.flood.onchange%3Dthis.screw.onchange%3Dfunction(a%2Cb%2Cc%2Cd%2Ce)%7Bb%3D(a%3Da.target)%3D%3Dthis.flood%3Fthis.screw%3Athis.flood%3Bif(%2Bthis.hand.value%3C%2Ba.value%2B %2Bb.value)%7Bb.value%3D0%2Bthis.hand.value-a.value%3B%7D%3B%7D.bind(this)%3Bthis.hand.onchange%3Dfunction(a)%7Bthis.flood.max%3Dthis.screw.max%3Da.target.value%3B%7D.bind(this)%3Bdocument.getElementById("do").onclick%3Dfunction(a%2Cb%2Cc%2Cd%2Ce%2Cf%2Cg%2Ch%2Ci%2Cj%2Ck%2Cl%2Cm%2Cn%2Co)%7Ba%3D%5B%5B%5B0%2C0%5D%5D%5D%3Bb%3D-1%3Bwhile(%2B%2Bb%3Cthis.hand.value)%7Ba.push(c%3D%5B%5D)%3Bd%3D-1%3Bwhile(%2B%2Bd%3Ca%5Bb%5D.length)%7Be%3D-1%3Bwhile(%2B%2Be%3Cthis.deck.value-b)%7Bc.push(f%3D%5B%5D)%3Bf%5B0%5D%3Da%5Bb%5D%5Bd%5D%5B0%5D%2B(g%3D(e%2Ba%5Bb%5D%5Bd%5D%5B0%5D%3Cthis.lands.value)%3F1%3A0)%3Bf%5B1%5D%3Da%5Bb%5D%5Bd%5D%5B1%5D%2B(!g%3F1%3A0)%3B%7D%3B%7D%3B%7D%3Bthis.result.value%3Da%5Ba.length-1%5D.map(function(a)%7Breturn a.join("-")%3B%7D).join("%2C ")%3B%7D.bind(this)%3B%7D.bind(%7Bhand%3Adocument.getElementById("hand")%2Clands%3Adocument.getElementById("lands")%2Cresult%3Adocument.getElementById("result")%2Cspells%3Adocument.getElementById("spells")%2Cdeck%3Adocument.getElementById("deck")%2Cflood%3Adocument.getElementById("flood")%2Cscrew%3Adocument.getElementById("screw")%2C%7D))()%3B%3C%2Fscript%3E%3C%2Fhtml%3E
Encoded like that because Tumblr won't let me post the actual .htm file. Probably wise. Anyways, that's a generator that will output all possible hands out of a deck of two different cards, for configurable deck sizes and proportions, as well as hand sizes.
It works! For small decks, I can confirm the permutations are correct, and nothing in the logic should suddenly be different as you go up. The combinatorials grow rather fast, though: for 60 it just refuses. Out Of Memory. Still, feel free to try it if your computer is much better than mine.
The "required" inputs do nothing, except a token effort to stay within bounds. That was going to be for the actual analysis, naturally I never got around to implement any of that.
Then I cheated! I consulted with my brother, who actually studied mathematics. He explained some of the reasons why what I did was so ridiculously overkill, and went ahead and solved the first and easiest question. If literally all we care about is drawing two lands and one spell, the ideal proportion is 35/25, giving us .965294 odds (after up to 4 mulligans). That's not true for Surging Flame, but if you ever find a deck that has only that concern, feel free to use that result.
For the record, my original suggestion of 15/45 would give .566134, which is not good, but not as terrible as one may expect. Mulligans in this game are very forgiving.
The other consideration for the Surging Flame deck is not fizzling on the ripple triggers, which amounts to the same question again, with a hand size of four and a deck size of (variable, depending on mulligans taken and draw/play result) and a deck composition of (very variable, depending on exact cards from previous). He had some insights to how that should be mathematically represented, but no actual solution.
For my part I'm tempted to just construct a script that iterates the simplified question, using the formula he showed me, and hope my pc can handle that much at least. Hammer, nails, etc.
That leaves the pure maths and brings us to metagame concerns! I did remember those 3. They don't matter; nothing Initiate or green Chancellor can do against Flame, nothing Flame can do against blue Chancellor.
Interestingly, we could defeat blue if you allow the deck size to go up to 61. All it takes is mulligan down to 2 on the play, 1 on the draw, and then being ridiculously lucky on the mill and draw(s). Since we'd have to make that choice before knowing what the oponent is playing, it would have to be amazingly dominant in the metagame for that to be a valid option.
(In that hypothetical metagame, I would like to revert to my original suggestion for this challenge. Kindle absolutely destroys chancellor).
Back to Flame, the possibility of going on the draw against Kor Firewalker means we may need to cast twenty spells, so we're not willing to go lower. Really that sets the absolute minimum at 26, so we're not tempted to mulligan a 2 mountains land out of fear of ending up with 18 in the deck.
The other one I thought would be a problem is Aegis of the Gods (and the new anti-dungeon Aegis, whose name I forget), which could become meta if there's dominance of anything that targets players but can't deal with creatures, like Tasha. On second thought, though, no biggie. You wait to have four lands and two spells in hand, you spend one plus a few from the deck on clearing the field, then the other from your hand and the rest of your deck on the kill.
Drannith Magistrate is a difficult match, but not technically invincible. You just need to kill them all before killing the opponent. At three toughness, that means casting twice as many spells as the oponent, in total over the game, then one more. And they don't actually need to waste all our Flames, just enough of them that there are 8 or fewer in the deck when we finally can target them; at which point we have removed some stuff so they can just wait for us to deck out. So it mostly comes down to spell density, and then the luck of the draw on a per-game basis.
Still, assuming it's a winnable match, that brings another interesting point of decision: the ripple triggers are still resolving, even if you cast nothing, and then you put everything on the bottom in the order of your choice. You should separate Flames as much as possible, of course, to help future ripples go off. But also there may be a game where you loop through the entire deck. Is this the kind of format where you're allowed to take notes, such as for example the order of your entire deck as you scry away? Because there may come a time where you want to cast a Flame on your upkeep, to draw the 5th card rather than the 1st!
And then there's Meddling Mage, which is the most interesting and also the most dissapointing. What beats it, anyways? Is any manland worth running 60x?
Anyways, my first (and only) answer is "pretend we're another mono-red deck". I still insist we're the most aggresive mulliganers in the format, which means that's what gives us away. So I would have to do the ridiculous calculation 5 times, for each amount of available mulligan, find the optimal deck composition for each, and then check tournament reports to see what other monored decks are doing, so we can bring in the right percentage.
Does Wizards even publish that? As part of event coverage or whatever.
The dissapointing part is that, while that is complex and interesting, I doubt it actually matters. Flame is probably the most dangerous single spell; I think Mage just names it first always, no? You can survive two Bolts or Devils, then name that next turn. Maybe if they kept a one-Mage hand they will have to think about it, but even then, you can survive the other things and hope to top-deck your second Mage. Unless and until a more dangerous "mountain, pass" deck is found, I do believe this matchup is just the coin-toss.
Edited to add: The code still works. I was afraid tumblr would mess it up in some way, but no: you can copy that and paste it in the address bar of the browser of your choice. Not that you should trust random code from the internet, mind you. But you can.
Given that we already have Llanowar Elves, Fyndhorn Elves, and Elvish Mystic, would you print a 4th 1-mana 1/1 green creature that taps for G, and if so would that be a good candidate for the "any number in your deck" mechanic?
Unlikely.
#mtg#theorycrafting#mathematics#for the record i studied philosophy#my recommendation is don't do that kids
83 notes
·
View notes
Link
✅ $175.00 https://ift.tt/35wPtCw
0 notes
Text
0 notes
Link
Net neutrality is the freedom to say, watch and make what we want online without interference from internet service providers. Two years ago, after ...
0 notes